Compare commits

..

74 Commits

Author SHA1 Message Date
hank
c01bfd9332 New translations en.po (Arabic) 2025-04-23 13:19:56 -04:00
hank
209e82aed2 New translations en.po (Dutch) 2025-04-14 09:04:03 -04:00
hank
c66e740d52 New translations en.po (Arabic) 2025-04-05 21:52:03 -04:00
hank
551ae49c2e New translations en.po (French) 2025-03-28 17:04:47 -04:00
hank
906daa6f2a New translations en.po (French) 2025-03-26 06:03:01 -04:00
hank
49e55943c1 New translations en.po (Russian) 2025-03-25 04:32:17 -04:00
hank
9e75cbc1ef New translations en.po (Italian) 2025-03-22 11:29:03 -04:00
hank
79190a2c51 New translations en.po (Norwegian) 2025-03-17 09:40:03 -04:00
hank
32960c7c35 New translations en.po (Chinese Simplified) 2025-03-15 04:13:35 -04:00
hank
cdff974a8a New translations en.po (Ukrainian) 2025-03-15 00:14:37 -04:00
hank
20a6ef129c New translations en.po (Czech) 2025-03-13 20:50:03 -04:00
hank
d1e5310f83 New translations en.po (Japanese) 2025-03-13 06:13:10 -04:00
hank
152173eab5 New translations en.po (Korean) 2025-03-07 05:06:11 -05:00
hank
c2aec69638 New translations en.po (Ukrainian) 2025-03-06 07:37:37 -05:00
hank
16c97fe77b New translations en.po (Chinese Traditional, Hong Kong) 2025-03-06 02:27:48 -05:00
hank
bed5bc2791 New translations en.po (Croatian) 2025-03-06 02:27:47 -05:00
hank
424c7aceff New translations en.po (Persian) 2025-03-06 02:27:46 -05:00
hank
8eb101e714 New translations en.po (Vietnamese) 2025-03-06 02:27:45 -05:00
hank
f2e69e2a80 New translations en.po (Chinese Traditional) 2025-03-06 02:27:44 -05:00
hank
41b4dbce98 New translations en.po (Chinese Simplified) 2025-03-06 02:27:43 -05:00
hank
c3432fc7b5 New translations en.po (Ukrainian) 2025-03-06 02:27:42 -05:00
hank
b167244e28 New translations en.po (Turkish) 2025-03-06 02:27:40 -05:00
hank
bcca6a5a9d New translations en.po (Swedish) 2025-03-06 02:27:39 -05:00
hank
6b661b4878 New translations en.po (Slovenian) 2025-03-06 02:27:37 -05:00
hank
bc537edb73 New translations en.po (Russian) 2025-03-06 02:27:36 -05:00
hank
561a3e8aaf New translations en.po (Polish) 2025-03-06 02:27:34 -05:00
hank
f173ea37da New translations en.po (Norwegian) 2025-03-06 02:27:33 -05:00
hank
0d9f2ba06a New translations en.po (Dutch) 2025-03-06 02:27:32 -05:00
hank
4e772e6008 New translations en.po (Korean) 2025-03-06 02:27:31 -05:00
hank
b959d97502 New translations en.po (Italian) 2025-03-06 02:27:30 -05:00
hank
735cbe2cf0 New translations en.po (German) 2025-03-06 02:27:29 -05:00
hank
0f5a470495 New translations en.po (Danish) 2025-03-06 02:27:28 -05:00
hank
a42e99370e New translations en.po (Czech) 2025-03-06 02:27:27 -05:00
hank
abfae78af1 New translations en.po (Bulgarian) 2025-03-06 02:27:26 -05:00
hank
e36c40c4a9 New translations en.po (Arabic) 2025-03-06 02:27:25 -05:00
hank
bf7b2ae598 New translations en.po (Spanish) 2025-03-06 02:27:24 -05:00
hank
f71ee4b058 New translations en.po (French) 2025-03-06 02:27:23 -05:00
hank
f2466eb37d New translations en.po (Hungarian) 2025-03-06 02:27:22 -05:00
hank
7244c7130b New translations en.po (Japanese) 2025-03-06 02:27:21 -05:00
hank
f2e84a9d3e New translations en.po (Portuguese) 2025-03-06 02:27:20 -05:00
hank
04a1ee5e4e New translations en.po (Icelandic) 2025-03-06 02:27:19 -05:00
hank
9b83088897 New translations en.po (Norwegian) 2025-03-05 15:49:42 -05:00
hank
13b30aa255 New translations en.po (Russian) 2025-03-01 13:24:35 -05:00
hank
2bd25e9e8d New translations en.po (Ukrainian) 2025-03-01 08:20:09 -05:00
hank
4fe192bf28 New translations en.po (Ukrainian) 2025-03-01 07:11:52 -05:00
hank
2056ae285f New translations en.po (Spanish) 2025-02-28 12:20:35 -05:00
hank
a02e7a0a69 New translations en.po (Spanish) 2025-02-28 11:07:32 -05:00
hank
b1a9e90034 New translations en.po (Chinese Traditional, Hong Kong) 2025-02-27 17:31:32 -05:00
hank
20916fab3e New translations en.po (Croatian) 2025-02-27 17:31:31 -05:00
hank
0c777cca72 New translations en.po (Persian) 2025-02-27 17:31:31 -05:00
hank
44e30ad429 New translations en.po (Vietnamese) 2025-02-27 17:31:30 -05:00
hank
9e30786dda New translations en.po (Chinese Traditional) 2025-02-27 17:31:29 -05:00
hank
1f677773e7 New translations en.po (Chinese Simplified) 2025-02-27 17:31:28 -05:00
hank
882289da91 New translations en.po (Ukrainian) 2025-02-27 17:31:26 -05:00
hank
fbbc4eff27 New translations en.po (Turkish) 2025-02-27 17:31:25 -05:00
hank
b78231f677 New translations en.po (Swedish) 2025-02-27 17:31:24 -05:00
hank
332e2d14a9 New translations en.po (Slovenian) 2025-02-27 17:31:23 -05:00
hank
e088b88c84 New translations en.po (Russian) 2025-02-27 17:31:22 -05:00
hank
09840f95d9 New translations en.po (Polish) 2025-02-27 17:31:21 -05:00
hank
de03bb658a New translations en.po (Norwegian) 2025-02-27 17:31:19 -05:00
hank
bcadfeb729 New translations en.po (Dutch) 2025-02-27 17:31:18 -05:00
hank
ec582a9171 New translations en.po (Korean) 2025-02-27 17:31:17 -05:00
hank
0c3eaefc90 New translations en.po (Italian) 2025-02-27 17:31:16 -05:00
hank
d6b5866f90 New translations en.po (German) 2025-02-27 17:31:15 -05:00
hank
2ba629e4b4 New translations en.po (Danish) 2025-02-27 17:31:14 -05:00
hank
6e9341b7ff New translations en.po (Czech) 2025-02-27 17:31:13 -05:00
hank
89499a341b New translations en.po (Bulgarian) 2025-02-27 17:31:12 -05:00
hank
9c88845798 New translations en.po (Arabic) 2025-02-27 17:31:10 -05:00
hank
c9f65f63e6 New translations en.po (Spanish) 2025-02-27 17:31:09 -05:00
hank
996620c8e0 New translations en.po (French) 2025-02-27 17:31:08 -05:00
hank
626c1358d9 New translations en.po (Hungarian) 2025-02-27 17:31:07 -05:00
hank
19dd39b7db New translations en.po (Japanese) 2025-02-27 17:31:06 -05:00
hank
d482b50e31 New translations en.po (Portuguese) 2025-02-27 17:31:05 -05:00
hank
f61ec49c76 New translations en.po (Icelandic) 2025-02-27 17:31:03 -05:00
98 changed files with 8463 additions and 9317 deletions

3
.gitignore vendored
View File

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

View File

@@ -14,10 +14,6 @@ clean:
lint:
golangci-lint run
test: export GOEXPERIMENT=synctest
test:
go test -tags=testing ./...
tidy:
go mod tidy

View File

@@ -7,63 +7,50 @@ import (
"fmt"
"log"
"os"
"strings"
"golang.org/x/crypto/ssh"
)
// cli options
type cmdOptions struct {
key string // key is the public key(s) for SSH authentication.
listen string // listen is the address or port to listen on.
key string // key is the public key(s) for SSH authentication.
addr string // addr is the address or port to listen on.
}
// parse parses the command line flags and populates the config struct.
// It returns true if a subcommand was handled and the program should exit.
func (opts *cmdOptions) parse() bool {
// parseFlags parses the command line flags and populates the config struct.
func (opts *cmdOptions) parseFlags() {
flag.StringVar(&opts.key, "key", "", "Public key(s) for SSH authentication")
flag.StringVar(&opts.listen, "listen", "", "Address or port to listen on")
flag.StringVar(&opts.addr, "addr", "", "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:")
fmt.Printf("Usage: %s [options] [subcommand]\n", os.Args[0])
fmt.Println("\nOptions:")
flag.PrintDefaults()
fmt.Println("\nSubcommands:")
fmt.Println(" version Display the version")
fmt.Println(" help Display this help message")
fmt.Println(" update Update the agent to the latest version")
}
}
subcommand := ""
if len(os.Args) > 1 {
subcommand = os.Args[1]
// handleSubcommand handles subcommands such as version, help, and update.
// It returns true if a subcommand was handled, false otherwise.
func handleSubcommand() bool {
if len(os.Args) <= 1 {
return false
}
switch subcommand {
case "-v", "version":
switch os.Args[1] {
case "version", "-v":
fmt.Println(beszel.AppName+"-agent", beszel.Version)
return true
os.Exit(0)
case "help":
flag.Usage()
return true
os.Exit(0)
case "update":
agent.Update()
return true
case "health":
// for health, we need to parse flags first to get the listen address
args := append(os.Args[2:], subcommand)
flag.CommandLine.Parse(args)
addr := opts.getAddress()
network := agent.GetNetwork(addr)
err := agent.Health(addr, network)
if err != nil {
log.Fatal(err)
}
fmt.Print("ok")
return true
os.Exit(0)
}
flag.Parse()
return false
}
@@ -92,18 +79,46 @@ func (opts *cmdOptions) loadPublicKeys() ([]ssh.PublicKey, error) {
return agent.ParseKeys(string(pubKey))
}
// getAddress gets the address to listen on from the command line flag, environment variable, or default value.
func (opts *cmdOptions) getAddress() string {
return agent.GetAddress(opts.listen)
// Try command line flag first
if opts.addr != "" {
return opts.addr
}
// Try environment variables
if addr, ok := agent.GetEnv("ADDR"); ok && addr != "" {
return addr
}
// Legacy PORT environment variable support
if port, ok := agent.GetEnv("PORT"); ok && port != "" {
return port
}
return ":45876"
}
// getNetwork returns the network type to use for the server.
func (opts *cmdOptions) getNetwork() string {
if network, _ := agent.GetEnv("NETWORK"); network != "" {
return network
}
if strings.HasPrefix(opts.addr, "/") {
return "unix"
}
return "tcp"
}
func main() {
var opts cmdOptions
subcommandHandled := opts.parse()
opts.parseFlags()
if subcommandHandled {
if handleSubcommand() {
return
}
flag.Parse()
opts.addr = opts.getAddress()
var serverConfig agent.ServerOptions
var err error
serverConfig.Keys, err = opts.loadPublicKeys()
@@ -111,9 +126,8 @@ func main() {
log.Fatal("Failed to load public keys:", err)
}
addr := opts.getAddress()
serverConfig.Addr = addr
serverConfig.Network = agent.GetNetwork(addr)
serverConfig.Addr = opts.addr
serverConfig.Network = opts.getNetwork()
agent := agent.NewAgent()
if err := agent.StartServer(serverConfig); err != nil {

View File

@@ -1,7 +1,6 @@
package main
import (
"beszel/internal/agent"
"crypto/ed25519"
"flag"
"os"
@@ -28,22 +27,22 @@ func TestGetAddress(t *testing.T) {
{
name: "use address from flag",
opts: cmdOptions{
listen: "8080",
addr: "8080",
},
expected: ":8080",
expected: "8080",
},
{
name: "use unix socket from flag",
opts: cmdOptions{
listen: "/tmp/beszel.sock",
addr: "/tmp/beszel.sock",
},
expected: "/tmp/beszel.sock",
},
{
name: "use LISTEN env var",
name: "use ADDR env var",
opts: cmdOptions{},
envVars: map[string]string{
"LISTEN": "1.2.3.4:9090",
"ADDR": "1.2.3.4:9090",
},
expected: "1.2.3.4:9090",
},
@@ -53,26 +52,26 @@ func TestGetAddress(t *testing.T) {
envVars: map[string]string{
"PORT": "7070",
},
expected: ":7070",
expected: "7070",
},
{
name: "use unix socket from env var",
opts: cmdOptions{
listen: "",
addr: "",
},
envVars: map[string]string{
"LISTEN": "/tmp/beszel.sock",
"ADDR": "/tmp/beszel.sock",
},
expected: "/tmp/beszel.sock",
},
{
name: "flag takes precedence over env vars",
opts: cmdOptions{
listen: ":8080",
addr: ":8080",
},
envVars: map[string]string{
"LISTEN": ":9090",
"PORT": "7070",
"ADDR": ":9090",
"PORT": "7070",
},
expected: ":8080",
},
@@ -202,27 +201,27 @@ func TestGetNetwork(t *testing.T) {
},
{
name: "only port",
opts: cmdOptions{listen: "8080"},
opts: cmdOptions{addr: "8080"},
expected: "tcp",
},
{
name: "ipv4 address",
opts: cmdOptions{listen: "1.2.3.4:8080"},
opts: cmdOptions{addr: "1.2.3.4:8080"},
expected: "tcp",
},
{
name: "ipv6 address",
opts: cmdOptions{listen: "[2001:db8::1]:8080"},
opts: cmdOptions{addr: "[2001:db8::1]:8080"},
expected: "tcp",
},
{
name: "unix network",
opts: cmdOptions{listen: "/tmp/beszel.sock"},
opts: cmdOptions{addr: "/tmp/beszel.sock"},
expected: "unix",
},
{
name: "env var network",
opts: cmdOptions{listen: ":8080"},
opts: cmdOptions{addr: ":8080"},
envVars: map[string]string{"NETWORK": "tcp4"},
expected: "tcp4",
},
@@ -234,7 +233,7 @@ func TestGetNetwork(t *testing.T) {
for k, v := range tt.envVars {
t.Setenv(k, v)
}
network := agent.GetNetwork(tt.opts.listen)
network := tt.opts.getNetwork()
assert.Equal(t, tt.expected, network)
})
}
@@ -257,32 +256,32 @@ func TestParseFlags(t *testing.T) {
name: "no flags",
args: []string{"cmd"},
expected: cmdOptions{
key: "",
listen: "",
key: "",
addr: "",
},
},
{
name: "key flag only",
args: []string{"cmd", "-key", "testkey"},
expected: cmdOptions{
key: "testkey",
listen: "",
key: "testkey",
addr: "",
},
},
{
name: "addr flag only",
args: []string{"cmd", "-listen", ":8080"},
args: []string{"cmd", "-addr", ":8080"},
expected: cmdOptions{
key: "",
listen: ":8080",
key: "",
addr: ":8080",
},
},
{
name: "both flags",
args: []string{"cmd", "-key", "testkey", "-listen", ":8080"},
args: []string{"cmd", "-key", "testkey", "-addr", ":8080"},
expected: cmdOptions{
key: "testkey",
listen: ":8080",
key: "testkey",
addr: ":8080",
},
},
}
@@ -294,7 +293,7 @@ func TestParseFlags(t *testing.T) {
os.Args = tt.args
var opts cmdOptions
opts.parse()
opts.parseFlags()
flag.Parse()
assert.Equal(t, tt.expected, opts)

View File

@@ -1,99 +1,10 @@
package main
import (
"beszel"
"beszel/internal/hub"
_ "beszel/migrations"
"fmt"
"log"
"net/http"
"os"
"time"
"github.com/pocketbase/pocketbase"
"github.com/pocketbase/pocketbase/plugins/migratecmd"
"github.com/spf13/cobra"
)
func main() {
// handle health check first to prevent unneeded execution
if len(os.Args) > 3 && os.Args[1] == "health" {
url := os.Args[3]
if err := checkHealth(url); err != nil {
log.Fatal(err)
}
fmt.Print("ok")
return
}
baseApp := getBaseApp()
h := hub.NewHub(baseApp)
if err := h.StartHub(); err != nil {
log.Fatal(err)
}
}
// getBaseApp creates a new PocketBase app with the default config
func getBaseApp() *pocketbase.PocketBase {
isDev := os.Getenv("ENV") == "dev"
baseApp := pocketbase.NewWithConfig(pocketbase.Config{
DefaultDataDir: beszel.AppName + "_data",
DefaultDev: isDev,
})
baseApp.RootCmd.Version = beszel.Version
baseApp.RootCmd.Use = beszel.AppName
baseApp.RootCmd.Short = ""
// add update command
baseApp.RootCmd.AddCommand(&cobra.Command{
Use: "update",
Short: "Update " + beszel.AppName + " to the latest version",
Run: hub.Update,
})
// add health command
baseApp.RootCmd.AddCommand(newHealthCmd())
// enable auto creation of migration files when making collection changes in the Admin UI
migratecmd.MustRegister(baseApp, baseApp.RootCmd, migratecmd.Config{
Automigrate: isDev,
Dir: "../../migrations",
})
return baseApp
}
func newHealthCmd() *cobra.Command {
var baseURL string
healthCmd := &cobra.Command{
Use: "health",
Short: "Check health of running hub",
Run: func(cmd *cobra.Command, args []string) {
if err := checkHealth(baseURL); err != nil {
log.Fatal(err)
}
os.Exit(0)
},
}
healthCmd.Flags().StringVar(&baseURL, "url", "", "base URL")
healthCmd.MarkFlagRequired("url")
return healthCmd
}
// checkHealth checks the health of the hub.
func checkHealth(baseURL string) error {
client := &http.Client{
Timeout: time.Second * 3,
}
healthURL := baseURL + "/api/health"
resp, err := client.Get(healthURL)
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode != 200 {
return fmt.Errorf("%s returned status %d", healthURL, resp.StatusCode)
}
return nil
hub.NewHub().Run()
}

View File

@@ -8,39 +8,39 @@ require (
github.com/gliderlabs/ssh v0.3.8
github.com/goccy/go-json v0.10.5
github.com/pocketbase/dbx v1.11.0
github.com/pocketbase/pocketbase v0.25.9
github.com/pocketbase/pocketbase v0.25.0
github.com/rhysd/go-github-selfupdate v1.2.3
github.com/shirou/gopsutil/v4 v4.25.2
github.com/shirou/gopsutil/v4 v4.25.1
github.com/spf13/cast v1.7.1
github.com/spf13/cobra v1.9.1
github.com/spf13/cobra v1.8.1
github.com/stretchr/testify v1.10.0
golang.org/x/crypto v0.35.0
golang.org/x/exp v0.0.0-20250228200357-dead58393ab7
golang.org/x/crypto v0.32.0
golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c
gopkg.in/yaml.v3 v3.0.1
)
require (
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be // indirect
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
github.com/aws/aws-sdk-go-v2 v1.36.3 // indirect
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10 // indirect
github.com/aws/aws-sdk-go-v2/config v1.29.8 // indirect
github.com/aws/aws-sdk-go-v2/credentials v1.17.61 // indirect
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 // indirect
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.64 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 // indirect
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.6.2 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.15 // indirect
github.com/aws/aws-sdk-go-v2/service/s3 v1.78.0 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.25.0 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.29.0 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.33.16 // indirect
github.com/aws/smithy-go v1.22.3 // indirect
github.com/aws/aws-sdk-go-v2 v1.36.1 // indirect
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.8 // indirect
github.com/aws/aws-sdk-go-v2/config v1.29.6 // indirect
github.com/aws/aws-sdk-go-v2/credentials v1.17.59 // indirect
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.28 // indirect
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.59 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.32 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.32 // indirect
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.2 // indirect
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.32 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.2 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.5.6 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.13 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.13 // indirect
github.com/aws/aws-sdk-go-v2/service/s3 v1.75.4 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.24.15 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.14 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.33.14 // indirect
github.com/aws/smithy-go v1.22.2 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/disintegration/imaging v1.6.2 // indirect
github.com/domodwyer/mailyak/v3 v3.6.2 // indirect
@@ -59,7 +59,7 @@ require (
github.com/googleapis/gax-go/v2 v2.14.1 // indirect
github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/lufia/plan9stats v0.0.0-20250224150550-a661cff19cfb // indirect
github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 // indirect
github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/ncruces/go-strftime v0.1.9 // indirect
@@ -75,18 +75,19 @@ require (
go.opencensus.io v0.24.0 // indirect
gocloud.dev v0.40.0 // indirect
golang.org/x/image v0.24.0 // indirect
golang.org/x/net v0.35.0 // indirect
golang.org/x/oauth2 v0.27.0 // indirect
golang.org/x/net v0.34.0 // indirect
golang.org/x/oauth2 v0.26.0 // indirect
golang.org/x/sync v0.11.0 // indirect
golang.org/x/sys v0.30.0 // indirect
golang.org/x/term v0.29.0 // indirect
golang.org/x/text v0.22.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
google.golang.org/api v0.223.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250227231956-55c901821b1e // indirect
google.golang.org/api v0.220.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250204164813-702378808489 // indirect
google.golang.org/grpc v1.70.0 // indirect
google.golang.org/protobuf v1.36.5 // indirect
modernc.org/libc v1.61.13 // indirect
google.golang.org/protobuf v1.36.4 // indirect
modernc.org/libc v1.55.3 // indirect
modernc.org/mathutil v1.7.1 // indirect
modernc.org/memory v1.8.2 // indirect
modernc.org/sqlite v1.35.0 // indirect
modernc.org/sqlite v1.34.5 // indirect
)

View File

@@ -1,8 +1,8 @@
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.115.0 h1:CnFSK6Xo3lDYRoBKEcAtia6VSC837/ZkJuRduSFnr14=
cloud.google.com/go v0.115.0/go.mod h1:8jIM5vVgoAEoiVxQ/O4BFTfHqulPZgs/ufEzMcFMdWU=
cloud.google.com/go/auth v0.15.0 h1:Ly0u4aA5vG/fsSsxu98qCQBemXtAtJf+95z9HK+cxps=
cloud.google.com/go/auth v0.15.0/go.mod h1:WJDGqZ1o9E9wKIL+IwStfyn/+s59zl4Bi+1KQNVXLZ8=
cloud.google.com/go/auth v0.14.1 h1:AwoJbzUdxA/whv1qj3TLKwh3XX5sikny2fc40wUl+h0=
cloud.google.com/go/auth v0.14.1/go.mod h1:4JHUxlGXisL0AW8kXPtUF6ztuOksyfUQNFjfsOCXkPM=
cloud.google.com/go/auth/oauth2adapt v0.2.7 h1:/Lc7xODdqcEw8IrZ9SvwnlLX6j9FHQM74z6cBk9Rw6M=
cloud.google.com/go/auth/oauth2adapt v0.2.7/go.mod h1:NTbTTzfvPl1Y3V1nPpOgl2w6d/FjO7NNUQaWSox6ZMc=
cloud.google.com/go/compute v1.14.0 h1:hfm2+FfxVmnRlh6LpB7cg1ZNU+5edAHmW679JePztk0=
@@ -22,44 +22,44 @@ github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3d
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU=
github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
github.com/aws/aws-sdk-go-v2 v1.36.3 h1:mJoei2CxPutQVxaATCzDUjcZEjVRdpsiiXi2o38yqWM=
github.com/aws/aws-sdk-go-v2 v1.36.3/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10 h1:zAybnyUQXIZ5mok5Jqwlf58/TFE7uvd3IAsa1aF9cXs=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10/go.mod h1:qqvMj6gHLR/EXWZw4ZbqlPbQUyenf4h82UQUlKc+l14=
github.com/aws/aws-sdk-go-v2/config v1.29.8 h1:RpwAfYcV2lr/yRc4lWhUM9JRPQqKgKWmou3LV7UfWP4=
github.com/aws/aws-sdk-go-v2/config v1.29.8/go.mod h1:t+G7Fq1OcO8cXTPPXzxQSnj/5Xzdc9jAAD3Xrn9/Mgo=
github.com/aws/aws-sdk-go-v2/credentials v1.17.61 h1:Hd/uX6Wo2iUW1JWII+rmyCD7MMhOe7ALwQXN6sKDd1o=
github.com/aws/aws-sdk-go-v2/credentials v1.17.61/go.mod h1:L7vaLkwHY1qgW0gG1zG0z/X0sQ5tpIY5iI13+j3qI80=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 h1:x793wxmUWVDhshP8WW2mlnXuFrO4cOd3HLBroh1paFw=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30/go.mod h1:Jpne2tDnYiFascUEs2AWHJL9Yp7A5ZVy3TNyxaAjD6M=
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.64 h1:RTko0AQ0i1vWXDM97DkuW6zskgOxFxm4RqC0kmBJFkE=
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.64/go.mod h1:ty968MpOa5CoQ/ALWNB8Gmfoehof2nRHDR/DZDPfimE=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 h1:ZK5jHhnrioRkUNOc+hOgQKlUL5JeC3S6JgLxtQ+Rm0Q=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34/go.mod h1:p4VfIceZokChbA9FzMbRGz5OV+lekcVtHlPKEO0gSZY=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 h1:SZwFm17ZUNNg5Np0ioo/gq8Mn6u9w19Mri8DnJ15Jf0=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34/go.mod h1:dFZsC0BLo346mvKQLWmoJxT+Sjp+qcVR1tRVHQGOH9Q=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo=
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34 h1:ZNTqv4nIdE/DiBfUUfXcLZ/Spcuz+RjeziUtNJackkM=
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34/go.mod h1:zf7Vcd1ViW7cPqYWEHLHJkS50X0JS2IKz9Cgaj6ugrs=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 h1:eAh2A4b5IzM/lum78bZ590jy36+d/aFLgKF/4Vd1xPE=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3/go.mod h1:0yKJC/kb8sAnmlYa6Zs3QVYqaC8ug2AbnNChv5Ox3uA=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.6.2 h1:t/gZFyrijKuSU0elA5kRngP/oU3mc0I+Dvp8HwRE4c0=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.6.2/go.mod h1:iu6FSzgt+M2/x3Dk8zhycdIcHjEFb36IS8HVUVFoMg0=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 h1:dM9/92u2F1JbDaGooxTq18wmmFzbJRfXfVfy96/1CXM=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15/go.mod h1:SwFBy2vjtA0vZbjjaFtfN045boopadnoVPhu4Fv66vY=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.15 h1:moLQUoVq91LiqT1nbvzDukyqAlCv89ZmwaHw/ZFlFZg=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.15/go.mod h1:ZH34PJUc8ApjBIfgQCFvkWcUDBtl/WTD+uiYHjd8igA=
github.com/aws/aws-sdk-go-v2/service/s3 v1.78.0 h1:EBm8lXevBWe+kK9VOU/IBeOI189WPRwPUc3LvJK9GOs=
github.com/aws/aws-sdk-go-v2/service/s3 v1.78.0/go.mod h1:4qzsZSzB/KiX2EzDjs9D7A8rI/WGJxZceVJIHqtJjIU=
github.com/aws/aws-sdk-go-v2/service/sso v1.25.0 h1:2U9sF8nKy7UgyEeLiZTRg6ShBS22z8UnYpV6aRFL0is=
github.com/aws/aws-sdk-go-v2/service/sso v1.25.0/go.mod h1:qs4a9T5EMLl/Cajiw2TcbNt2UNo/Hqlyp+GiuG4CFDI=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.29.0 h1:wjAdc85cXdQR5uLx5FwWvGIHm4OPJhTyzUHU8craXtE=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.29.0/go.mod h1:MlYRNmYu/fGPoxBQVvBYr9nyr948aY/WLUvwBMBJubs=
github.com/aws/aws-sdk-go-v2/service/sts v1.33.16 h1:BHEK2Q/7CMRMCb3nySi/w8UbIcPhKvYP5s1xf8/izn0=
github.com/aws/aws-sdk-go-v2/service/sts v1.33.16/go.mod h1:cQnB8CUnxbMU82JvlqjKR2HBOm3fe9pWorWBza6MBJ4=
github.com/aws/smithy-go v1.22.3 h1:Z//5NuZCSW6R4PhQ93hShNbyBbn8BWCmCVCt+Q8Io5k=
github.com/aws/smithy-go v1.22.3/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI=
github.com/aws/aws-sdk-go-v2 v1.36.1 h1:iTDl5U6oAhkNPba0e1t1hrwAo02ZMqbrGq4k5JBWM5E=
github.com/aws/aws-sdk-go-v2 v1.36.1/go.mod h1:5PMILGVKiW32oDzjj6RU52yrNrDPUHcbZQYr1sM7qmM=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.8 h1:zAxi9p3wsZMIaVCdoiQp2uZ9k1LsZvmAnoTBeZPXom0=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.8/go.mod h1:3XkePX5dSaxveLAYY7nsbsZZrKxCyEuE5pM4ziFxyGg=
github.com/aws/aws-sdk-go-v2/config v1.29.6 h1:fqgqEKK5HaZVWLQoLiC9Q+xDlSp+1LYidp6ybGE2OGg=
github.com/aws/aws-sdk-go-v2/config v1.29.6/go.mod h1:Ft+WLODzDQmCTHDvqAH1JfC2xxbZ0MxpZAcJqmE1LTQ=
github.com/aws/aws-sdk-go-v2/credentials v1.17.59 h1:9btwmrt//Q6JcSdgJOLI98sdr5p7tssS9yAsGe8aKP4=
github.com/aws/aws-sdk-go-v2/credentials v1.17.59/go.mod h1:NM8fM6ovI3zak23UISdWidyZuI1ghNe2xjzUZAyT+08=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.28 h1:KwsodFKVQTlI5EyhRSugALzsV6mG/SGrdjlMXSZSdso=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.28/go.mod h1:EY3APf9MzygVhKuPXAc5H+MkGb8k/DOSQjWS0LgkKqI=
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.59 h1:5Vsrfdlf9KQP3leGX1dD7VwZq/3HAerEFoXAII4t6zo=
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.59/go.mod h1:7XTNs3NYApJjkx6A2Fk9qq23qBuBnIU58k3fKC2Fr1I=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.32 h1:BjUcr3X3K0wZPGFg2bxOWW3VPN8rkE3/61zhP+IHviA=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.32/go.mod h1:80+OGC/bgzzFFTUmcuwD0lb4YutwQeKLFpmt6hoWapU=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.32 h1:m1GeXHVMJsRsUAqG6HjZWx9dj7F5TR+cF1bjyfYyBd4=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.32/go.mod h1:IitoQxGfaKdVLNg0hD8/DXmAqNy0H4K2H2Sf91ti8sI=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.2 h1:Pg9URiobXy85kgFev3og2CuOZ8JZUBENF+dcgWBaYNk=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.2/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc=
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.32 h1:OIHj/nAhVzIXGzbAE+4XmZ8FPvro3THr6NlqErJc3wY=
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.32/go.mod h1:LiBEsDo34OJXqdDlRGsilhlIiXR7DL+6Cx2f4p1EgzI=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.2 h1:D4oz8/CzT9bAEYtVhSBmFj2dNOtaHOtMKc2vHBwYizA=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.2/go.mod h1:Za3IHqTQ+yNcRHxu1OFucBh0ACZT4j4VQFF0BqpZcLY=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.5.6 h1:cCBJaT7EeEojpJ4s7wTDbhZlHVJOgNHN7iw6qVurGaw=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.5.6/go.mod h1:WYH1ABybY7JK9TITPnk6ZlP7gQB8psI4c9qDmMsnLSA=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.13 h1:SYVGSFQHlchIcy6e7x12bsrxClCXSP5et8cqVhL8cuw=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.13/go.mod h1:kizuDaLX37bG5WZaoxGPQR/LNFXpxp0vsUnqfkWXfNE=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.13 h1:OBsrtam3rk8NfBEq7OLOMm5HtQ9Yyw32X4UQMya/wjw=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.13/go.mod h1:3U4gFA5pmoCOja7aq4nSaIAGbaOHv2Yl2ug018cmC+Q=
github.com/aws/aws-sdk-go-v2/service/s3 v1.75.4 h1:DJYjOvNgC30JAcDCRmtQHoYK4trc7XetDXRTEAReGKA=
github.com/aws/aws-sdk-go-v2/service/s3 v1.75.4/go.mod h1:KuLNrwYJFaC2AVZ+CVVc12k9NyqwgWsoNNHjwqF6QNk=
github.com/aws/aws-sdk-go-v2/service/sso v1.24.15 h1:/eE3DogBjYlvlbhd2ssWyeuovWunHLxfgw3s/OJa4GQ=
github.com/aws/aws-sdk-go-v2/service/sso v1.24.15/go.mod h1:2PCJYpi7EKeA5SkStAmZlF6fi0uUABuhtF8ILHjGc3Y=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.14 h1:M/zwXiL2iXUrHputuXgmO94TVNmcenPHxgLXLutodKE=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.14/go.mod h1:RVwIw3y/IqxC2YEXSIkAzRDdEU1iRabDPaYjpGCbCGQ=
github.com/aws/aws-sdk-go-v2/service/sts v1.33.14 h1:TzeR06UCMUq+KA3bDkujxK1GVGy+G8qQN/QVYzGLkQE=
github.com/aws/aws-sdk-go-v2/service/sts v1.33.14/go.mod h1:dspXf/oYWGWo6DEvj98wpaTeqt5+DMidZD0A9BYTizc=
github.com/aws/smithy-go v1.22.2 h1:6D9hW43xKFrRx/tXXfAlIZc4JI+yQe6snnWcQyxSyLQ=
github.com/aws/smithy-go v1.22.2/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
@@ -67,7 +67,7 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/containrrr/shoutrrr v0.8.0 h1:mfG2ATzIS7NR2Ec6XL+xyoHzN97H8WPjir8aYzJUSec=
github.com/containrrr/shoutrrr v0.8.0/go.mod h1:ioyQAyu1LJY6sILuNyKaQaw+9Ttik5QePU8atnAdO2o=
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
@@ -139,8 +139,8 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-github/v30 v30.1.0 h1:VLDx+UolQICEOKu2m4uAoMti1SxuEBAl7RSEG16L+Oo=
github.com/google/go-github/v30 v30.1.0/go.mod h1:n8jBpHl45a/rlBUtRJMOG4GhNADUQFEufcolZ95JfU8=
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
@@ -175,8 +175,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/lufia/plan9stats v0.0.0-20250224150550-a661cff19cfb h1:YU0XAr3+rMpM8fP80KEesn32Qa9qkbquokvuwzWyYuA=
github.com/lufia/plan9stats v0.0.0-20250224150550-a661cff19cfb/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg=
github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 h1:7UMa6KCCMjZEMDtTVdcGu0B1GmmC7QJKiCCjyTAWQy0=
github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k=
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
@@ -195,8 +195,8 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pocketbase/dbx v1.11.0 h1:LpZezioMfT3K4tLrqA55wWFw1EtH1pM4tzSVa7kgszU=
github.com/pocketbase/dbx v1.11.0/go.mod h1:xXRCIAKTHMgUCyCKZm55pUOdvFziJjQfXaWKhu2vhMs=
github.com/pocketbase/pocketbase v0.25.9 h1:/PSJcy39vEGv4lsBG4HV0ZFLcFsTdK9oMkJbxVlVJSs=
github.com/pocketbase/pocketbase v0.25.9/go.mod h1:gOnPr+g/GS+iqKh5XYXycdRWVGhiHY4c1H4TGjU9DDw=
github.com/pocketbase/pocketbase v0.25.0 h1:/4YQq1hd0muvhzbERyUTVNh88N0BCj5diqK0jtLN6k8=
github.com/pocketbase/pocketbase v0.25.0/go.mod h1:tOtOv7f3vJhAiyUluIwV9JPuKeknZRQ9F6uJE3W/ntI=
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU=
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
@@ -207,12 +207,13 @@ 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.2 h1:NMscG3l2CqtWFS86kj3vP7soOczqrQYIEhO/pMvvQkk=
github.com/shirou/gopsutil/v4 v4.25.2/go.mod h1:34gBYJzyqCDT11b6bMHP0XCvWeU3J61XRT7a2EmCRTA=
github.com/shirou/gopsutil/v4 v4.25.1 h1:QSWkTc+fu9LTAWfkZwZ6j8MSUk4A2LV7rbH0ZqmLjXs=
github.com/shirou/gopsutil/v4 v4.25.1/go.mod h1:RoUCUpndaJFtT+2zsZzzmhvbfGoDCJ7nFXKJf8GqJbI=
github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y=
github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=
github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@@ -239,10 +240,10 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 h1:rgMkmiGfix9vFJDcDi1PK8WEQP4FLQwLDfhp5ZLpFeE=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0 h1:PS8wXpbyaDJQ2VDHHncMe9Vct0Zn1fEjpsjrLxGJoSc=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0/go.mod h1:HDBUsEjOuRC0EzKZ1bSaRGZWUBAzo+MhAcUUORSr4D0=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 h1:yd02MEjBdJkG3uabWP9apV+OuWRIXGDuJEUJbOHmCFU=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0/go.mod h1:umTcuxiv1n/s/S6/c2AT/g2CQ7u5C59sHDNmfSwgz7Q=
go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
@@ -258,19 +259,19 @@ gocloud.dev v0.40.0/go.mod h1:drz+VyYNBvrMTW0KZiBAYEdl8lbNZx+OQ7oQvdrFmSQ=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs=
golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ=
golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20250228200357-dead58393ab7 h1:aWwlzYV971S4BXRS9AmqwDLAD85ouC6X+pocatKY58c=
golang.org/x/exp v0.0.0-20250228200357-dead58393ab7/go.mod h1:BHOTPb3L19zxehTsLoJXVaTktb06DFgmdW6Wb9s8jqk=
golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c h1:KL/ZBHXgKGVmuZBZ01Lt57yE5ws8ZPSkkihmEyq7FXc=
golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU=
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.24.0 h1:AN7zRgVsbvmTfNyqIbbOraYL8mSwcKncEj8ofjgzcMQ=
golang.org/x/image v0.24.0/go.mod h1:4b/ITuLfqYq1hqZcjofwctIhi7sZh2WaCjvsBNjjya8=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM=
golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4=
golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -279,12 +280,12 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M=
golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
golang.org/x/oauth2 v0.26.0 h1:afQXWNNaeC4nvZ0Ed9XvCCzXM6UHJG7iCg0W4fPqSBE=
golang.org/x/oauth2 v0.26.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -311,20 +312,20 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4=
golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY=
golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY=
golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY=
golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE=
golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY=
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=
google.golang.org/api v0.223.0 h1:JUTaWEriXmEy5AhvdMgksGGPEFsYfUKaPEYXd4c3Wvc=
google.golang.org/api v0.223.0/go.mod h1:C+RS7Z+dDwds2b+zoAk5hN/eSfsiCn0UDrYof/M4d2M=
google.golang.org/api v0.220.0 h1:3oMI4gdBgB72WFVwE1nerDD8W3HUOS4kypK6rRLbGns=
google.golang.org/api v0.220.0/go.mod h1:26ZAlY6aN/8WgpCzjPNy18QpYaz7Zgg1h0qe1GkZEmY=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
@@ -336,8 +337,8 @@ google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988 h1:CT2Thj5AuPV9phr
google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988/go.mod h1:7uvplUBj4RjHAxIZ//98LzOvrQ04JBkaixRmCMI29hc=
google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576 h1:CkkIfIt50+lT6NHAVoRYEyAvQGFM7xEwXUUywFvEb3Q=
google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576/go.mod h1:1R3kvZ1dtP3+4p4d3G8uJ8rFk/fWlScl38vanWACI08=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250227231956-55c901821b1e h1:YA5lmSs3zc/5w+xsRcHqpETkaYyK63ivEPzNTcUUlSA=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250227231956-55c901821b1e/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250204164813-702378808489 h1:5bKytslY8ViY0Cj/ewmRtrWHW64bNF03cAatUUFCdFI=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250204164813-702378808489/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
@@ -354,8 +355,8 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
google.golang.org/protobuf v1.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM=
google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -368,27 +369,27 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
modernc.org/cc/v4 v4.24.4 h1:TFkx1s6dCkQpd6dKurBNmpo+G8Zl4Sq/ztJ+2+DEsh0=
modernc.org/cc/v4 v4.24.4/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0=
modernc.org/ccgo/v4 v4.23.16 h1:Z2N+kk38b7SfySC1ZkpGLN2vthNJP1+ZzGZIlH7uBxo=
modernc.org/ccgo/v4 v4.23.16/go.mod h1:nNma8goMTY7aQZQNTyN9AIoJfxav4nvTnvKThAeMDdo=
modernc.org/cc/v4 v4.21.4 h1:3Be/Rdo1fpr8GrQ7IVw9OHtplU4gWbb+wNgeoBMmGLQ=
modernc.org/cc/v4 v4.21.4/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ=
modernc.org/ccgo/v4 v4.19.2 h1:lwQZgvboKD0jBwdaeVCTouxhxAyN6iawF3STraAal8Y=
modernc.org/ccgo/v4 v4.19.2/go.mod h1:ysS3mxiMV38XGRTTcgo0DQTeTmAO4oCmJl1nX9VFI3s=
modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE=
modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ=
modernc.org/gc/v2 v2.6.3 h1:aJVhcqAte49LF+mGveZ5KPlsp4tdGdAOT4sipJXADjw=
modernc.org/gc/v2 v2.6.3/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito=
modernc.org/libc v1.61.13 h1:3LRd6ZO1ezsFiX1y+bHd1ipyEHIJKvuprv0sLTBwLW8=
modernc.org/libc v1.61.13/go.mod h1:8F/uJWL/3nNil0Lgt1Dpz+GgkApWh04N3el3hxJcA6E=
modernc.org/gc/v2 v2.4.1 h1:9cNzOqPyMJBvrUipmynX0ZohMhcxPtMccYgGOJdOiBw=
modernc.org/gc/v2 v2.4.1/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU=
modernc.org/libc v1.55.3 h1:AzcW1mhlPNrRtjS5sS+eW2ISCgSOLLNyFzRh/V3Qj/U=
modernc.org/libc v1.55.3/go.mod h1:qFXepLhz+JjFThQ4kzwzOjA/y/artDeg+pcYnY+Q83w=
modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU=
modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg=
modernc.org/memory v1.8.2 h1:cL9L4bcoAObu4NkxOlKWBWtNHIsnnACGF/TbqQ6sbcI=
modernc.org/memory v1.8.2/go.mod h1:ZbjSvMO5NQ1A2i3bWeDiVMxIorXwdClKE/0SZ+BMotU=
modernc.org/opt v0.1.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.35.0 h1:yQps4fegMnZFdphtzlfQTCNBWtS0CZv48pRpW3RFHRw=
modernc.org/sqlite v1.35.0/go.mod h1:9cr2sicr7jIaWTBKQmAxQLfBv9LL0su4ZTEV+utt3ic=
modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0=
modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A=
modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4=
modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc=
modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss=
modernc.org/sqlite v1.34.5 h1:Bb6SR13/fjp15jt70CL4f18JIN7p7dnMExd+UFnF15g=
modernc.org/sqlite v1.34.5/go.mod h1:YLuNmX9NKs8wRNK2ko1LW1NGYcc9FkBO69JOt1AR9JE=
modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA=
modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0=
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=

View File

@@ -9,7 +9,6 @@ import (
"os"
"strings"
"sync"
"time"
"github.com/shirou/gopsutil/v4/common"
)
@@ -26,20 +25,16 @@ type Agent struct {
dockerManager *dockerManager // Manages Docker API requests
sensorsContext context.Context // Sensors context to override sys location
sensorsWhitelist map[string]struct{} // List of sensors to monitor
primarySensor string // Value of PRIMARY_SENSOR env var
systemInfo system.Info // Host system info
gpuManager *GPUManager // Manages GPU data
cache *SessionCache // Cache for system stats based on primary session ID
}
func NewAgent() *Agent {
agent := &Agent{
sensorsContext: context.Background(),
fsStats: make(map[string]*system.FsStats),
cache: NewSessionCache(69 * time.Second),
fsStats: make(map[string]*system.FsStats),
}
agent.memCalc, _ = GetEnv("MEM_CALC")
agent.primarySensor, _ = GetEnv("PRIMARY_SENSOR")
// Set up slog with a log level determined by the LOG_LEVEL env var
if logLevelStr, exists := GetEnv("LOG_LEVEL"); exists {
switch strings.ToLower(logLevelStr) {
@@ -61,12 +56,14 @@ func NewAgent() *Agent {
agent.sensorsContext = context.WithValue(agent.sensorsContext,
common.EnvKey, common.EnvMap{common.HostSysEnvKey: sysSensors},
)
} else {
agent.sensorsContext = context.Background()
}
// Set sensors whitelist
if sensors, exists := GetEnv("SENSORS"); exists {
agent.sensorsWhitelist = make(map[string]struct{})
for sensor := range strings.SplitSeq(sensors, ",") {
for _, sensor := range strings.Split(sensors, ",") {
if sensor != "" {
agent.sensorsWhitelist[sensor] = struct{}{}
}
@@ -88,7 +85,7 @@ func NewAgent() *Agent {
// if debugging, print stats
if agent.debug {
slog.Debug("Stats", "data", agent.gatherStats(""))
slog.Debug("Stats", "data", agent.gatherStats())
}
return agent
@@ -103,37 +100,29 @@ func GetEnv(key string) (value string, exists bool) {
return os.LookupEnv(key)
}
func (a *Agent) gatherStats(sessionID string) *system.CombinedData {
func (a *Agent) gatherStats() system.CombinedData {
a.Lock()
defer a.Unlock()
cachedData, ok := a.cache.Get(sessionID)
if ok {
slog.Debug("Cached stats", "session", sessionID)
return cachedData
}
*cachedData = system.CombinedData{
slog.Debug("Getting stats")
systemData := system.CombinedData{
Stats: a.getSystemStats(),
Info: a.systemInfo,
}
slog.Debug("System stats", "data", cachedData)
slog.Debug("System stats", "data", systemData)
// add docker stats
if containerStats, err := a.dockerManager.getDockerStats(); err == nil {
cachedData.Containers = containerStats
slog.Debug("Docker stats", "data", cachedData.Containers)
systemData.Containers = containerStats
slog.Debug("Docker stats", "data", systemData.Containers)
} else {
slog.Debug("Docker stats", "err", err)
slog.Debug("Error getting docker stats", "err", err)
}
cachedData.Stats.ExtraFs = make(map[string]*system.FsStats)
// add extra filesystems
systemData.Stats.ExtraFs = make(map[string]*system.FsStats)
for name, stats := range a.fsStats {
if !stats.Root && stats.DiskTotal > 0 {
cachedData.Stats.ExtraFs[name] = stats
systemData.Stats.ExtraFs[name] = stats
}
}
slog.Debug("Extra filesystems", "data", cachedData.Stats.ExtraFs)
a.cache.Set(sessionID, cachedData)
return cachedData
slog.Debug("Extra filesystems", "data", systemData.Stats.ExtraFs)
return systemData
}

View File

@@ -1,36 +0,0 @@
package agent
import (
"beszel/internal/entities/system"
"time"
)
// Not thread safe since we only access from gatherStats which is already locked
type SessionCache struct {
data *system.CombinedData
lastUpdate time.Time
primarySession string
leaseTime time.Duration
}
func NewSessionCache(leaseTime time.Duration) *SessionCache {
return &SessionCache{
leaseTime: leaseTime,
data: &system.CombinedData{},
}
}
func (c *SessionCache) Get(sessionID string) (stats *system.CombinedData, isCached bool) {
if sessionID != c.primarySession && time.Since(c.lastUpdate) < c.leaseTime {
return c.data, true
}
return c.data, false
}
func (c *SessionCache) Set(sessionID string, data *system.CombinedData) {
if data != nil {
*c.data = *data
}
c.primarySession = sessionID
c.lastUpdate = time.Now()
}

View File

@@ -1,85 +0,0 @@
package agent
import (
"beszel/internal/entities/system"
"testing"
"testing/synctest"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestSessionCache_GetSet(t *testing.T) {
synctest.Run(func() {
cache := NewSessionCache(69 * time.Second)
testData := &system.CombinedData{
Info: system.Info{
Hostname: "test-host",
Cores: 4,
},
Stats: system.Stats{
Cpu: 50.0,
MemPct: 30.0,
DiskPct: 40.0,
},
}
// Test initial state - should not be cached
data, isCached := cache.Get("session1")
assert.False(t, isCached, "Expected no cached data initially")
assert.NotNil(t, data, "Expected data to be initialized")
// Set data for session1
cache.Set("session1", testData)
time.Sleep(15 * time.Second)
// Get data for a different session - should be cached
data, isCached = cache.Get("session2")
assert.True(t, isCached, "Expected data to be cached for non-primary session")
require.NotNil(t, data, "Expected cached data to be returned")
assert.Equal(t, "test-host", data.Info.Hostname, "Hostname should match test data")
assert.Equal(t, 4, data.Info.Cores, "Cores should match test data")
assert.Equal(t, 50.0, data.Stats.Cpu, "CPU should match test data")
assert.Equal(t, 30.0, data.Stats.MemPct, "Memory percentage should match test data")
assert.Equal(t, 40.0, data.Stats.DiskPct, "Disk percentage should match test data")
time.Sleep(10 * time.Second)
// Get data for the primary session - should not be cached
data, isCached = cache.Get("session1")
assert.False(t, isCached, "Expected data not to be cached for primary session")
require.NotNil(t, data, "Expected data to be returned even if not cached")
assert.Equal(t, "test-host", data.Info.Hostname, "Hostname should match test data")
// if not cached, agent will update the data
cache.Set("session1", testData)
time.Sleep(45 * time.Second)
// Get data for a different session - should still be cached
_, isCached = cache.Get("session2")
assert.True(t, isCached, "Expected data to be cached for non-primary session")
// Wait for the lease to expire
time.Sleep(30 * time.Second)
// Get data for session2 - should not be cached
_, isCached = cache.Get("session2")
assert.False(t, isCached, "Expected data not to be cached after lease expiration")
})
}
func TestSessionCache_NilData(t *testing.T) {
// Create a new SessionCache
cache := NewSessionCache(30 * time.Second)
// Test setting nil data (should not panic)
assert.NotPanics(t, func() {
cache.Set("session1", nil)
}, "Setting nil data should not panic")
// Get data - should not be nil even though we set nil
data, _ := cache.Get("session2")
assert.NotNil(t, data, "Expected data to not be nil after setting nil data")
}

View File

@@ -22,24 +22,12 @@ type dockerManager struct {
wg sync.WaitGroup // WaitGroup to wait for all goroutines to finish
sem chan struct{} // Semaphore to limit concurrent container requests
containerStatsMutex sync.RWMutex // Mutex to prevent concurrent access to containerStatsMap
apiContainerList []*container.ApiInfo // List of containers from Docker API (no pointer)
apiContainerList *[]container.ApiInfo // List of containers from Docker API
containerStatsMap map[string]*container.Stats // Keeps track of container stats
validIds map[string]struct{} // Map of valid container ids, used to prune invalid containers from containerStatsMap
goodDockerVersion bool // Whether docker version is at least 25.0.0 (one-shot works correctly)
}
// userAgentRoundTripper is a custom http.RoundTripper that adds a User-Agent header to all requests
type userAgentRoundTripper struct {
rt http.RoundTripper
userAgent string
}
// RoundTrip implements the http.RoundTripper interface
func (u *userAgentRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
req.Header.Set("User-Agent", u.userAgent)
return u.rt.RoundTrip(req)
}
// Add goroutine to the queue
func (d *dockerManager) queue() {
d.wg.Add(1)
@@ -64,12 +52,11 @@ func (dm *dockerManager) getDockerStats() ([]*container.Stats, error) {
}
defer resp.Body.Close()
dm.apiContainerList = dm.apiContainerList[:0]
if err := json.NewDecoder(resp.Body).Decode(&dm.apiContainerList); err != nil {
return nil, err
}
containersLength := len(dm.apiContainerList)
containersLength := len(*dm.apiContainerList)
// store valid ids to clean up old container ids from map
if dm.validIds == nil {
@@ -78,10 +65,9 @@ func (dm *dockerManager) getDockerStats() ([]*container.Stats, error) {
clear(dm.validIds)
}
var failedContainers []*container.ApiInfo
var failedContainters []container.ApiInfo
for i := range dm.apiContainerList {
ctr := dm.apiContainerList[i]
for _, ctr := range *dm.apiContainerList {
ctr.IdShort = ctr.Id[:12]
dm.validIds[ctr.IdShort] = struct{}{}
// check if container is less than 1 minute old (possible restart)
@@ -98,7 +84,7 @@ func (dm *dockerManager) getDockerStats() ([]*container.Stats, error) {
if err != nil {
dm.containerStatsMutex.Lock()
delete(dm.containerStatsMap, ctr.IdShort)
failedContainers = append(failedContainers, ctr)
failedContainters = append(failedContainters, ctr)
dm.containerStatsMutex.Unlock()
}
}()
@@ -107,9 +93,9 @@ func (dm *dockerManager) getDockerStats() ([]*container.Stats, error) {
dm.wg.Wait()
// retry failed containers separately so we can run them in parallel (docker 24 bug)
if len(failedContainers) > 0 {
slog.Debug("Retrying failed containers", "count", len(failedContainers))
for _, ctr := range failedContainers {
if len(failedContainters) > 0 {
slog.Debug("Retrying failed containers", "count", len(failedContainters))
for _, ctr := range failedContainters {
dm.queue()
go func() {
defer dm.dequeue()
@@ -136,7 +122,7 @@ func (dm *dockerManager) getDockerStats() ([]*container.Stats, error) {
}
// Updates stats for individual container
func (dm *dockerManager) updateContainerStats(ctr *container.ApiInfo) error {
func (dm *dockerManager) updateContainerStats(ctr container.ApiInfo) error {
name := ctr.Names[0][1:]
resp, err := dm.client.Get("http://localhost/containers/" + ctr.IdShort + "/stats?stream=0&one-shot=1")
@@ -265,27 +251,20 @@ func newDockerManager(a *Agent) *dockerManager {
slog.Info("DOCKER_TIMEOUT", "timeout", timeout)
}
// Custom user-agent to avoid docker bug: https://github.com/docker/for-mac/issues/7575
userAgentTransport := &userAgentRoundTripper{
rt: transport,
userAgent: "Docker-Client/",
}
manager := &dockerManager{
dockerClient := &dockerManager{
client: &http.Client{
Timeout: timeout,
Transport: userAgentTransport,
Transport: transport,
},
containerStatsMap: make(map[string]*container.Stats),
sem: make(chan struct{}, 5),
apiContainerList: []*container.ApiInfo{},
}
// If using podman, return client
if strings.Contains(dockerHost, "podman") {
a.systemInfo.Podman = true
manager.goodDockerVersion = true
return manager
dockerClient.goodDockerVersion = true
return dockerClient
}
// Check docker version
@@ -293,24 +272,23 @@ func newDockerManager(a *Agent) *dockerManager {
var versionInfo struct {
Version string `json:"Version"`
}
resp, err := manager.client.Get("http://localhost/version")
resp, err := dockerClient.client.Get("http://localhost/version")
if err != nil {
return manager
return dockerClient
}
defer resp.Body.Close()
if err := json.NewDecoder(resp.Body).Decode(&versionInfo); err != nil {
return manager
return dockerClient
}
// if version > 24, one-shot works correctly and we can limit concurrent operations
if dockerVersion, err := semver.Parse(versionInfo.Version); err == nil && dockerVersion.Major > 24 {
manager.goodDockerVersion = true
dockerClient.goodDockerVersion = true
} else {
slog.Info(fmt.Sprintf("Docker %s is outdated. Upgrade if possible. See https://github.com/henrygd/beszel/issues/58", versionInfo.Version))
}
return manager
return dockerClient
}
// Test docker / podman sockets and return if one exists

View File

@@ -3,7 +3,6 @@ package agent
import (
"beszel/internal/entities/system"
"bufio"
"bytes"
"encoding/json"
"fmt"
"os/exec"
@@ -16,28 +15,6 @@ import (
"golang.org/x/exp/slog"
)
const (
// Commands
nvidiaSmiCmd = "nvidia-smi"
rocmSmiCmd = "rocm-smi"
tegraStatsCmd = "tegrastats"
// Polling intervals
nvidiaSmiInterval = "4" // in seconds
tegraStatsInterval = "3700" // in milliseconds
rocmSmiInterval = 4300 * time.Millisecond
// Command retry and timeout constants
retryWaitTime = 5 * time.Second
maxFailureRetries = 5
cmdBufferSize = 10 * 1024
// Unit Conversions
mebibytesInAMegabyte = 1.024 // nvidia-smi reports memory in MiB
milliwattsInAWatt = 1000.0 // tegrastats reports power in mW
)
// GPUManager manages data collection for GPUs (either Nvidia or AMD)
type GPUManager struct {
sync.Mutex
@@ -79,7 +56,7 @@ func (c *gpuCollector) start() {
break
}
slog.Warn(c.name+" failed, restarting", "err", err)
time.Sleep(retryWaitTime)
time.Sleep(time.Second * 5)
continue
}
}
@@ -98,7 +75,7 @@ func (c *gpuCollector) collect() error {
scanner := bufio.NewScanner(stdout)
if c.buf == nil {
c.buf = make([]byte, 0, cmdBufferSize)
c.buf = make([]byte, 0, 4*1024)
}
scanner.Buffer(c.buf, bufio.MaxScanTokenSize)
@@ -133,28 +110,28 @@ func (gm *GPUManager) getJetsonParser() func(output []byte) bool {
if !ok {
return true
}
data := string(output)
// Parse RAM usage
ramMatches := ramPattern.FindSubmatch(output)
ramMatches := ramPattern.FindStringSubmatch(data)
if ramMatches != nil {
gpuData.MemoryUsed, _ = strconv.ParseFloat(string(ramMatches[1]), 64)
gpuData.MemoryTotal, _ = strconv.ParseFloat(string(ramMatches[2]), 64)
gpuData.MemoryUsed, _ = strconv.ParseFloat(ramMatches[1], 64)
gpuData.MemoryTotal, _ = strconv.ParseFloat(ramMatches[2], 64)
}
// Parse GR3D (GPU) usage
gr3dMatches := gr3dPattern.FindSubmatch(output)
gr3dMatches := gr3dPattern.FindStringSubmatch(data)
if gr3dMatches != nil {
gr3dUsage, _ := strconv.ParseFloat(string(gr3dMatches[1]), 64)
gpuData.Usage += gr3dUsage
gpuData.Usage, _ = strconv.ParseFloat(gr3dMatches[1], 64)
}
// Parse temperature
tempMatches := tempPattern.FindSubmatch(output)
tempMatches := tempPattern.FindStringSubmatch(data)
if tempMatches != nil {
gpuData.Temperature, _ = strconv.ParseFloat(string(tempMatches[1]), 64)
gpuData.Temperature, _ = strconv.ParseFloat(tempMatches[1], 64)
}
// Parse power usage
powerMatches := powerPattern.FindSubmatch(output)
powerMatches := powerPattern.FindStringSubmatch(data)
if powerMatches != nil {
power, _ := strconv.ParseFloat(string(powerMatches[2]), 64)
gpuData.Power += power / milliwattsInAWatt
power, _ := strconv.ParseFloat(powerMatches[2], 64)
gpuData.Power = power / 1000
}
gpuData.Count++
return true
@@ -165,10 +142,8 @@ func (gm *GPUManager) getJetsonParser() func(output []byte) bool {
func (gm *GPUManager) parseNvidiaData(output []byte) bool {
gm.Lock()
defer gm.Unlock()
scanner := bufio.NewScanner(bytes.NewReader(output))
var valid bool
for scanner.Scan() {
line := scanner.Text() // Or use scanner.Bytes() for []byte
for line := range strings.Lines(string(output)) {
fields := strings.Split(strings.TrimSpace(line), ", ")
if len(fields) < 7 {
continue
@@ -194,8 +169,8 @@ func (gm *GPUManager) parseNvidiaData(output []byte) bool {
// update gpu data
gpu := gm.GpuDataMap[id]
gpu.Temperature = temp
gpu.MemoryUsed = memoryUsage / mebibytesInAMegabyte
gpu.MemoryTotal = totalMemory / mebibytesInAMegabyte
gpu.MemoryUsed = memoryUsage / 1.024
gpu.MemoryTotal = totalMemory / 1.024
gpu.Usage += usage
gpu.Power += power
gpu.Count++
@@ -266,7 +241,6 @@ func (gm *GPUManager) GetCurrentData() map[string]system.GPUData {
}
gpuData[id] = gpuCopy
}
slog.Debug("GPU", "data", gpuData)
return gpuData
}
@@ -275,13 +249,13 @@ func (gm *GPUManager) GetCurrentData() map[string]system.GPUData {
// tools are found. If none of the tools are found, it returns an error indicating that no GPU
// management tools are available.
func (gm *GPUManager) detectGPUs() error {
if _, err := exec.LookPath(nvidiaSmiCmd); err == nil {
if _, err := exec.LookPath("nvidia-smi"); err == nil {
gm.nvidiaSmi = true
}
if _, err := exec.LookPath(rocmSmiCmd); err == nil {
if _, err := exec.LookPath("rocm-smi"); err == nil {
gm.rocmSmi = true
}
if _, err := exec.LookPath(tegraStatsCmd); err == nil {
if _, err := exec.LookPath("tegrastats"); err == nil {
gm.tegrastats = true
}
if gm.nvidiaSmi || gm.rocmSmi || gm.tegrastats {
@@ -296,17 +270,17 @@ func (gm *GPUManager) startCollector(command string) {
name: command,
}
switch command {
case nvidiaSmiCmd:
collector.cmdArgs = []string{"-l", nvidiaSmiInterval,
case "nvidia-smi":
collector.cmdArgs = []string{"-l", "4",
"--query-gpu=index,name,temperature.gpu,memory.used,memory.total,utilization.gpu,power.draw",
"--format=csv,noheader,nounits"}
collector.parse = gm.parseNvidiaData
go collector.start()
case tegraStatsCmd:
collector.cmdArgs = []string{"--interval", tegraStatsInterval}
case "tegrastats":
collector.cmdArgs = []string{"--interval", "3000"}
collector.parse = gm.getJetsonParser()
go collector.start()
case rocmSmiCmd:
case "rocm-smi":
collector.cmdArgs = []string{"--showid", "--showtemp", "--showuse", "--showpower", "--showproductname", "--showmeminfo", "vram", "--json"}
collector.parse = gm.parseAmdData
go func() {
@@ -314,12 +288,12 @@ func (gm *GPUManager) startCollector(command string) {
for {
if err := collector.collect(); err != nil {
failures++
if failures > maxFailureRetries {
if failures > 5 {
break
}
slog.Warn("Error collecting AMD GPU data", "err", err)
}
time.Sleep(rocmSmiInterval)
time.Sleep(4300 * time.Millisecond)
}
}()
}
@@ -334,13 +308,13 @@ func NewGPUManager() (*GPUManager, error) {
gm.GpuDataMap = make(map[string]*system.GPUData)
if gm.nvidiaSmi {
gm.startCollector(nvidiaSmiCmd)
gm.startCollector("nvidia-smi")
}
if gm.rocmSmi {
gm.startCollector(rocmSmiCmd)
gm.startCollector("rocm-smi")
}
if gm.tegrastats {
gm.startCollector(tegraStatsCmd)
gm.startCollector("tegrastats")
}
return &gm, nil

View File

@@ -1,6 +1,3 @@
//go:build testing
// +build testing
package agent
import (
@@ -46,52 +43,6 @@ func TestParseNvidiaData(t *testing.T) {
},
wantValid: true,
},
{
name: "more valid multi-gpu data",
input: `0, NVIDIA A10, 45, 19676, 23028, 0, 58.98
1, NVIDIA A10, 45, 19638, 23028, 0, 62.35
2, NVIDIA A10, 44, 21700, 23028, 0, 59.57
3, NVIDIA A10, 45, 18222, 23028, 0, 61.76`,
wantData: map[string]system.GPUData{
"0": {
Name: "A10",
Temperature: 45.0,
MemoryUsed: 19676.0 / 1.024,
MemoryTotal: 23028.0 / 1.024,
Usage: 0.0,
Power: 58.98,
Count: 1,
},
"1": {
Name: "A10",
Temperature: 45.0,
MemoryUsed: 19638.0 / 1.024,
MemoryTotal: 23028.0 / 1.024,
Usage: 0.0,
Power: 62.35,
Count: 1,
},
"2": {
Name: "A10",
Temperature: 44.0,
MemoryUsed: 21700.0 / 1.024,
MemoryTotal: 23028.0 / 1.024,
Usage: 0.0,
Power: 59.57,
Count: 1,
},
"3": {
Name: "A10",
Temperature: 45.0,
MemoryUsed: 18222.0 / 1.024,
MemoryTotal: 23028.0 / 1.024,
Usage: 0.0,
Power: 61.76,
Count: 1,
},
},
wantValid: true,
},
{
name: "empty input",
input: "",
@@ -256,7 +207,7 @@ func TestParseJetsonData(t *testing.T) {
}{
{
name: "valid data",
input: "11-14-2024 22:54:33 RAM 4300/30698MB GR3D_FREQ 45% tj@52.468C VDD_GPU_SOC 2171mW",
input: "RAM 4300/30698MB GR3D_FREQ 45% tj@52.468C VDD_GPU_SOC 2171mW",
wantMetrics: &system.GPUData{
Name: "Jetson",
MemoryUsed: 4300.0,
@@ -267,22 +218,9 @@ func TestParseJetsonData(t *testing.T) {
Count: 1,
},
},
{
name: "more valid data",
input: "11-15-2024 08:38:09 RAM 6185/7620MB (lfb 8x2MB) SWAP 851/3810MB (cached 1MB) CPU [15%@729,11%@729,14%@729,13%@729,11%@729,8%@729] EMC_FREQ 43%@2133 GR3D_FREQ 63%@[621] NVDEC off NVJPG off NVJPG1 off VIC off OFA off APE 200 cpu@53.968C soc2@52.437C soc0@50.75C gpu@53.343C tj@53.968C soc1@51.656C VDD_IN 12479mW/12479mW VDD_CPU_GPU_CV 4667mW/4667mW VDD_SOC 2817mW/2817mW",
wantMetrics: &system.GPUData{
Name: "Jetson",
MemoryUsed: 6185.0,
MemoryTotal: 7620.0,
Usage: 63.0,
Temperature: 53.968,
Power: 4.667,
Count: 1,
},
},
{
name: "missing temperature",
input: "11-14-2024 22:54:33 RAM 4300/30698MB GR3D_FREQ 45% VDD_GPU_SOC 2171mW",
input: "RAM 4300/30698MB GR3D_FREQ 45% VDD_GPU_SOC 2171mW",
wantMetrics: &system.GPUData{
Name: "Jetson",
MemoryUsed: 4300.0,
@@ -294,7 +232,7 @@ func TestParseJetsonData(t *testing.T) {
},
{
name: "no gpu defined by nvidia-smi",
input: "11-14-2024 22:54:33 RAM 4300/30698MB GR3D_FREQ 45% VDD_GPU_SOC 2171mW",
input: "RAM 4300/30698MB GR3D_FREQ 45% VDD_GPU_SOC 2171mW",
gm: &GPUManager{
GpuDataMap: map[string]*system.GPUData{},
},
@@ -548,7 +486,7 @@ echo '{"card0": {"Temperature (Sensor edge) (C)": "49.0", "Current Socket Graphi
setup: func(t *testing.T) error {
path := filepath.Join(dir, "tegrastats")
script := `#!/bin/sh
echo "11-14-2024 22:54:33 RAM 1024/4096MB GR3D_FREQ 80% tj@70C VDD_GPU_SOC 1000mW"`
echo "RAM 1024/4096MB GR3D_FREQ 80% tj@70C VDD_GPU_SOC 1000mW"`
if err := os.WriteFile(path, []byte(script), 0755); err != nil {
return err
}
@@ -585,158 +523,3 @@ echo "11-14-2024 22:54:33 RAM 1024/4096MB GR3D_FREQ 80% tj@70C VDD_GPU_SOC 1000m
})
}
}
// TestAccumulationTableDriven tests the accumulation behavior for all three GPU types
func TestAccumulation(t *testing.T) {
type expectedGPUValues struct {
temperature float64
memoryUsed float64
memoryTotal float64
usage float64
power float64
count float64
avgUsage float64
avgPower float64
}
tests := []struct {
name string
initialGPUData map[string]*system.GPUData
dataSamples [][]byte
parser func(*GPUManager) func([]byte) bool
expectedValues map[string]expectedGPUValues
}{
{
name: "Jetson GPU accumulation",
initialGPUData: map[string]*system.GPUData{
"0": {
Name: "Jetson",
Temperature: 0,
Usage: 0,
Power: 0,
Count: 0,
},
},
dataSamples: [][]byte{
[]byte("11-14-2024 22:54:33 RAM 1024/4096MB GR3D_FREQ 30% tj@50.5C VDD_GPU_SOC 1000mW"),
[]byte("11-14-2024 22:54:33 RAM 1024/4096MB GR3D_FREQ 40% tj@60.5C VDD_GPU_SOC 1200mW"),
[]byte("11-14-2024 22:54:33 RAM 1024/4096MB GR3D_FREQ 50% tj@70.5C VDD_GPU_SOC 1400mW"),
},
parser: func(gm *GPUManager) func([]byte) bool {
return gm.getJetsonParser()
},
expectedValues: map[string]expectedGPUValues{
"0": {
temperature: 70.5, // Last value
memoryUsed: 1024, // Last value
memoryTotal: 4096, // Last value
usage: 120.0, // Accumulated: 30 + 40 + 50
power: 3.6, // Accumulated: 1.0 + 1.2 + 1.4
count: 3,
avgUsage: 40.0, // 120 / 3
avgPower: 1.2, // 3.6 / 3
},
},
},
{
name: "NVIDIA GPU accumulation",
initialGPUData: map[string]*system.GPUData{
// NVIDIA parser will create the GPU data entries
},
dataSamples: [][]byte{
[]byte("0, NVIDIA GeForce RTX 3080, 50, 5000, 10000, 30, 200"),
[]byte("0, NVIDIA GeForce RTX 3080, 60, 6000, 10000, 40, 250"),
[]byte("0, NVIDIA GeForce RTX 3080, 70, 7000, 10000, 50, 300"),
},
parser: func(gm *GPUManager) func([]byte) bool {
return gm.parseNvidiaData
},
expectedValues: map[string]expectedGPUValues{
"0": {
temperature: 70.0, // Last value
memoryUsed: 7000.0 / 1.024, // Last value
memoryTotal: 10000.0 / 1.024, // Last value
usage: 120.0, // Accumulated: 30 + 40 + 50
power: 750.0, // Accumulated: 200 + 250 + 300
count: 3,
avgUsage: 40.0, // 120 / 3
avgPower: 250.0, // 750 / 3
},
},
},
{
name: "AMD GPU accumulation",
initialGPUData: map[string]*system.GPUData{
// AMD parser will create the GPU data entries
},
dataSamples: [][]byte{
[]byte(`{"card0": {"GUID": "34756", "Temperature (Sensor edge) (C)": "50.0", "Current Socket Graphics Package Power (W)": "100.0", "GPU use (%)": "30", "VRAM Total Memory (B)": "10737418240", "VRAM Total Used Memory (B)": "1073741824", "Card Series": "Radeon RX 6800"}}`),
[]byte(`{"card0": {"GUID": "34756", "Temperature (Sensor edge) (C)": "60.0", "Current Socket Graphics Package Power (W)": "150.0", "GPU use (%)": "40", "VRAM Total Memory (B)": "10737418240", "VRAM Total Used Memory (B)": "2147483648", "Card Series": "Radeon RX 6800"}}`),
[]byte(`{"card0": {"GUID": "34756", "Temperature (Sensor edge) (C)": "70.0", "Current Socket Graphics Package Power (W)": "200.0", "GPU use (%)": "50", "VRAM Total Memory (B)": "10737418240", "VRAM Total Used Memory (B)": "3221225472", "Card Series": "Radeon RX 6800"}}`),
},
parser: func(gm *GPUManager) func([]byte) bool {
return gm.parseAmdData
},
expectedValues: map[string]expectedGPUValues{
"34756": {
temperature: 70.0, // Last value
memoryUsed: 3221225472.0 / (1024 * 1024), // Last value
memoryTotal: 10737418240.0 / (1024 * 1024), // Last value
usage: 120.0, // Accumulated: 30 + 40 + 50
power: 450.0, // Accumulated: 100 + 150 + 200
count: 3,
avgUsage: 40.0, // 120 / 3
avgPower: 150.0, // 450 / 3
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// Create a new GPUManager for each test
gm := &GPUManager{
GpuDataMap: tt.initialGPUData,
}
// Get the parser function
parser := tt.parser(gm)
// Process each data sample
for i, sample := range tt.dataSamples {
valid := parser(sample)
assert.True(t, valid, "Sample %d should be valid", i)
}
// Check accumulated values
for id, expected := range tt.expectedValues {
gpu, exists := gm.GpuDataMap[id]
assert.True(t, exists, "GPU with ID %s should exist", id)
if !exists {
continue
}
assert.InDelta(t, expected.temperature, gpu.Temperature, 0.01, "Temperature should match")
assert.InDelta(t, expected.memoryUsed, gpu.MemoryUsed, 0.01, "Memory used should match")
assert.InDelta(t, expected.memoryTotal, gpu.MemoryTotal, 0.01, "Memory total should match")
assert.InDelta(t, expected.usage, gpu.Usage, 0.01, "Usage should match")
assert.InDelta(t, expected.power, gpu.Power, 0.01, "Power should match")
assert.Equal(t, expected.count, gpu.Count, "Count should match")
}
// Verify average calculation in GetCurrentData
result := gm.GetCurrentData()
for id, expected := range tt.expectedValues {
gpu, exists := result[id]
assert.True(t, exists, "GPU with ID %s should exist in GetCurrentData result", id)
if !exists {
continue
}
assert.InDelta(t, expected.temperature, gpu.Temperature, 0.01, "Temperature in GetCurrentData should match")
assert.InDelta(t, expected.avgUsage, gpu.Usage, 0.01, "Average usage in GetCurrentData should match")
assert.InDelta(t, expected.avgPower, gpu.Power, 0.01, "Average power in GetCurrentData should match")
}
})
}
}

View File

@@ -1,18 +0,0 @@
package agent
import (
"net"
"time"
)
// Health checks if the agent's server is running by attempting to connect to it.
//
// If an error occurs when attempting to connect to the server, it returns the error.
func Health(addr string, network string) error {
conn, err := net.DialTimeout(network, addr, 4*time.Second)
if err != nil {
return err
}
conn.Close()
return nil
}

View File

@@ -1,118 +0,0 @@
//go:build testing
// +build testing
package agent_test
import (
"fmt"
"net"
"os"
"testing"
"github.com/stretchr/testify/require"
"beszel/internal/agent"
)
// setupTestServer creates a temporary server for testing
func setupTestServer(t *testing.T) (string, func()) {
// Create a temporary socket file for Unix socket testing
tempSockFile := os.TempDir() + "/beszel_health_test.sock"
// Clean up any existing socket file
os.Remove(tempSockFile)
// Create a listener
listener, err := net.Listen("unix", tempSockFile)
require.NoError(t, err, "Failed to create test listener")
// Start a simple server in a goroutine
go func() {
conn, err := listener.Accept()
if err != nil {
return // Listener closed
}
defer conn.Close()
// Just accept the connection and do nothing
}()
// Return the socket file path and a cleanup function
return tempSockFile, func() {
listener.Close()
os.Remove(tempSockFile)
}
}
// setupTCPTestServer creates a temporary TCP server for testing
func setupTCPTestServer(t *testing.T) (string, func()) {
// Listen on a random available port
listener, err := net.Listen("tcp", "127.0.0.1:0")
require.NoError(t, err, "Failed to create test listener")
// Get the port that was assigned
addr := listener.Addr().(*net.TCPAddr)
port := addr.Port
// Start a simple server in a goroutine
go func() {
conn, err := listener.Accept()
if err != nil {
return // Listener closed
}
defer conn.Close()
// Just accept the connection and do nothing
}()
// Return the address and a cleanup function
return fmt.Sprintf("127.0.0.1:%d", port), func() {
listener.Close()
}
}
func TestHealth(t *testing.T) {
t.Run("server is running (unix socket)", func(t *testing.T) {
// Setup a test server
sockFile, cleanup := setupTestServer(t)
defer cleanup()
// Run the health check with explicit parameters
err := agent.Health(sockFile, "unix")
require.NoError(t, err, "Failed to check health")
})
t.Run("server is running (tcp address)", func(t *testing.T) {
// Setup a test server
addr, cleanup := setupTCPTestServer(t)
defer cleanup()
// Run the health check with explicit parameters
err := agent.Health(addr, "tcp")
require.NoError(t, err, "Failed to check health")
})
t.Run("server is not running", func(t *testing.T) {
// Use an address that's likely not in use
addr := "127.0.0.1:65535"
// Run the health check with explicit parameters
err := agent.Health(addr, "tcp")
require.Error(t, err, "Health check should return an error when server is not running")
})
t.Run("invalid network", func(t *testing.T) {
// Use an invalid network type
err := agent.Health("127.0.0.1:8080", "invalid_network")
require.Error(t, err, "Health check should return an error with invalid network")
})
t.Run("unix socket not found", func(t *testing.T) {
// Use a non-existent unix socket
nonExistentSocket := os.TempDir() + "/non_existent_socket.sock"
// Make sure it really doesn't exist
os.Remove(nonExistentSocket)
err := agent.Health(nonExistentSocket, "unix")
require.Error(t, err, "Health check should return an error when socket doesn't exist")
})
}

View File

@@ -17,7 +17,7 @@ func (a *Agent) initializeNetIoStats() {
nics, nicsEnvExists := GetEnv("NICS")
if nicsEnvExists {
nicsMap = make(map[string]struct{}, 0)
for nic := range strings.SplitSeq(nics, ",") {
for _, nic := range strings.Split(nics, ",") {
nicsMap[nic] = struct{}{}
}
}

View File

@@ -23,14 +23,20 @@ func (a *Agent) StartServer(opts ServerOptions) error {
slog.Info("Starting SSH server", "addr", opts.Addr, "network", opts.Network)
if opts.Network == "unix" {
switch opts.Network {
case "unix":
// remove existing socket file if it exists
if err := os.Remove(opts.Addr); err != nil && !os.IsNotExist(err) {
return err
}
default:
// prefix with : if only port was provided
if !strings.Contains(opts.Addr, ":") {
opts.Addr = ":" + opts.Addr
}
}
// start listening on the address
// Listen on the address
ln, err := net.Listen(opts.Network, opts.Addr)
if err != nil {
return err
@@ -38,7 +44,7 @@ func (a *Agent) StartServer(opts ServerOptions) error {
defer ln.Close()
// Start SSH server on the listener
return sshServer.Serve(ln, nil, sshServer.NoPty(),
err = sshServer.Serve(ln, nil, sshServer.NoPty(),
sshServer.PublicKeyAuth(func(ctx sshServer.Context, key sshServer.PublicKey) bool {
for _, pubKey := range opts.Keys {
if sshServer.KeysEqual(key, pubKey) {
@@ -48,11 +54,15 @@ func (a *Agent) StartServer(opts ServerOptions) error {
return false
}),
)
if err != nil {
return err
}
return nil
}
func (a *Agent) handleSession(s sshServer.Session) {
slog.Debug("New session", "client", s.RemoteAddr())
stats := a.gatherStats(s.Context().SessionID())
// slog.Debug("connection", "remoteaddr", s.RemoteAddr(), "user", s.User())
stats := a.gatherStats()
if err := json.NewEncoder(s).Encode(stats); err != nil {
slog.Error("Error encoding stats", "err", err, "stats", stats)
s.Exit(1)
@@ -64,48 +74,24 @@ func (a *Agent) handleSession(s sshServer.Session) {
// It returns a slice of ssh.PublicKey and an error if any key fails to parse.
func ParseKeys(input string) ([]ssh.PublicKey, error) {
var parsedKeys []ssh.PublicKey
for line := range strings.Lines(input) {
line = strings.TrimSpace(line)
// Skip empty lines or comments
if len(line) == 0 || strings.HasPrefix(line, "#") {
continue
}
// Parse the key
parsedKey, _, _, _, err := ssh.ParseAuthorizedKey([]byte(line))
if err != nil {
return nil, fmt.Errorf("failed to parse key: %s, error: %w", line, err)
}
// Append the parsed key to the list
parsedKeys = append(parsedKeys, parsedKey)
}
return parsedKeys, nil
}
// GetAddress gets the address to listen on or connect to from environment variables or default value.
func GetAddress(addr string) string {
if addr == "" {
addr, _ = GetEnv("LISTEN")
}
if addr == "" {
// Legacy PORT environment variable support
addr, _ = GetEnv("PORT")
}
if addr == "" {
return ":45876"
}
// prefix with : if only port was provided
if GetNetwork(addr) != "unix" && !strings.Contains(addr, ":") {
addr = ":" + addr
}
return addr
}
// GetNetwork returns the network type to use based on the address
func GetNetwork(addr string) string {
if network, ok := GetEnv("NETWORK"); ok && network != "" {
return network
}
if strings.HasPrefix(addr, "/") {
return "unix"
}
return "tcp"
}

View File

@@ -45,7 +45,7 @@ func TestStartServer(t *testing.T) {
name: "tcp port only",
config: ServerOptions{
Network: "tcp",
Addr: ":45987",
Addr: "45987",
Keys: []ssh.PublicKey{sshPubKey},
},
},
@@ -88,7 +88,7 @@ func TestStartServer(t *testing.T) {
name: "bad key should fail",
config: ServerOptions{
Network: "tcp",
Addr: ":45987",
Addr: "45987",
Keys: []ssh.PublicKey{sshBadPubKey},
},
wantErr: true,
@@ -98,7 +98,7 @@ func TestStartServer(t *testing.T) {
name: "good key still good",
config: ServerOptions{
Network: "tcp",
Addr: ":45987",
Addr: "45987",
Keys: []ssh.PublicKey{sshPubKey},
},
},

View File

@@ -184,9 +184,11 @@ func (a *Agent) getSystemStats() system.Stats {
}
}
// temperatures
// TODO: maybe refactor to methods on systemStats
a.updateTemperatures(&systemStats)
// temperatures (skip if sensors whitelist is set to empty string)
err = a.updateTemperatures(&systemStats)
if err != nil {
slog.Error("Error getting temperatures", "err", err)
}
// GPU data
if a.gpuManager != nil {
@@ -203,9 +205,6 @@ func (a *Agent) getSystemStats() system.Stats {
for _, gpu := range gpuData {
if gpu.Temperature > 0 {
systemStats.Temperatures[gpu.Name] = gpu.Temperature
if a.primarySensor == gpu.Name {
a.systemInfo.DashboardTemp = gpu.Temperature
}
}
// update high gpu percent for dashboard
a.systemInfo.GpuPct = max(a.systemInfo.GpuPct, gpu.Usage)
@@ -224,23 +223,28 @@ func (a *Agent) getSystemStats() system.Stats {
return systemStats
}
func (a *Agent) updateTemperatures(systemStats *system.Stats) {
func (a *Agent) updateTemperatures(systemStats *system.Stats) error {
// skip if sensors whitelist is set to empty string
if a.sensorsWhitelist != nil && len(a.sensorsWhitelist) == 0 {
slog.Debug("Skipping temperature collection")
return
return nil
}
primarySensor, primarySensorIsDefined := GetEnv("PRIMARY_SENSOR")
// reset high temp
a.systemInfo.DashboardTemp = 0
// get sensor data
temps, _ := sensors.TemperaturesWithContext(a.sensorsContext)
temps, err := sensors.TemperaturesWithContext(a.sensorsContext)
if err != nil {
return err
}
slog.Debug("Temperature", "sensors", temps)
// return if no sensors
if len(temps) == 0 {
return
return nil
}
systemStats.Temperatures = make(map[string]float64, len(temps))
@@ -261,13 +265,16 @@ func (a *Agent) updateTemperatures(systemStats *system.Stats) {
}
}
// set dashboard temperature
if a.primarySensor == "" {
if primarySensorIsDefined {
if sensorName == primarySensor {
a.systemInfo.DashboardTemp = sensor.Temperature
}
} else {
a.systemInfo.DashboardTemp = max(a.systemInfo.DashboardTemp, sensor.Temperature)
} else if a.primarySensor == sensorName {
a.systemInfo.DashboardTemp = sensor.Temperature
}
systemStats.Temperatures[sensorName] = twoDecimals(sensor.Temperature)
}
return nil
}
// Returns the size of the ZFS ARC memory cache in bytes

View File

@@ -26,7 +26,8 @@ type alertInfo struct {
// startWorker is a long-running goroutine that processes alert tasks
// every x seconds. It must be running to process status alerts.
func (am *AlertManager) startWorker() {
tick := time.Tick(15 * time.Second)
// no special reason for 13 seconds
tick := time.Tick(13 * time.Second)
for {
select {
case <-am.stopChan:
@@ -63,12 +64,21 @@ func (am *AlertManager) StopWorker() {
}
// HandleStatusAlerts manages the logic when system status changes.
func (am *AlertManager) HandleStatusAlerts(newStatus string, systemRecord *core.Record) error {
if newStatus != "up" && newStatus != "down" {
func (am *AlertManager) HandleStatusAlerts(newStatus string, oldSystemRecord *core.Record) error {
switch newStatus {
case "up":
if oldSystemRecord.GetString("status") != "down" {
return nil
}
case "down":
if oldSystemRecord.GetString("status") != "up" {
return nil
}
default:
return nil
}
alertRecords, err := am.getSystemStatusAlerts(systemRecord.Id)
alertRecords, err := am.getSystemStatusAlerts(oldSystemRecord.Id)
if err != nil {
return err
}
@@ -76,7 +86,7 @@ func (am *AlertManager) HandleStatusAlerts(newStatus string, systemRecord *core.
return nil
}
systemName := systemRecord.GetString("name")
systemName := oldSystemRecord.GetString("name")
if newStatus == "down" {
am.handleSystemDown(systemName, alertRecords)
} else {

View File

@@ -4,6 +4,7 @@ import (
"beszel/internal/entities/system"
"fmt"
"net/url"
"slices"
"strings"
"time"
@@ -14,7 +15,7 @@ import (
"github.com/spf13/cast"
)
func (am *AlertManager) HandleSystemAlerts(systemRecord *core.Record, data *system.CombinedData) error {
func (am *AlertManager) HandleSystemAlerts(systemRecord *core.Record, systemInfo system.Info, temperatures map[string]float64, extraFs map[string]*system.FsStats) error {
alertRecords, err := am.app.FindAllRecords("alerts",
dbx.NewExp("system={:system}", dbx.Params{"system": systemRecord.Id}),
)
@@ -34,15 +35,15 @@ func (am *AlertManager) HandleSystemAlerts(systemRecord *core.Record, data *syst
switch name {
case "CPU":
val = data.Info.Cpu
val = systemInfo.Cpu
case "Memory":
val = data.Info.MemPct
val = systemInfo.MemPct
case "Bandwidth":
val = data.Info.Bandwidth
val = systemInfo.Bandwidth
unit = " MB/s"
case "Disk":
maxUsedPct := data.Info.DiskPct
for _, fs := range data.Stats.ExtraFs {
maxUsedPct := systemInfo.DiskPct
for _, fs := range extraFs {
usedPct := fs.DiskUsed / fs.DiskTotal * 100
if usedPct > maxUsedPct {
maxUsedPct = usedPct
@@ -50,10 +51,14 @@ func (am *AlertManager) HandleSystemAlerts(systemRecord *core.Record, data *syst
}
val = maxUsedPct
case "Temperature":
if data.Info.DashboardTemp < 1 {
if temperatures == nil {
continue
}
val = data.Info.DashboardTemp
for _, temp := range temperatures {
if temp > val {
val = temp
}
}
unit = "°C"
}
@@ -69,8 +74,13 @@ func (am *AlertManager) HandleSystemAlerts(systemRecord *core.Record, data *syst
}
min := max(1, cast.ToUint8(alertRecord.Get("min")))
// add time to alert time to make sure it's slighty after record creation
time := now.Add(-time.Duration(min) * time.Minute)
if time.Before(oldestTime) {
oldestTime = time
}
alert := SystemAlertData{
validAlerts = append(validAlerts, SystemAlertData{
systemRecord: systemRecord,
alertRecord: alertRecord,
name: name,
@@ -78,22 +88,9 @@ func (am *AlertManager) HandleSystemAlerts(systemRecord *core.Record, data *syst
val: val,
threshold: threshold,
triggered: triggered,
time: time,
min: min,
}
// send alert immediately if min is 1 - no need to sum up values.
if min == 1 {
alert.triggered = val > threshold
go am.sendSystemAlert(alert)
continue
}
alert.time = now.Add(-time.Duration(min) * time.Minute)
if alert.time.Before(oldestTime) {
oldestTime = alert.time
}
validAlerts = append(validAlerts, alert)
})
}
systemStats := []struct {
@@ -114,7 +111,7 @@ func (am *AlertManager) HandleSystemAlerts(systemRecord *core.Record, data *syst
)).
OrderBy("created").
All(&systemStats)
if err != nil || len(systemStats) == 0 {
if err != nil {
return err
}
@@ -122,14 +119,13 @@ func (am *AlertManager) HandleSystemAlerts(systemRecord *core.Record, data *syst
oldestRecordTime := systemStats[0].Created.Time()
// log.Println("oldestRecordTime", oldestRecordTime.String())
// Filter validAlerts to keep only those with time newer than oldestRecord
filteredAlerts := make([]SystemAlertData, 0, len(validAlerts))
for _, alert := range validAlerts {
if alert.time.After(oldestRecordTime) {
filteredAlerts = append(filteredAlerts, alert)
// delete from validAlerts if time is older than oldestRecord
for i := range validAlerts {
if validAlerts[i].time.Before(oldestRecordTime) {
// log.Println("deleting alert - time is older than oldestRecord", validAlerts[i].name, oldestRecordTime, validAlerts[i].time)
validAlerts = slices.Delete(validAlerts, i, i+1)
}
}
validAlerts = filteredAlerts
if len(validAlerts) == 0 {
// log.Println("no valid alerts found")
@@ -167,7 +163,7 @@ func (am *AlertManager) HandleSystemAlerts(systemRecord *core.Record, data *syst
alert.val += stats.NetSent + stats.NetRecv
case "Disk":
if alert.mapSums == nil {
alert.mapSums = make(map[string]float32, len(data.Stats.ExtraFs)+1)
alert.mapSums = make(map[string]float32, len(extraFs)+1)
}
// add root disk
if _, ok := alert.mapSums["root"]; !ok {
@@ -175,7 +171,7 @@ func (am *AlertManager) HandleSystemAlerts(systemRecord *core.Record, data *syst
}
alert.mapSums["root"] += float32(stats.Disk)
// add extra disks
for key, fs := range data.Stats.ExtraFs {
for key, fs := range extraFs {
if _, ok := alert.mapSums[key]; !ok {
alert.mapSums[key] = 0.0
}

View File

@@ -1,7 +1,5 @@
package system
// TODO: this is confusing, make common package with common/types common/helpers etc
import (
"beszel/internal/entities/container"
"time"

View File

@@ -6,6 +6,7 @@ import (
"log"
"os"
"path/filepath"
"strconv"
"github.com/pocketbase/dbx"
"github.com/pocketbase/pocketbase/apis"
@@ -21,13 +22,12 @@ type Config struct {
type SystemConfig struct {
Name string `yaml:"name"`
Host string `yaml:"host"`
Port uint16 `yaml:"port,omitempty"`
Port uint16 `yaml:"port"`
Users []string `yaml:"users"`
}
// Syncs systems with the config.yml file
func syncSystemsWithConfig(e *core.ServeEvent) error {
h := e.App
func (h *Hub) syncSystemsWithConfig() error {
configPath := filepath.Join(h.DataDir(), "config.yml")
configData, err := os.ReadFile(configPath)
if err != nil {
@@ -89,16 +89,16 @@ func syncSystemsWithConfig(e *core.ServeEvent) error {
return err
}
// Create a map of existing systems
// Create a map of existing systems for easy lookup
existingSystemsMap := make(map[string]*core.Record)
for _, system := range existingSystems {
key := system.GetString("name") + system.GetString("host") + system.GetString("port")
key := system.GetString("host") + ":" + system.GetString("port")
existingSystemsMap[key] = system
}
// Process systems from config
for _, sysConfig := range config.Systems {
key := sysConfig.Name + sysConfig.Host + cast.ToString(sysConfig.Port)
key := sysConfig.Host + ":" + strconv.Itoa(int(sysConfig.Port))
if existingSystem, ok := existingSystemsMap[key]; ok {
// Update existing system
existingSystem.Set("name", sysConfig.Name)

View File

@@ -4,46 +4,67 @@ package hub
import (
"beszel"
"beszel/internal/alerts"
"beszel/internal/hub/systems"
"beszel/internal/entities/system"
"beszel/internal/records"
"beszel/internal/users"
"beszel/site"
"context"
"crypto/ed25519"
"encoding/pem"
"fmt"
"io/fs"
"log"
"net"
"net/http"
"net/http/httputil"
"net/url"
"os"
"strings"
"time"
"github.com/goccy/go-json"
"github.com/pocketbase/pocketbase"
"github.com/pocketbase/pocketbase/apis"
"github.com/pocketbase/pocketbase/core"
"github.com/pocketbase/pocketbase/plugins/migratecmd"
"github.com/spf13/cobra"
"golang.org/x/crypto/ssh"
)
type Hub struct {
core.App
*alerts.AlertManager
um *users.UserManager
rm *records.RecordManager
sm *systems.SystemManager
pubKey string
appURL string
*pocketbase.PocketBase
sshClientConfig *ssh.ClientConfig
pubKey string
am *alerts.AlertManager
um *users.UserManager
rm *records.RecordManager
systemStats *core.Collection
containerStats *core.Collection
appURL string
}
// NewHub creates a new Hub instance with default configuration
func NewHub(app core.App) *Hub {
hub := &Hub{}
hub.App = app
func NewHub() *Hub {
var hub Hub
hub.PocketBase = pocketbase.NewWithConfig(pocketbase.Config{
DefaultDataDir: beszel.AppName + "_data",
})
hub.AlertManager = alerts.NewAlertManager(hub)
hub.RootCmd.Version = beszel.Version
hub.RootCmd.Use = beszel.AppName
hub.RootCmd.Short = ""
// add update command
hub.RootCmd.AddCommand(&cobra.Command{
Use: "update",
Short: "Update " + beszel.AppName + " to the latest version",
Run: Update,
})
hub.am = alerts.NewAlertManager(hub)
hub.um = users.NewUserManager(hub)
hub.rm = records.NewRecordManager(hub)
hub.sm = systems.NewSystemManager(hub)
hub.appURL, _ = GetEnv("APP_URL")
return hub
return &hub
}
// GetEnv retrieves an environment variable with a "BESZEL_HUB_" prefix, or falls back to the unprefixed key.
@@ -55,192 +76,444 @@ func GetEnv(key string) (value string, exists bool) {
return os.LookupEnv(key)
}
func (h *Hub) StartHub() error {
func (h *Hub) Run() {
isDev := os.Getenv("ENV") == "dev"
h.App.OnServe().BindFunc(func(e *core.ServeEvent) error {
// initialize settings / collections
if err := h.initialize(e); err != nil {
// enable auto creation of migration files when making collection changes in the Admin UI
migratecmd.MustRegister(h, h.RootCmd, migratecmd.Config{
// (the isDev check is to enable it only during development)
Automigrate: isDev,
Dir: "../../migrations",
})
// initial setup
h.OnServe().BindFunc(func(se *core.ServeEvent) error {
// create ssh client config
err := h.createSSHClientConfig()
if err != nil {
log.Fatal(err)
}
// set general settings
settings := h.Settings()
// batch requests (for global alerts)
settings.Batch.Enabled = true
// set URL if BASE_URL env is set
if h.appURL != "" {
settings.Meta.AppURL = h.appURL
}
// set auth settings
usersCollection, err := h.FindCollectionByNameOrId("users")
if err != nil {
return err
}
// disable email auth if DISABLE_PASSWORD_AUTH env var is set
disablePasswordAuth, _ := GetEnv("DISABLE_PASSWORD_AUTH")
usersCollection.PasswordAuth.Enabled = disablePasswordAuth != "true"
usersCollection.PasswordAuth.IdentityFields = []string{"email"}
// disable oauth if no providers are configured (todo: remove this in post 0.9.0 release)
if usersCollection.OAuth2.Enabled {
usersCollection.OAuth2.Enabled = len(usersCollection.OAuth2.Providers) > 0
}
// allow oauth user creation if USER_CREATION is set
if userCreation, _ := GetEnv("USER_CREATION"); userCreation == "true" {
cr := "@request.context = 'oauth2'"
usersCollection.CreateRule = &cr
} else {
usersCollection.CreateRule = nil
}
if err := h.Save(usersCollection); err != nil {
return err
}
// sync systems with config
if err := syncSystemsWithConfig(e); err != nil {
return err
h.syncSystemsWithConfig()
return se.Next()
})
// serve web ui
h.OnServe().BindFunc(func(se *core.ServeEvent) error {
switch isDev {
case true:
proxy := httputil.NewSingleHostReverseProxy(&url.URL{
Scheme: "http",
Host: "localhost:5173",
})
se.Router.GET("/{path...}", func(e *core.RequestEvent) error {
proxy.ServeHTTP(e.Response, e.Request)
return nil
})
default:
// parse app url
parsedURL, err := url.Parse(h.appURL)
if err != nil {
return err
}
// fix base paths in html if using subpath
basePath := strings.TrimSuffix(parsedURL.Path, "/") + "/"
indexFile, _ := fs.ReadFile(site.DistDirFS, "index.html")
indexContent := strings.ReplaceAll(string(indexFile), "./", basePath)
// set up static asset serving
staticPaths := [2]string{"/static/", "/assets/"}
serveStatic := apis.Static(site.DistDirFS, false)
// get CSP configuration
csp, cspExists := GetEnv("CSP")
// add route
se.Router.GET("/{path...}", func(e *core.RequestEvent) error {
// serve static assets if path is in staticPaths
for i := range staticPaths {
if strings.Contains(e.Request.URL.Path, staticPaths[i]) {
e.Response.Header().Set("Cache-Control", "public, max-age=2592000")
return serveStatic(e)
}
}
if cspExists {
e.Response.Header().Del("X-Frame-Options")
e.Response.Header().Set("Content-Security-Policy", csp)
}
return e.HTML(http.StatusOK, indexContent)
})
}
// register api routes
if err := h.registerApiRoutes(e); err != nil {
return err
return se.Next()
})
// set up scheduled jobs / ticker for system updates
h.OnServe().BindFunc(func(se *core.ServeEvent) error {
// 15 second ticker for system updates
go h.startSystemUpdateTicker()
// set up cron jobs
// delete old records once every hour
h.Cron().MustAdd("delete old records", "8 * * * *", h.rm.DeleteOldRecords)
// create longer records every 10 minutes
h.Cron().MustAdd("create longer records", "*/10 * * * *", func() {
if systemStats, containerStats, err := h.getCollections(); err == nil {
h.rm.CreateLongerRecords([]*core.Collection{systemStats, containerStats})
}
})
return se.Next()
})
// custom api routes
h.OnServe().BindFunc(func(se *core.ServeEvent) error {
// returns public key
se.Router.GET("/api/beszel/getkey", func(e *core.RequestEvent) error {
info, _ := e.RequestInfo()
if info.Auth == nil {
return apis.NewForbiddenError("Forbidden", nil)
}
return e.JSON(http.StatusOK, map[string]string{"key": h.pubKey, "v": beszel.Version})
})
// check if first time setup on login page
se.Router.GET("/api/beszel/first-run", func(e *core.RequestEvent) error {
total, err := h.CountRecords("users")
return e.JSON(http.StatusOK, map[string]bool{"firstRun": err == nil && total == 0})
})
// send test notification
se.Router.GET("/api/beszel/send-test-notification", h.am.SendTestNotification)
// API endpoint to get config.yml content
se.Router.GET("/api/beszel/config-yaml", h.getYamlConfig)
// create first user endpoint only needed if no users exist
if totalUsers, _ := h.CountRecords("users"); totalUsers == 0 {
se.Router.POST("/api/beszel/create-user", h.um.CreateFirstUser)
}
// register cron jobs
if err := h.registerCronJobs(e); err != nil {
return err
}
// start server
if err := h.startServer(e); err != nil {
return err
}
// start system updates
if err := h.sm.Initialize(); err != nil {
return err
return se.Next()
})
// system creation defaults
h.OnRecordCreate("systems").BindFunc(func(e *core.RecordEvent) error {
e.Record.Set("info", system.Info{})
e.Record.Set("status", "pending")
return e.Next()
})
// immediately create connection for new systems
h.OnRecordAfterCreateSuccess("systems").BindFunc(func(e *core.RecordEvent) error {
go h.updateSystem(e.Record)
return e.Next()
})
// handle default values for user / user_settings creation
h.OnRecordCreate("users").BindFunc(h.um.InitializeUserRole)
h.OnRecordCreate("user_settings").BindFunc(h.um.InitializeUserSettings)
// empty info for systems that are paused
h.OnRecordUpdate("systems").BindFunc(func(e *core.RecordEvent) error {
if e.Record.GetString("status") == "paused" {
e.Record.Set("info", system.Info{})
}
return e.Next()
})
// TODO: move to users package
// handle default values for user / user_settings creation
h.App.OnRecordCreate("users").BindFunc(h.um.InitializeUserRole)
h.App.OnRecordCreate("user_settings").BindFunc(h.um.InitializeUserSettings)
// do things after a systems record is updated
h.OnRecordAfterUpdateSuccess("systems").BindFunc(func(e *core.RecordEvent) error {
newRecord := e.Record.Fresh()
oldRecord := newRecord.Original()
newStatus := newRecord.GetString("status")
if pb, ok := h.App.(*pocketbase.PocketBase); ok {
// log.Println("Starting pocketbase")
err := pb.Start()
if err != nil {
return err
// if system is not up and connection exists, remove it
if newStatus != "up" {
h.deleteSystemConnection(newRecord)
}
}
return nil
// if system is set to pending (unpause), try to connect immediately
if newStatus == "pending" {
go h.updateSystem(newRecord)
} else {
h.am.HandleStatusAlerts(newStatus, oldRecord)
}
return e.Next()
})
// if system is deleted, close connection
h.OnRecordAfterDeleteSuccess("systems").BindFunc(func(e *core.RecordEvent) error {
h.deleteSystemConnection(e.Record)
return e.Next()
})
if err := h.Start(); err != nil {
log.Fatal(err)
}
}
// initialize sets up initial configuration (collections, settings, etc.)
func (h *Hub) initialize(e *core.ServeEvent) error {
// set general settings
settings := e.App.Settings()
// batch requests (for global alerts)
settings.Batch.Enabled = true
// set URL if BASE_URL env is set
if h.appURL != "" {
settings.Meta.AppURL = h.appURL
func (h *Hub) startSystemUpdateTicker() {
c := time.Tick(15 * time.Second)
for range c {
h.updateSystems()
}
// set auth settings
usersCollection, err := e.App.FindCollectionByNameOrId("users")
if err != nil {
return err
}
func (h *Hub) updateSystems() {
records, err := h.FindRecordsByFilter(
"2hz5ncl8tizk5nx", // systems collection
"status != 'paused'", // filter
"updated", // sort
-1, // limit
0, // offset
)
// log.Println("records", len(records))
if err != nil || len(records) == 0 {
// h.Logger().Error("Failed to query systems")
return
}
// disable email auth if DISABLE_PASSWORD_AUTH env var is set
disablePasswordAuth, _ := GetEnv("DISABLE_PASSWORD_AUTH")
usersCollection.PasswordAuth.Enabled = disablePasswordAuth != "true"
usersCollection.PasswordAuth.IdentityFields = []string{"email"}
// disable oauth if no providers are configured (todo: remove this in post 0.9.0 release)
if usersCollection.OAuth2.Enabled {
usersCollection.OAuth2.Enabled = len(usersCollection.OAuth2.Providers) > 0
fiftySecondsAgo := time.Now().UTC().Add(-50 * time.Second)
batchSize := len(records)/4 + 1
done := 0
for _, record := range records {
// break if batch size reached or if the system was updated less than 50 seconds ago
if done >= batchSize || record.GetDateTime("updated").Time().After(fiftySecondsAgo) {
break
}
// don't increment for down systems to avoid them jamming the queue
// because they're always first when sorted by least recently updated
if record.GetString("status") != "down" {
done++
}
go h.updateSystem(record)
}
// allow oauth user creation if USER_CREATION is set
if userCreation, _ := GetEnv("USER_CREATION"); userCreation == "true" {
cr := "@request.context = 'oauth2'"
usersCollection.CreateRule = &cr
}
func (h *Hub) updateSystem(record *core.Record) {
var client *ssh.Client
var err error
// check if system connection exists
if existingClient, ok := h.Store().GetOk(record.Id); ok {
client = existingClient.(*ssh.Client)
} else {
usersCollection.CreateRule = nil
// create system connection
client, err = h.createSystemConnection(record)
if err != nil {
if record.GetString("status") != "down" {
h.Logger().Error("Failed to connect:", "err", err.Error(), "system", record.GetString("host"), "port", record.GetString("port"))
h.updateSystemStatus(record, "down")
}
return
}
h.Store().Set(record.Id, client)
}
if err := e.App.Save(usersCollection); err != nil {
// get system stats from agent
var systemData system.CombinedData
if err := h.requestJsonFromAgent(client, &systemData); err != nil {
if err.Error() == "bad client" {
// if previous connection was closed, try again
h.Logger().Error("Existing SSH connection closed. Retrying...", "host", record.GetString("host"), "port", record.GetString("port"))
h.deleteSystemConnection(record)
time.Sleep(time.Millisecond * 100)
h.updateSystem(record)
return
}
h.Logger().Error("Failed to get system stats: ", "err", err.Error())
h.updateSystemStatus(record, "down")
return
}
// update system record
record.Set("status", "up")
record.Set("info", systemData.Info)
if err := h.SaveNoValidate(record); err != nil {
h.Logger().Error("Failed to update record: ", "err", err.Error())
}
// add system_stats and container_stats records
if systemStats, containerStats, err := h.getCollections(); err != nil {
h.Logger().Error("Failed to get collections: ", "err", err.Error())
} else {
// add new system_stats record
systemStatsRecord := core.NewRecord(systemStats)
systemStatsRecord.Set("system", record.Id)
systemStatsRecord.Set("stats", systemData.Stats)
systemStatsRecord.Set("type", "1m")
if err := h.SaveNoValidate(systemStatsRecord); err != nil {
h.Logger().Error("Failed to save record: ", "err", err.Error())
}
// add new container_stats record
if len(systemData.Containers) > 0 {
containerStatsRecord := core.NewRecord(containerStats)
containerStatsRecord.Set("system", record.Id)
containerStatsRecord.Set("stats", systemData.Containers)
containerStatsRecord.Set("type", "1m")
if err := h.SaveNoValidate(containerStatsRecord); err != nil {
h.Logger().Error("Failed to save record: ", "err", err.Error())
}
}
}
// system info alerts
if err := h.am.HandleSystemAlerts(record, systemData.Info, systemData.Stats.Temperatures, systemData.Stats.ExtraFs); err != nil {
h.Logger().Error("System alerts error", "err", err.Error())
}
}
// return system_stats and container_stats collections
func (h *Hub) getCollections() (*core.Collection, *core.Collection, error) {
if h.systemStats == nil {
systemStats, err := h.FindCollectionByNameOrId("system_stats")
if err != nil {
return nil, nil, err
}
h.systemStats = systemStats
}
if h.containerStats == nil {
containerStats, err := h.FindCollectionByNameOrId("container_stats")
if err != nil {
return nil, nil, err
}
h.containerStats = containerStats
}
return h.systemStats, h.containerStats, nil
}
// set system to specified status and save record
func (h *Hub) updateSystemStatus(record *core.Record, status string) {
if record.Fresh().GetString("status") != status {
record.Set("status", status)
if err := h.SaveNoValidate(record); err != nil {
h.Logger().Error("Failed to update record: ", "err", err.Error())
}
}
}
// delete system connection from map and close connection
func (h *Hub) deleteSystemConnection(record *core.Record) {
if client, ok := h.Store().GetOk(record.Id); ok {
if sshClient := client.(*ssh.Client); sshClient != nil {
sshClient.Close()
}
h.Store().Remove(record.Id)
}
}
func (h *Hub) createSystemConnection(record *core.Record) (*ssh.Client, error) {
network := "tcp"
host := record.GetString("host")
if strings.HasPrefix(host, "/") {
network = "unix"
} else {
host = net.JoinHostPort(host, record.GetString("port"))
}
client, err := ssh.Dial(network, host, h.sshClientConfig)
if err != nil {
return nil, err
}
return client, nil
}
func (h *Hub) createSSHClientConfig() error {
key, err := h.getSSHKey()
if err != nil {
h.Logger().Error("Failed to get SSH key: ", "err", err.Error())
return err
}
// allow all users to access systems if SHARE_ALL_SYSTEMS is set
systemsCollection, err := e.App.FindCachedCollectionByNameOrId("systems")
// Create the Signer for this private key.
signer, err := ssh.ParsePrivateKey(key)
if err != nil {
return err
}
shareAllSystems, _ := GetEnv("SHARE_ALL_SYSTEMS")
systemsReadRule := "@request.auth.id != \"\""
if shareAllSystems != "true" {
// default is to only show systems that the user id is assigned to
systemsReadRule += " && users.id ?= @request.auth.id"
h.sshClientConfig = &ssh.ClientConfig{
User: "u",
Auth: []ssh.AuthMethod{
ssh.PublicKeys(signer),
},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
Timeout: 4 * time.Second,
}
updateDeleteRule := systemsReadRule + " && @request.auth.role != \"readonly\""
systemsCollection.ListRule = &systemsReadRule
systemsCollection.ViewRule = &systemsReadRule
systemsCollection.UpdateRule = &updateDeleteRule
systemsCollection.DeleteRule = &updateDeleteRule
if err := e.App.Save(systemsCollection); err != nil {
return nil
}
// Fetches system stats from the agent and decodes the json data into the provided struct
func (h *Hub) requestJsonFromAgent(client *ssh.Client, systemData *system.CombinedData) error {
session, err := newSessionWithTimeout(client, 4*time.Second)
if err != nil {
return fmt.Errorf("bad client")
}
defer session.Close()
stdout, err := session.StdoutPipe()
if err != nil {
return err
}
return nil
}
// startServer starts the server for the Beszel (not PocketBase)
func (h *Hub) startServer(se *core.ServeEvent) error {
// TODO: exclude dev server from production binary
switch h.IsDev() {
case true:
proxy := httputil.NewSingleHostReverseProxy(&url.URL{
Scheme: "http",
Host: "localhost:5173",
})
se.Router.GET("/{path...}", func(e *core.RequestEvent) error {
proxy.ServeHTTP(e.Response, e.Request)
return nil
})
default:
// parse app url
parsedURL, err := url.Parse(h.appURL)
if err != nil {
return err
}
// fix base paths in html if using subpath
basePath := strings.TrimSuffix(parsedURL.Path, "/") + "/"
indexFile, _ := fs.ReadFile(site.DistDirFS, "index.html")
indexContent := strings.ReplaceAll(string(indexFile), "./", basePath)
indexContent = strings.Replace(indexContent, "{{V}}", beszel.Version, 1)
// set up static asset serving
staticPaths := [2]string{"/static/", "/assets/"}
serveStatic := apis.Static(site.DistDirFS, false)
// get CSP configuration
csp, cspExists := GetEnv("CSP")
// add route
se.Router.GET("/{path...}", func(e *core.RequestEvent) error {
// serve static assets if path is in staticPaths
for i := range staticPaths {
if strings.Contains(e.Request.URL.Path, staticPaths[i]) {
e.Response.Header().Set("Cache-Control", "public, max-age=2592000")
return serveStatic(e)
}
}
if cspExists {
e.Response.Header().Del("X-Frame-Options")
e.Response.Header().Set("Content-Security-Policy", csp)
}
return e.HTML(http.StatusOK, indexContent)
})
if err := session.Shell(); err != nil {
return err
}
return nil
}
// registerCronJobs sets up scheduled tasks
func (h *Hub) registerCronJobs(_ *core.ServeEvent) error {
// delete old records once every hour
h.Cron().MustAdd("delete old records", "8 * * * *", h.rm.DeleteOldRecords)
// create longer records every 10 minutes
h.Cron().MustAdd("create longer records", "*/10 * * * *", h.rm.CreateLongerRecords)
return nil
}
// 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})
})
// check if first time setup on login page
se.Router.GET("/api/beszel/first-run", func(e *core.RequestEvent) error {
total, err := h.CountRecords("users")
return e.JSON(http.StatusOK, map[string]bool{"firstRun": err == nil && total == 0})
})
// send test notification
se.Router.GET("/api/beszel/send-test-notification", h.SendTestNotification)
// API endpoint to get config.yml content
se.Router.GET("/api/beszel/config-yaml", h.getYamlConfig)
// create first user endpoint only needed if no users exist
if totalUsers, _ := h.CountRecords("users"); totalUsers == 0 {
se.Router.POST("/api/beszel/create-user", h.um.CreateFirstUser)
if err := json.NewDecoder(stdout).Decode(systemData); err != nil {
return err
}
// wait for the session to complete
if err := session.Wait(); err != nil {
return err
}
return nil
}
// generates key pair if it doesn't exist and returns private key bytes
func (h *Hub) GetSSHKey() ([]byte, error) {
// Adds timeout to SSH session creation to avoid hanging in case of network issues
func newSessionWithTimeout(client *ssh.Client, timeout time.Duration) (*ssh.Session, error) {
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
// use goroutine to create the session
sessionChan := make(chan *ssh.Session, 1)
errChan := make(chan error, 1)
go func() {
if session, err := client.NewSession(); err != nil {
errChan <- err
} else {
sessionChan <- session
}
}()
select {
case session := <-sessionChan:
return session, nil
case err := <-errChan:
return nil, err
case <-ctx.Done():
return nil, fmt.Errorf("session creation timed out")
}
}
func (h *Hub) getSSHKey() ([]byte, error) {
dataDir := h.DataDir()
// check if the key pair already exists
existingKey, err := os.ReadFile(dataDir + "/id_ed25519")

View File

@@ -1,435 +0,0 @@
package systems
import (
"beszel/internal/entities/system"
"context"
"fmt"
"net"
"strings"
"time"
"github.com/goccy/go-json"
"github.com/pocketbase/pocketbase/core"
"github.com/pocketbase/pocketbase/tools/store"
"golang.org/x/crypto/ssh"
)
const (
up string = "up"
down string = "down"
paused string = "paused"
pending string = "pending"
interval int = 60_000
sessionTimeout = 4 * time.Second
)
type SystemManager struct {
hub hubLike
systems *store.Store[string, *System]
sshConfig *ssh.ClientConfig
}
type System struct {
Id string `db:"id"`
Host string `db:"host"`
Port string `db:"port"`
Status string `db:"status"`
manager *SystemManager
client *ssh.Client
data *system.CombinedData
ctx context.Context
cancel context.CancelFunc
}
type hubLike interface {
core.App
GetSSHKey() ([]byte, error)
HandleSystemAlerts(systemRecord *core.Record, data *system.CombinedData) error
HandleStatusAlerts(status string, systemRecord *core.Record) error
}
func NewSystemManager(hub hubLike) *SystemManager {
return &SystemManager{
systems: store.New(map[string]*System{}),
hub: hub,
}
}
// Initialize initializes the system manager.
// It binds the event hooks and starts updating existing systems.
func (sm *SystemManager) Initialize() error {
sm.bindEventHooks()
// ssh setup
key, err := sm.hub.GetSSHKey()
if err != nil {
return err
}
if err := sm.createSSHClientConfig(key); err != nil {
return err
}
// start updating existing systems
var systems []*System
err = sm.hub.DB().NewQuery("SELECT id, host, port, status FROM systems WHERE status != 'paused'").All(&systems)
if err != nil || len(systems) == 0 {
return err
}
go func() {
// time between initial system updates
delta := interval / max(1, len(systems))
delta = min(delta, 2_000)
sleepTime := time.Duration(delta) * time.Millisecond
for _, system := range systems {
time.Sleep(sleepTime)
_ = sm.AddSystem(system)
}
}()
return nil
}
func (sm *SystemManager) bindEventHooks() {
sm.hub.OnRecordCreate("systems").BindFunc(sm.onRecordCreate)
sm.hub.OnRecordAfterCreateSuccess("systems").BindFunc(sm.onRecordAfterCreateSuccess)
sm.hub.OnRecordUpdate("systems").BindFunc(sm.onRecordUpdate)
sm.hub.OnRecordAfterUpdateSuccess("systems").BindFunc(sm.onRecordAfterUpdateSuccess)
sm.hub.OnRecordAfterDeleteSuccess("systems").BindFunc(sm.onRecordAfterDeleteSuccess)
}
// Runs before the record is committed to the database
func (sm *SystemManager) onRecordCreate(e *core.RecordEvent) error {
e.Record.Set("info", system.Info{})
e.Record.Set("status", pending)
return e.Next()
}
// Runs after the record is committed to the database
func (sm *SystemManager) onRecordAfterCreateSuccess(e *core.RecordEvent) error {
if err := sm.AddRecord(e.Record); err != nil {
e.App.Logger().Error("Error adding record", "err", err)
}
return e.Next()
}
// Runs before the record is updated
func (sm *SystemManager) onRecordUpdate(e *core.RecordEvent) error {
if e.Record.GetString("status") == paused {
e.Record.Set("info", system.Info{})
}
return e.Next()
}
// Runs after the record is updated
func (sm *SystemManager) onRecordAfterUpdateSuccess(e *core.RecordEvent) error {
newStatus := e.Record.GetString("status")
switch newStatus {
case paused:
sm.RemoveSystem(e.Record.Id)
return e.Next()
case pending:
if err := sm.AddRecord(e.Record); err != nil {
e.App.Logger().Error("Error adding record", "err", err)
}
return e.Next()
}
system, ok := sm.systems.GetOk(e.Record.Id)
if !ok {
return sm.AddRecord(e.Record)
}
prevStatus := system.Status
system.Status = newStatus
// system alerts if system is up
if system.Status == up {
if err := sm.hub.HandleSystemAlerts(e.Record, system.data); err != nil {
e.App.Logger().Error("Error handling system alerts", "err", err)
}
}
if (system.Status == down && prevStatus == up) || (system.Status == up && prevStatus == down) {
if err := sm.hub.HandleStatusAlerts(system.Status, e.Record); err != nil {
e.App.Logger().Error("Error handling status alerts", "err", err)
}
}
return e.Next()
}
// Runs after the record is deleted
func (sm *SystemManager) onRecordAfterDeleteSuccess(e *core.RecordEvent) error {
sm.RemoveSystem(e.Record.Id)
return e.Next()
}
// AddSystem adds a system to the manager
func (sm *SystemManager) AddSystem(sys *System) error {
if sm.systems.Has(sys.Id) {
return fmt.Errorf("system exists")
}
if sys.Id == "" || sys.Host == "" {
return fmt.Errorf("system is missing required fields")
}
sys.manager = sm
sys.ctx, sys.cancel = context.WithCancel(context.Background())
sys.data = &system.CombinedData{}
sm.systems.Set(sys.Id, sys)
go sys.StartUpdater()
return nil
}
// RemoveSystem removes a system from the manager
func (sm *SystemManager) RemoveSystem(systemID string) error {
system, ok := sm.systems.GetOk(systemID)
if !ok {
return fmt.Errorf("system not found")
}
// cancel the context to signal stop
if system.cancel != nil {
system.cancel()
}
system.resetSSHClient()
sm.systems.Remove(systemID)
return nil
}
// AddRecord adds a record to the system manager.
// It first removes any existing system with the same ID, then creates a new System
// instance from the record data and adds it to the manager.
// This function is typically called when a new system is created or when an existing
// system's status changes to pending.
func (sm *SystemManager) AddRecord(record *core.Record) (err error) {
_ = sm.RemoveSystem(record.Id)
system := &System{
Id: record.Id,
Status: record.GetString("status"),
Host: record.GetString("host"),
Port: record.GetString("port"),
}
return sm.AddSystem(system)
}
// StartUpdater starts the system updater.
// It first fetches the data from the agent then updates the records.
// If the data is not found or the system is down, it sets the system down.
func (sys *System) StartUpdater() {
if sys.data == nil {
sys.data = &system.CombinedData{}
}
if err := sys.update(); err != nil {
_ = sys.setDown(err)
}
c := time.Tick(time.Duration(interval) * time.Millisecond)
for {
select {
case <-sys.ctx.Done():
return
case <-c:
err := sys.update()
if err != nil {
_ = sys.setDown(err)
}
}
}
}
// update updates the system data and records.
// It first fetches the data from the agent then updates the records.
func (sys *System) update() error {
_, err := sys.fetchDataFromAgent()
if err == nil {
_, err = sys.createRecords()
}
return err
}
// createRecords updates the system record and adds system_stats and container_stats records
func (sys *System) createRecords() (*core.Record, error) {
systemRecord, err := sys.getRecord()
if err != nil {
return nil, err
}
hub := sys.manager.hub
// add system_stats and container_stats records
systemStats, err := hub.FindCachedCollectionByNameOrId("system_stats")
if err != nil {
return nil, err
}
systemStatsRecord := core.NewRecord(systemStats)
systemStatsRecord.Set("system", systemRecord.Id)
systemStatsRecord.Set("stats", sys.data.Stats)
systemStatsRecord.Set("type", "1m")
if err := hub.SaveNoValidate(systemStatsRecord); err != nil {
return nil, err
}
// add new container_stats record
if len(sys.data.Containers) > 0 {
containerStats, err := hub.FindCachedCollectionByNameOrId("container_stats")
if err != nil {
return nil, err
}
containerStatsRecord := core.NewRecord(containerStats)
containerStatsRecord.Set("system", systemRecord.Id)
containerStatsRecord.Set("stats", sys.data.Containers)
containerStatsRecord.Set("type", "1m")
if err := hub.SaveNoValidate(containerStatsRecord); err != nil {
return nil, err
}
}
// update system record (do this last because it triggers alerts and we need above records to be inserted first)
systemRecord.Set("status", up)
systemRecord.Set("info", sys.data.Info)
if err := hub.SaveNoValidate(systemRecord); err != nil {
return nil, err
}
return systemRecord, nil
}
// getRecord retrieves the system record from the database.
// If the record is not found or the system is paused, it removes the system from the manager.
func (sys *System) getRecord() (*core.Record, error) {
record, err := sys.manager.hub.FindRecordById("systems", sys.Id)
if err != nil || record == nil {
_ = sys.manager.RemoveSystem(sys.Id)
return nil, err
}
return record, nil
}
// setDown marks a system as down in the database.
// It takes the original error that caused the system to go down and returns any error
// encountered during the process of updating the system status.
func (sys *System) setDown(OriginalError error) error {
if sys.Status == down {
return nil
}
record, err := sys.getRecord()
if err != nil {
return err
}
sys.manager.hub.Logger().Error("System down", "system", record.GetString("name"), "err", OriginalError)
record.Set("status", down)
err = sys.manager.hub.SaveNoValidate(record)
if err != nil {
return err
}
return nil
}
// fetchDataFromAgent fetches the data from the agent.
// It first creates a new SSH client if it doesn't exist or the system is down.
// Then it creates a new SSH session and fetches the data from the agent.
// If the data is not found or the system is down, it sets the system down.
func (sys *System) fetchDataFromAgent() (*system.CombinedData, error) {
maxRetries := 1
for attempt := 0; attempt <= maxRetries; attempt++ {
if sys.client == nil || sys.Status == down {
if err := sys.createSSHClient(); err != nil {
return nil, err
}
}
session, err := sys.createSessionWithTimeout(4 * time.Second)
if err != nil {
if attempt >= maxRetries {
return nil, err
}
sys.manager.hub.Logger().Warn("Session closed. Retrying...", "host", sys.Host, "port", sys.Port, "err", err)
sys.resetSSHClient()
continue
}
defer session.Close()
stdout, err := session.StdoutPipe()
if err != nil {
return nil, err
}
if err := session.Shell(); err != nil {
return nil, err
}
// this is initialized in startUpdater, should never be nil
*sys.data = system.CombinedData{}
if err := json.NewDecoder(stdout).Decode(sys.data); err != nil {
return nil, err
}
// wait for the session to complete
if err := session.Wait(); err != nil {
return nil, err
}
return sys.data, nil
}
// this should never be reached due to the return in the loop
return nil, fmt.Errorf("failed to fetch data")
}
func (sm *SystemManager) createSSHClientConfig(key []byte) error {
signer, err := ssh.ParsePrivateKey(key)
if err != nil {
return err
}
sm.sshConfig = &ssh.ClientConfig{
User: "u",
Auth: []ssh.AuthMethod{
ssh.PublicKeys(signer),
},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
Timeout: sessionTimeout,
}
return nil
}
// createSSHClient creates a new SSH client for the system
func (s *System) createSSHClient() error {
network := "tcp"
host := s.Host
if strings.HasPrefix(host, "/") {
network = "unix"
} else {
host = net.JoinHostPort(host, s.Port)
}
var err error
s.client, err = ssh.Dial(network, host, s.manager.sshConfig)
if err != nil {
return err
}
return nil
}
// createSessionWithTimeout creates a new SSH session with a timeout to avoid hanging
// in case of network issues
func (sys *System) createSessionWithTimeout(timeout time.Duration) (*ssh.Session, error) {
if sys.client == nil {
return nil, fmt.Errorf("client not initialized")
}
ctx, cancel := context.WithTimeout(sys.ctx, timeout)
defer cancel()
sessionChan := make(chan *ssh.Session, 1)
errChan := make(chan error, 1)
go func() {
if session, err := sys.client.NewSession(); err != nil {
errChan <- err
} else {
sessionChan <- session
}
}()
select {
case session := <-sessionChan:
return session, nil
case err := <-errChan:
return nil, err
case <-ctx.Done():
return nil, fmt.Errorf("timeout")
}
}
// resetSSHClient closes the SSH connection and resets the client to nil
func (sys *System) resetSSHClient() {
if sys.client != nil {
sys.client.Close()
}
sys.client = nil
}

View File

@@ -1,440 +0,0 @@
//go:build testing
// +build testing
package systems_test
import (
"beszel/internal/entities/container"
"beszel/internal/entities/system"
"beszel/internal/hub/systems"
"beszel/internal/tests"
"fmt"
"sync"
"testing"
"time"
"github.com/pocketbase/dbx"
"github.com/pocketbase/pocketbase/core"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
// createTestSystem creates a test system record with a unique host name
// and returns the created record and any error
func createTestSystem(t *testing.T, hub *tests.TestHub, options map[string]any) (*core.Record, error) {
collection, err := hub.FindCachedCollectionByNameOrId("systems")
if err != nil {
return nil, err
}
// get user record
var firstUser *core.Record
users, err := hub.FindAllRecords("users", dbx.NewExp("id != ''"))
if err != nil {
t.Fatal(err)
}
if len(users) > 0 {
firstUser = users[0]
}
// Generate a unique host name to ensure we're adding a new system
uniqueHost := fmt.Sprintf("test-host-%d.example.com", time.Now().UnixNano())
// Create the record
record := core.NewRecord(collection)
record.Set("name", uniqueHost)
record.Set("host", uniqueHost)
record.Set("port", "45876")
record.Set("status", "pending")
record.Set("users", []string{firstUser.Id})
// Apply any custom options
for key, value := range options {
record.Set(key, value)
}
// Save the record to the database
err = hub.Save(record)
if err != nil {
return nil, err
}
return record, nil
}
func TestSystemManagerIntegration(t *testing.T) {
// Create a test hub
hub, err := tests.NewTestHub()
if err != nil {
t.Fatal(err)
}
defer hub.Cleanup()
// Create independent system manager
sm := systems.NewSystemManager(hub)
assert.NotNil(t, sm)
// Test initialization
sm.Initialize()
// Test collection existence. todo: move to hub package tests
t.Run("CollectionExistence", func(t *testing.T) {
// Verify that required collections exist
systems, err := hub.FindCachedCollectionByNameOrId("systems")
require.NoError(t, err)
assert.NotNil(t, systems)
systemStats, err := hub.FindCachedCollectionByNameOrId("system_stats")
require.NoError(t, err)
assert.NotNil(t, systemStats)
containerStats, err := hub.FindCachedCollectionByNameOrId("container_stats")
require.NoError(t, err)
assert.NotNil(t, containerStats)
})
// Test adding a system record
t.Run("AddRecord", func(t *testing.T) {
var wg sync.WaitGroup
wg.Add(2)
// Get the count before adding the system
countBefore := sm.GetSystemCount()
// record should be pending on create
hub.OnRecordCreate("systems").BindFunc(func(e *core.RecordEvent) error {
record := e.Record
if record.GetString("name") == "welcometoarcoampm" {
assert.Equal(t, "pending", e.Record.GetString("status"), "System status should be 'pending'")
wg.Done()
}
return e.Next()
})
// record should be down on update
hub.OnRecordAfterUpdateSuccess("systems").BindFunc(func(e *core.RecordEvent) error {
record := e.Record
if record.GetString("name") == "welcometoarcoampm" {
assert.Equal(t, "down", e.Record.GetString("status"), "System status should be 'pending'")
wg.Done()
}
return e.Next()
})
// Create a test system with the first user assigned
record, err := createTestSystem(t, hub, map[string]any{
"name": "welcometoarcoampm",
"host": "localhost",
"port": "33914",
})
require.NoError(t, err)
wg.Wait()
// system should be down if grabbed from the store
assert.Equal(t, "down", sm.GetSystemStatusFromStore(record.Id), "System status should be 'down'")
// Check that the system count increased
countAfter := sm.GetSystemCount()
assert.Equal(t, countBefore+1, countAfter, "System count should increase after adding a system via event hook")
// Verify the system was added by checking if it exists
assert.True(t, sm.HasSystem(record.Id), "System should exist in the store")
// Verify the system host and port
host, port := sm.GetSystemHostPort(record.Id)
assert.Equal(t, record.Get("host"), host, "System host should match")
assert.Equal(t, record.Get("port"), port, "System port should match")
// Verify the system is in the list of all system IDs
ids := sm.GetAllSystemIDs()
assert.Contains(t, ids, record.Id, "System ID should be in the list of all system IDs")
// Verify the system was added by checking if removing it works
err = sm.RemoveSystem(record.Id)
assert.NoError(t, err, "System should exist and be removable")
// Verify the system no longer exists
assert.False(t, sm.HasSystem(record.Id), "System should not exist in the store after removal")
// Verify the system is not in the list of all system IDs
newIds := sm.GetAllSystemIDs()
assert.NotContains(t, newIds, record.Id, "System ID should not be in the list of all system IDs after removal")
})
t.Run("RemoveSystem", func(t *testing.T) {
// Get the count before adding the system
countBefore := sm.GetSystemCount()
// Create a test system record
record, err := createTestSystem(t, hub, map[string]any{})
require.NoError(t, err)
// Verify the system count increased
countAfterAdd := sm.GetSystemCount()
assert.Equal(t, countBefore+1, countAfterAdd, "System count should increase after adding a system via event hook")
// Verify the system exists
assert.True(t, sm.HasSystem(record.Id), "System should exist in the store")
// Remove the system
err = sm.RemoveSystem(record.Id)
assert.NoError(t, err)
// Check that the system count decreased
countAfterRemove := sm.GetSystemCount()
assert.Equal(t, countAfterAdd-1, countAfterRemove, "System count should decrease after removing a system")
// Verify the system no longer exists
assert.False(t, sm.HasSystem(record.Id), "System should not exist in the store after removal")
// Verify the system is not in the list of all system IDs
ids := sm.GetAllSystemIDs()
assert.NotContains(t, ids, record.Id, "System ID should not be in the list of all system IDs after removal")
// Verify the system status is empty
status := sm.GetSystemStatusFromStore(record.Id)
assert.Equal(t, "", status, "System status should be empty after removal")
// Try to remove it again - should return an error since it's already removed
err = sm.RemoveSystem(record.Id)
assert.Error(t, err)
})
t.Run("NewRecordPending", func(t *testing.T) {
// Create a test system
record, err := createTestSystem(t, hub, map[string]any{})
require.NoError(t, err)
// Add the record to the system manager
err = sm.AddRecord(record)
require.NoError(t, err)
// Test filtering records by status - should be "pending" now
filter := "status = 'pending'"
pendingSystems, err := hub.FindRecordsByFilter("systems", filter, "-created", 0, 0, nil)
require.NoError(t, err)
assert.GreaterOrEqual(t, len(pendingSystems), 1)
})
t.Run("SystemStatusUpdate", func(t *testing.T) {
// Create a test system record
record, err := createTestSystem(t, hub, map[string]any{})
require.NoError(t, err)
// Add the record to the system manager
err = sm.AddRecord(record)
require.NoError(t, err)
// Test status changes
initialStatus := sm.GetSystemStatusFromStore(record.Id)
// Set a new status
sm.SetSystemStatusInDB(record.Id, "up")
// Verify status was updated
newStatus := sm.GetSystemStatusFromStore(record.Id)
assert.Equal(t, "up", newStatus, "System status should be updated to 'up'")
assert.NotEqual(t, initialStatus, newStatus, "Status should have changed")
// Verify the database was updated
updatedRecord, err := hub.FindRecordById("systems", record.Id)
require.NoError(t, err)
assert.Equal(t, "up", updatedRecord.Get("status"), "Database status should match")
})
t.Run("HandleSystemData", func(t *testing.T) {
// Create a test system record
record, err := createTestSystem(t, hub, map[string]any{})
require.NoError(t, err)
// Create test system data
testData := &system.CombinedData{
Info: system.Info{
Hostname: "data-test.example.com",
KernelVersion: "5.15.0-generic",
Cores: 4,
Threads: 8,
CpuModel: "Test CPU",
Uptime: 3600,
Cpu: 25.5,
MemPct: 40.2,
DiskPct: 60.0,
Bandwidth: 100.0,
AgentVersion: "1.0.0",
},
Stats: system.Stats{
Cpu: 25.5,
Mem: 16384.0,
MemUsed: 6553.6,
MemPct: 40.0,
DiskTotal: 1024000.0,
DiskUsed: 614400.0,
DiskPct: 60.0,
NetworkSent: 1024.0,
NetworkRecv: 2048.0,
},
Containers: []*container.Stats{},
}
// Test handling system data. todo: move to hub/alerts package tests
err = hub.HandleSystemAlerts(record, testData)
assert.NoError(t, err)
})
t.Run("ErrorHandling", func(t *testing.T) {
// Try to add a non-existent record
nonExistentId := "non_existent_id"
err := sm.RemoveSystem(nonExistentId)
assert.Error(t, err)
// Try to add a system with invalid host
system := &systems.System{
Host: "",
}
err = sm.AddSystem(system)
assert.Error(t, err)
})
t.Run("DeleteRecord", func(t *testing.T) {
var wg sync.WaitGroup
wg.Add(2)
runs := 0
hub.OnRecordUpdate("systems").BindFunc(func(e *core.RecordEvent) error {
runs++
record := e.Record
if record.GetString("name") == "deadflagblues" {
if runs == 1 {
assert.Equal(t, "up", e.Record.GetString("status"), "System status should be 'up'")
wg.Done()
} else if runs == 2 {
assert.Equal(t, "paused", e.Record.GetString("status"), "System status should be 'paused'")
wg.Done()
}
}
return e.Next()
})
// Create a test system record
record, err := createTestSystem(t, hub, map[string]any{
"name": "deadflagblues",
})
require.NoError(t, err)
// Verify the system exists
assert.True(t, sm.HasSystem(record.Id), "System should exist in the store")
// set the status manually to up
sm.SetSystemStatusInDB(record.Id, "up")
// verify the status is up
assert.Equal(t, "up", sm.GetSystemStatusFromStore(record.Id), "System status should be 'up'")
// Set the status to "paused" which should cause it to be deleted from the store
sm.SetSystemStatusInDB(record.Id, "paused")
wg.Wait()
// Verify the system no longer exists
assert.False(t, sm.HasSystem(record.Id), "System should not exist in the store after deletion")
})
t.Run("ConcurrentOperations", func(t *testing.T) {
// Create a test system
record, err := createTestSystem(t, hub, map[string]any{})
require.NoError(t, err)
// Run concurrent operations
const goroutines = 5
var wg sync.WaitGroup
wg.Add(goroutines)
for i := range goroutines {
go func(i int) {
defer wg.Done()
// Alternate between different operations
switch i % 3 {
case 0:
status := fmt.Sprintf("status-%d", i)
sm.SetSystemStatusInDB(record.Id, status)
case 1:
_ = sm.GetSystemStatusFromStore(record.Id)
case 2:
_, _ = sm.GetSystemHostPort(record.Id)
}
}(i)
}
wg.Wait()
// Verify system still exists and is in a valid state
assert.True(t, sm.HasSystem(record.Id), "System should still exist after concurrent operations")
status := sm.GetSystemStatusFromStore(record.Id)
assert.NotEmpty(t, status, "System should have a status after concurrent operations")
})
t.Run("ContextCancellation", func(t *testing.T) {
// Create a test system record
record, err := createTestSystem(t, hub, map[string]any{})
require.NoError(t, err)
// Verify the system exists in the store
assert.True(t, sm.HasSystem(record.Id), "System should exist in the store")
// Store the original context and cancel function
originalCtx, originalCancel, err := sm.GetSystemContextFromStore(record.Id)
assert.NoError(t, err)
// Ensure the context is not nil
assert.NotNil(t, originalCtx, "System context should not be nil")
assert.NotNil(t, originalCancel, "System cancel function should not be nil")
// Cancel the context
originalCancel()
// Wait a short time for cancellation to propagate
time.Sleep(10 * time.Millisecond)
// Verify the context is done
select {
case <-originalCtx.Done():
// Context was properly cancelled
default:
t.Fatal("Context was not cancelled")
}
// Verify the system is still in the store (cancellation shouldn't remove it)
assert.True(t, sm.HasSystem(record.Id), "System should still exist after context cancellation")
// Explicitly remove the system
err = sm.RemoveSystem(record.Id)
assert.NoError(t, err, "RemoveSystem should succeed")
// Verify the system is removed
assert.False(t, sm.HasSystem(record.Id), "System should be removed after RemoveSystem")
// Try to remove it again - should return an error
err = sm.RemoveSystem(record.Id)
assert.Error(t, err, "RemoveSystem should fail for non-existent system")
// Add the system back
err = sm.AddRecord(record)
require.NoError(t, err, "AddRecord should succeed")
// Verify the system is back in the store
assert.True(t, sm.HasSystem(record.Id), "System should exist after re-adding")
// Verify a new context was created
newCtx, newCancel, err := sm.GetSystemContextFromStore(record.Id)
assert.NoError(t, err)
assert.NotNil(t, newCtx, "New system context should not be nil")
assert.NotNil(t, newCancel, "New system cancel function should not be nil")
assert.NotEqual(t, originalCtx, newCtx, "New context should be different from original")
// Clean up
err = sm.RemoveSystem(record.Id)
assert.NoError(t, err)
})
}

View File

@@ -1,117 +0,0 @@
//go:build testing
// +build testing
package systems
import (
entities "beszel/internal/entities/system"
"context"
"fmt"
)
// GetSystemCount returns the number of systems in the store
func (sm *SystemManager) GetSystemCount() int {
return sm.systems.Length()
}
// HasSystem checks if a system with the given ID exists in the store
func (sm *SystemManager) HasSystem(systemID string) bool {
return sm.systems.Has(systemID)
}
// GetSystemStatusFromStore returns the status of a system with the given ID
// Returns an empty string if the system doesn't exist
func (sm *SystemManager) GetSystemStatusFromStore(systemID string) string {
sys, ok := sm.systems.GetOk(systemID)
if !ok {
return ""
}
return sys.Status
}
// GetSystemContextFromStore returns the context and cancel function for a system
func (sm *SystemManager) GetSystemContextFromStore(systemID string) (context.Context, context.CancelFunc, error) {
sys, ok := sm.systems.GetOk(systemID)
if !ok {
return nil, nil, fmt.Errorf("no system")
}
return sys.ctx, sys.cancel, nil
}
// GetSystemFromStore returns a store from the system
func (sm *SystemManager) GetSystemFromStore(systemID string) (*System, error) {
sys, ok := sm.systems.GetOk(systemID)
if !ok {
return nil, fmt.Errorf("no system")
}
return sys, nil
}
// GetAllSystemIDs returns a slice of all system IDs in the store
func (sm *SystemManager) GetAllSystemIDs() []string {
data := sm.systems.GetAll()
ids := make([]string, 0, len(data))
for id := range data {
ids = append(ids, id)
}
return ids
}
// GetSystemData returns the combined data for a system with the given ID
// Returns nil if the system doesn't exist
// This method is intended for testing
func (sm *SystemManager) GetSystemData(systemID string) *entities.CombinedData {
sys, ok := sm.systems.GetOk(systemID)
if !ok {
return nil
}
return sys.data
}
// GetSystemHostPort returns the host and port for a system with the given ID
// Returns empty strings if the system doesn't exist
func (sm *SystemManager) GetSystemHostPort(systemID string) (string, string) {
sys, ok := sm.systems.GetOk(systemID)
if !ok {
return "", ""
}
return sys.Host, sys.Port
}
// DisableAutoUpdater disables the automatic updater for a system
// This is intended for testing
// Returns false if the system doesn't exist
// func (sm *SystemManager) DisableAutoUpdater(systemID string) bool {
// sys, ok := sm.systems.GetOk(systemID)
// if !ok {
// return false
// }
// if sys.cancel != nil {
// sys.cancel()
// sys.cancel = nil
// }
// return true
// }
// SetSystemStatusInDB sets the status of a system directly and updates the database record
// This is intended for testing
// Returns false if the system doesn't exist
func (sm *SystemManager) SetSystemStatusInDB(systemID string, status string) bool {
if !sm.HasSystem(systemID) {
return false
}
// Update the database record
record, err := sm.hub.FindRecordById("systems", systemID)
if err != nil {
return false
}
record.Set("status", status)
err = sm.hub.Save(record)
if err != nil {
return false
}
return true
}

View File

@@ -4,15 +4,14 @@ package records
import (
"beszel/internal/entities/container"
"beszel/internal/entities/system"
"fmt"
"log"
"math"
"strings"
"time"
"github.com/goccy/go-json"
"github.com/pocketbase/dbx"
"github.com/pocketbase/pocketbase/core"
"github.com/pocketbase/pocketbase/tools/types"
)
type RecordManager struct {
@@ -26,6 +25,11 @@ type LongerRecordData struct {
minShorterRecords int
}
type RecordDeletionData struct {
recordType string
retention time.Duration
}
type RecordStats []struct {
Stats []byte `db:"stats"`
}
@@ -35,7 +39,7 @@ func NewRecordManager(app core.App) *RecordManager {
}
// Create longer records by averaging shorter records
func (rm *RecordManager) CreateLongerRecords() {
func (rm *RecordManager) CreateLongerRecords(collections []*core.Collection) {
// start := time.Now()
longerRecordData := []LongerRecordData{
{
@@ -66,24 +70,14 @@ func (rm *RecordManager) CreateLongerRecords() {
}
// wrap the operations in a transaction
rm.app.RunInTransaction(func(txApp core.App) error {
var err error
collections := [2]*core.Collection{}
collections[0], err = txApp.FindCachedCollectionByNameOrId("system_stats")
activeSystems, err := txApp.FindAllRecords("systems", dbx.NewExp("status = 'up'"))
if err != nil {
log.Println("failed to get active systems", "err", err.Error())
return err
}
collections[1], err = txApp.FindCachedCollectionByNameOrId("container_stats")
if err != nil {
return err
}
var systems []struct {
Id string `db:"id"`
}
txApp.DB().NewQuery("SELECT id FROM systems WHERE status='up'").All(&systems)
// loop through all active systems, time periods, and collections
for _, system := range systems {
for _, system := range activeSystems {
// log.Println("processing system", system.GetString("name"))
for i := range longerRecordData {
recordData := longerRecordData[i]
@@ -98,7 +92,7 @@ func (rm *RecordManager) CreateLongerRecords() {
if recordData.longerType != "10m" {
lastLongerRecord, err := txApp.FindFirstRecordByFilter(
collection.Id,
"system = {:system} && type = {:type} && created > {:created}",
"type = {:type} && system = {:system} && created > {:created}",
dbx.Params{"type": recordData.longerType, "system": system.Id, "created": longerRecordPeriod},
)
// continue if longer record exists
@@ -114,7 +108,7 @@ func (rm *RecordManager) CreateLongerRecords() {
Select("stats").
From(collection.Name).
AndWhere(dbx.NewExp(
"system={:system} AND type={:type} AND created > {:created}",
"type={:type} AND system={:system} AND created > {:created}",
dbx.Params{
"type": recordData.shorterType,
"system": system.Id,
@@ -125,6 +119,7 @@ func (rm *RecordManager) CreateLongerRecords() {
// continue if not enough shorter records
if err != nil || len(stats) < recordData.minShorterRecords {
// log.Println("not enough shorter records. continue.", len(allShorterRecords), recordData.expectedShorterRecords)
continue
}
// average the shorter records and create longer record
@@ -138,7 +133,7 @@ func (rm *RecordManager) CreateLongerRecords() {
longerRecord.Set("stats", rm.AverageContainerStats(stats))
}
if err := txApp.SaveNoValidate(longerRecord); err != nil {
log.Println("failed to save longer record", "err", err)
log.Println("failed to save longer record", "err", err.Error())
}
}
}
@@ -151,20 +146,16 @@ func (rm *RecordManager) CreateLongerRecords() {
}
// Calculate the average stats of a list of system_stats records without reflect
func (rm *RecordManager) AverageSystemStats(records RecordStats) *system.Stats {
sum := &system.Stats{}
func (rm *RecordManager) AverageSystemStats(records RecordStats) system.Stats {
sum := system.Stats{}
count := float64(len(records))
// use different counter for temps in case some records don't have them
tempCount := float64(0)
// Temporary struct for unmarshaling
stats := &system.Stats{}
// Accumulate totals
var stats system.Stats
for i := range records {
*stats = system.Stats{} // Reset tempStats for unmarshaling
if err := json.Unmarshal(records[i].Stats, stats); err != nil {
continue
}
stats = system.Stats{} // Zero the struct before unmarshalling
json.Unmarshal(records[i].Stats, &stats)
sum.Cpu += stats.Cpu
sum.Mem += stats.Mem
sum.MemUsed += stats.MemUsed
@@ -180,25 +171,26 @@ func (rm *RecordManager) AverageSystemStats(records RecordStats) *system.Stats {
sum.DiskWritePs += stats.DiskWritePs
sum.NetworkSent += stats.NetworkSent
sum.NetworkRecv += stats.NetworkRecv
// Set peak values
// set peak values
sum.MaxCpu = max(sum.MaxCpu, stats.MaxCpu, stats.Cpu)
sum.MaxNetworkSent = max(sum.MaxNetworkSent, stats.MaxNetworkSent, stats.NetworkSent)
sum.MaxNetworkRecv = max(sum.MaxNetworkRecv, stats.MaxNetworkRecv, stats.NetworkRecv)
sum.MaxDiskReadPs = max(sum.MaxDiskReadPs, stats.MaxDiskReadPs, stats.DiskReadPs)
sum.MaxDiskWritePs = max(sum.MaxDiskWritePs, stats.MaxDiskWritePs, stats.DiskWritePs)
// Accumulate temperatures
// add temps to sum
if stats.Temperatures != nil {
if sum.Temperatures == nil {
sum.Temperatures = make(map[string]float64, len(stats.Temperatures))
}
tempCount++
for key, value := range stats.Temperatures {
if _, ok := sum.Temperatures[key]; !ok {
sum.Temperatures[key] = 0
}
sum.Temperatures[key] += value
}
}
// Accumulate extra filesystem stats
// add extra fs to sum
if stats.ExtraFs != nil {
if sum.ExtraFs == nil {
sum.ExtraFs = make(map[string]*system.FsStats, len(stats.ExtraFs))
@@ -207,26 +199,25 @@ func (rm *RecordManager) AverageSystemStats(records RecordStats) *system.Stats {
if _, ok := sum.ExtraFs[key]; !ok {
sum.ExtraFs[key] = &system.FsStats{}
}
fs := sum.ExtraFs[key]
fs.DiskTotal += value.DiskTotal
fs.DiskUsed += value.DiskUsed
fs.DiskWritePs += value.DiskWritePs
fs.DiskReadPs += value.DiskReadPs
fs.MaxDiskReadPS = max(fs.MaxDiskReadPS, value.MaxDiskReadPS, value.DiskReadPs)
fs.MaxDiskWritePS = max(fs.MaxDiskWritePS, value.MaxDiskWritePS, value.DiskWritePs)
sum.ExtraFs[key].DiskTotal += value.DiskTotal
sum.ExtraFs[key].DiskUsed += value.DiskUsed
sum.ExtraFs[key].DiskWritePs += value.DiskWritePs
sum.ExtraFs[key].DiskReadPs += value.DiskReadPs
// peak values
sum.ExtraFs[key].MaxDiskReadPS = max(sum.ExtraFs[key].MaxDiskReadPS, value.MaxDiskReadPS, value.DiskReadPs)
sum.ExtraFs[key].MaxDiskWritePS = max(sum.ExtraFs[key].MaxDiskWritePS, value.MaxDiskWritePS, value.DiskWritePs)
}
}
// Accumulate GPU data
// add GPU data
if stats.GPUData != nil {
if sum.GPUData == nil {
sum.GPUData = make(map[string]system.GPUData, len(stats.GPUData))
}
for id, value := range stats.GPUData {
gpu, ok := sum.GPUData[id]
if !ok {
gpu = system.GPUData{Name: value.Name}
if _, ok := sum.GPUData[id]; !ok {
sum.GPUData[id] = system.GPUData{Name: value.Name}
}
gpu := sum.GPUData[id]
gpu.Temperature += value.Temperature
gpu.MemoryUsed += value.MemoryUsed
gpu.MemoryTotal += value.MemoryTotal
@@ -238,67 +229,76 @@ func (rm *RecordManager) AverageSystemStats(records RecordStats) *system.Stats {
}
}
// Compute averages in place
if count > 0 {
sum.Cpu = twoDecimals(sum.Cpu / count)
sum.Mem = twoDecimals(sum.Mem / count)
sum.MemUsed = twoDecimals(sum.MemUsed / count)
sum.MemPct = twoDecimals(sum.MemPct / count)
sum.MemBuffCache = twoDecimals(sum.MemBuffCache / count)
sum.MemZfsArc = twoDecimals(sum.MemZfsArc / count)
sum.Swap = twoDecimals(sum.Swap / count)
sum.SwapUsed = twoDecimals(sum.SwapUsed / count)
sum.DiskTotal = twoDecimals(sum.DiskTotal / count)
sum.DiskUsed = twoDecimals(sum.DiskUsed / count)
sum.DiskPct = twoDecimals(sum.DiskPct / count)
sum.DiskReadPs = twoDecimals(sum.DiskReadPs / count)
sum.DiskWritePs = twoDecimals(sum.DiskWritePs / count)
sum.NetworkSent = twoDecimals(sum.NetworkSent / count)
sum.NetworkRecv = twoDecimals(sum.NetworkRecv / count)
stats = system.Stats{
Cpu: twoDecimals(sum.Cpu / count),
Mem: twoDecimals(sum.Mem / count),
MemUsed: twoDecimals(sum.MemUsed / count),
MemPct: twoDecimals(sum.MemPct / count),
MemBuffCache: twoDecimals(sum.MemBuffCache / count),
MemZfsArc: twoDecimals(sum.MemZfsArc / count),
Swap: twoDecimals(sum.Swap / count),
SwapUsed: twoDecimals(sum.SwapUsed / count),
DiskTotal: twoDecimals(sum.DiskTotal / count),
DiskUsed: twoDecimals(sum.DiskUsed / count),
DiskPct: twoDecimals(sum.DiskPct / count),
DiskReadPs: twoDecimals(sum.DiskReadPs / count),
DiskWritePs: twoDecimals(sum.DiskWritePs / count),
NetworkSent: twoDecimals(sum.NetworkSent / count),
NetworkRecv: twoDecimals(sum.NetworkRecv / count),
MaxCpu: sum.MaxCpu,
MaxDiskReadPs: sum.MaxDiskReadPs,
MaxDiskWritePs: sum.MaxDiskWritePs,
MaxNetworkSent: sum.MaxNetworkSent,
MaxNetworkRecv: sum.MaxNetworkRecv,
}
// Average temperatures
if sum.Temperatures != nil && tempCount > 0 {
for key := range sum.Temperatures {
sum.Temperatures[key] = twoDecimals(sum.Temperatures[key] / tempCount)
}
if sum.Temperatures != nil {
stats.Temperatures = make(map[string]float64, len(sum.Temperatures))
for key, value := range sum.Temperatures {
stats.Temperatures[key] = twoDecimals(value / tempCount)
}
}
// Average extra filesystem stats
if sum.ExtraFs != nil {
for key := range sum.ExtraFs {
fs := sum.ExtraFs[key]
fs.DiskTotal = twoDecimals(fs.DiskTotal / count)
fs.DiskUsed = twoDecimals(fs.DiskUsed / count)
fs.DiskWritePs = twoDecimals(fs.DiskWritePs / count)
fs.DiskReadPs = twoDecimals(fs.DiskReadPs / count)
}
}
// Average GPU data
if sum.GPUData != nil {
for id := range sum.GPUData {
gpu := sum.GPUData[id]
gpu.Temperature = twoDecimals(gpu.Temperature / count)
gpu.MemoryUsed = twoDecimals(gpu.MemoryUsed / count)
gpu.MemoryTotal = twoDecimals(gpu.MemoryTotal / count)
gpu.Usage = twoDecimals(gpu.Usage / count)
gpu.Power = twoDecimals(gpu.Power / count)
gpu.Count = twoDecimals(gpu.Count / count)
sum.GPUData[id] = gpu
if sum.ExtraFs != nil {
stats.ExtraFs = make(map[string]*system.FsStats, len(sum.ExtraFs))
for key, value := range sum.ExtraFs {
stats.ExtraFs[key] = &system.FsStats{
DiskTotal: twoDecimals(value.DiskTotal / count),
DiskUsed: twoDecimals(value.DiskUsed / count),
DiskWritePs: twoDecimals(value.DiskWritePs / count),
DiskReadPs: twoDecimals(value.DiskReadPs / count),
MaxDiskReadPS: value.MaxDiskReadPS,
MaxDiskWritePS: value.MaxDiskWritePS,
}
}
}
return sum
if sum.GPUData != nil {
stats.GPUData = make(map[string]system.GPUData, len(sum.GPUData))
for id, value := range sum.GPUData {
stats.GPUData[id] = system.GPUData{
Name: value.Name,
Temperature: twoDecimals(value.Temperature / count),
MemoryUsed: twoDecimals(value.MemoryUsed / count),
MemoryTotal: twoDecimals(value.MemoryTotal / count),
Usage: twoDecimals(value.Usage / count),
Power: twoDecimals(value.Power / count),
Count: twoDecimals(value.Count / count),
}
}
}
return stats
}
// Calculate the average stats of a list of container_stats records
func (rm *RecordManager) AverageContainerStats(records RecordStats) []container.Stats {
sums := make(map[string]*container.Stats)
count := float64(len(records))
containerStats := make([]container.Stats, 0, 50)
var containerStats []container.Stats
for i := range records {
// reset slice
// Reset the slice length to 0, but keep the capacity
containerStats = containerStats[:0]
if err := json.Unmarshal(records[i].Stats, &containerStats); err != nil {
return []container.Stats{}
@@ -330,45 +330,38 @@ func (rm *RecordManager) AverageContainerStats(records RecordStats) []container.
// Deletes records older than what is displayed in the UI
func (rm *RecordManager) DeleteOldRecords() {
// Define the collections to process
collections := []string{"system_stats", "container_stats"}
// Define record types and their retention periods
type RecordDeletionData struct {
recordType string
retention time.Duration
}
recordData := []RecordDeletionData{
{recordType: "1m", retention: time.Hour}, // 1 hour
{recordType: "10m", retention: 12 * time.Hour}, // 12 hours
{recordType: "20m", retention: 24 * time.Hour}, // 1 day
{recordType: "120m", retention: 7 * 24 * time.Hour}, // 7 days
{recordType: "480m", retention: 30 * 24 * time.Hour}, // 30 days
{
recordType: "1m",
retention: time.Hour,
},
{
recordType: "10m",
retention: 12 * time.Hour,
},
{
recordType: "20m",
retention: 24 * time.Hour,
},
{
recordType: "120m",
retention: 7 * 24 * time.Hour,
},
{
recordType: "480m",
retention: 30 * 24 * time.Hour,
},
}
// Process each collection
for _, collection := range collections {
// Build the WHERE clause dynamically
var conditionParts []string
var params dbx.Params = make(map[string]any)
for i, rd := range recordData {
// Create parameterized condition for this record type
dateParam := fmt.Sprintf("date%d", i)
conditionParts = append(conditionParts, fmt.Sprintf("(type = '%s' AND created < {:%s})", rd.recordType, dateParam))
params[dateParam] = time.Now().UTC().Add(-rd.retention)
}
// Combine conditions with OR
conditionStr := strings.Join(conditionParts, " OR ")
// Construct the full raw query
rawQuery := fmt.Sprintf("DELETE FROM %s WHERE %s", collection, conditionStr)
// Execute the query with parameters
if _, err := rm.app.DB().NewQuery(rawQuery).Bind(params).Execute(); err != nil {
// return fmt.Errorf("failed to delete from %s: %v", collection, err)
rm.app.Logger().Error("failed to delete", "collection", collection, "error", err)
db := rm.app.NonconcurrentDB()
for _, recordData := range recordData {
for _, collectionSlug := range collections {
formattedDate := time.Now().UTC().Add(-recordData.retention).Format(types.DefaultDateLayout)
expr := dbx.NewExp("[[created]] < {:date} AND [[type]] = {:type}", dbx.Params{"date": formattedDate, "type": recordData.recordType})
_, err := db.Delete(collectionSlug, expr).Execute()
if err != nil {
rm.app.Logger().Error("Failed to delete records", "err", err.Error())
}
}
}
}

View File

@@ -1,58 +0,0 @@
// Package tests provides helpers for testing the application.
package tests
import (
"beszel/internal/hub"
"github.com/pocketbase/pocketbase/core"
"github.com/pocketbase/pocketbase/tests"
_ "github.com/pocketbase/pocketbase/migrations"
)
// TestHub is a wrapper hub instance used for testing.
type TestHub struct {
core.App
*tests.TestApp
*hub.Hub
}
// NewTestHub creates and initializes a test application instance.
//
// It is the caller's responsibility to call app.Cleanup() when the app is no longer needed.
func NewTestHub(optTestDataDir ...string) (*TestHub, error) {
var testDataDir string
if len(optTestDataDir) > 0 {
testDataDir = optTestDataDir[0]
}
return NewTestHubWithConfig(core.BaseAppConfig{
DataDir: testDataDir,
EncryptionEnv: "pb_test_env",
})
}
// NewTestHubWithConfig creates and initializes a test application instance
// from the provided config.
//
// If config.DataDir is not set it fallbacks to the default internal test data directory.
//
// config.DataDir is cloned for each new test application instance.
//
// It is the caller's responsibility to call app.Cleanup() when the app is no longer needed.
func NewTestHubWithConfig(config core.BaseAppConfig) (*TestHub, error) {
testApp, err := tests.NewTestAppWithConfig(config)
if err != nil {
return nil, err
}
hub := hub.NewHub(testApp)
t := &TestHub{
App: testApp,
TestApp: testApp,
Hub: hub,
}
return t, nil
}

File diff suppressed because it is too large Load Diff

View File

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

View File

@@ -1,676 +0,0 @@
package migrations
import (
"github.com/pocketbase/pocketbase/core"
m "github.com/pocketbase/pocketbase/migrations"
)
func init() {
m.Register(func(app core.App) error {
// delete duplicate alerts
app.DB().NewQuery(`
DELETE FROM alerts
WHERE rowid NOT IN (
SELECT MAX(rowid)
FROM alerts
GROUP BY user, system, name
);
`).Execute()
// import collections
jsonData := `[
{
"id": "elngm8x1l60zi2v",
"listRule": "@request.auth.id != \"\" && user.id = @request.auth.id",
"viewRule": "",
"createRule": "@request.auth.id != \"\" && user.id = @request.auth.id",
"updateRule": "@request.auth.id != \"\" && user.id = @request.auth.id",
"deleteRule": "@request.auth.id != \"\" && user.id = @request.auth.id",
"name": "alerts",
"type": "base",
"fields": [
{
"autogeneratePattern": "[a-z0-9]{15}",
"hidden": false,
"id": "text3208210256",
"max": 15,
"min": 15,
"name": "id",
"pattern": "^[a-z0-9]+$",
"presentable": false,
"primaryKey": true,
"required": true,
"system": true,
"type": "text"
},
{
"cascadeDelete": true,
"collectionId": "_pb_users_auth_",
"hidden": false,
"id": "hn5ly3vi",
"maxSelect": 1,
"minSelect": 0,
"name": "user",
"presentable": false,
"required": true,
"system": false,
"type": "relation"
},
{
"cascadeDelete": true,
"collectionId": "2hz5ncl8tizk5nx",
"hidden": false,
"id": "g5sl3jdg",
"maxSelect": 1,
"minSelect": 0,
"name": "system",
"presentable": false,
"required": true,
"system": false,
"type": "relation"
},
{
"hidden": false,
"id": "zj3ingrv",
"maxSelect": 1,
"name": "name",
"presentable": false,
"required": true,
"system": false,
"type": "select",
"values": [
"Status",
"CPU",
"Memory",
"Disk",
"Temperature",
"Bandwidth"
]
},
{
"hidden": false,
"id": "o2ablxvn",
"max": null,
"min": null,
"name": "value",
"onlyInt": false,
"presentable": false,
"required": false,
"system": false,
"type": "number"
},
{
"hidden": false,
"id": "fstdehcq",
"max": 60,
"min": null,
"name": "min",
"onlyInt": true,
"presentable": false,
"required": false,
"system": false,
"type": "number"
},
{
"hidden": false,
"id": "6hgdf6hs",
"name": "triggered",
"presentable": false,
"required": false,
"system": false,
"type": "bool"
},
{
"hidden": false,
"id": "autodate2990389176",
"name": "created",
"onCreate": true,
"onUpdate": false,
"presentable": false,
"system": false,
"type": "autodate"
},
{
"hidden": false,
"id": "autodate3332085495",
"name": "updated",
"onCreate": true,
"onUpdate": true,
"presentable": false,
"system": false,
"type": "autodate"
}
],
"indexes": [
"CREATE UNIQUE INDEX ` + "`" + `idx_MnhEt21L5r` + "`" + ` ON ` + "`" + `alerts` + "`" + ` (\n ` + "`" + `user` + "`" + `,\n ` + "`" + `system` + "`" + `,\n ` + "`" + `name` + "`" + `\n)"
],
"system": false
},
{
"id": "juohu4jipgc13v7",
"listRule": "@request.auth.id != \"\"",
"viewRule": null,
"createRule": null,
"updateRule": null,
"deleteRule": null,
"name": "container_stats",
"type": "base",
"fields": [
{
"autogeneratePattern": "[a-z0-9]{15}",
"hidden": false,
"id": "text3208210256",
"max": 15,
"min": 15,
"name": "id",
"pattern": "^[a-z0-9]+$",
"presentable": false,
"primaryKey": true,
"required": true,
"system": true,
"type": "text"
},
{
"cascadeDelete": true,
"collectionId": "2hz5ncl8tizk5nx",
"hidden": false,
"id": "hutcu6ps",
"maxSelect": 1,
"minSelect": 0,
"name": "system",
"presentable": false,
"required": true,
"system": false,
"type": "relation"
},
{
"hidden": false,
"id": "r39hhnil",
"maxSize": 2000000,
"name": "stats",
"presentable": false,
"required": true,
"system": false,
"type": "json"
},
{
"hidden": false,
"id": "vo7iuj96",
"maxSelect": 1,
"name": "type",
"presentable": false,
"required": true,
"system": false,
"type": "select",
"values": [
"1m",
"10m",
"20m",
"120m",
"480m"
]
},
{
"hidden": false,
"id": "autodate2990389176",
"name": "created",
"onCreate": true,
"onUpdate": false,
"presentable": false,
"system": false,
"type": "autodate"
},
{
"hidden": false,
"id": "autodate3332085495",
"name": "updated",
"onCreate": true,
"onUpdate": true,
"presentable": false,
"system": false,
"type": "autodate"
}
],
"indexes": [
"CREATE INDEX ` + "`" + `idx_d87OiXGZD8` + "`" + ` ON ` + "`" + `container_stats` + "`" + ` (\n ` + "`" + `system` + "`" + `,\n ` + "`" + `type` + "`" + `,\n ` + "`" + `created` + "`" + `\n)"
],
"system": false
},
{
"id": "ej9oowivz8b2mht",
"listRule": "@request.auth.id != \"\"",
"viewRule": null,
"createRule": null,
"updateRule": null,
"deleteRule": null,
"name": "system_stats",
"type": "base",
"fields": [
{
"autogeneratePattern": "[a-z0-9]{15}",
"hidden": false,
"id": "text3208210256",
"max": 15,
"min": 15,
"name": "id",
"pattern": "^[a-z0-9]+$",
"presentable": false,
"primaryKey": true,
"required": true,
"system": true,
"type": "text"
},
{
"cascadeDelete": true,
"collectionId": "2hz5ncl8tizk5nx",
"hidden": false,
"id": "h9sg148r",
"maxSelect": 1,
"minSelect": 0,
"name": "system",
"presentable": false,
"required": true,
"system": false,
"type": "relation"
},
{
"hidden": false,
"id": "azftn0be",
"maxSize": 2000000,
"name": "stats",
"presentable": false,
"required": true,
"system": false,
"type": "json"
},
{
"hidden": false,
"id": "m1ekhli3",
"maxSelect": 1,
"name": "type",
"presentable": false,
"required": true,
"system": false,
"type": "select",
"values": [
"1m",
"10m",
"20m",
"120m",
"480m"
]
},
{
"hidden": false,
"id": "autodate2990389176",
"name": "created",
"onCreate": true,
"onUpdate": false,
"presentable": false,
"system": false,
"type": "autodate"
},
{
"hidden": false,
"id": "autodate3332085495",
"name": "updated",
"onCreate": true,
"onUpdate": true,
"presentable": false,
"system": false,
"type": "autodate"
}
],
"indexes": [
"CREATE INDEX ` + "`" + `idx_GxIee0j` + "`" + ` ON ` + "`" + `system_stats` + "`" + ` (\n ` + "`" + `system` + "`" + `,\n ` + "`" + `type` + "`" + `,\n ` + "`" + `created` + "`" + `\n)"
],
"system": false
},
{
"id": "4afacsdnlu8q8r2",
"listRule": "@request.auth.id != \"\" && user.id = @request.auth.id",
"viewRule": null,
"createRule": "@request.auth.id != \"\" && user.id = @request.auth.id",
"updateRule": "@request.auth.id != \"\" && user.id = @request.auth.id",
"deleteRule": null,
"name": "user_settings",
"type": "base",
"fields": [
{
"autogeneratePattern": "[a-z0-9]{15}",
"hidden": false,
"id": "text3208210256",
"max": 15,
"min": 15,
"name": "id",
"pattern": "^[a-z0-9]+$",
"presentable": false,
"primaryKey": true,
"required": true,
"system": true,
"type": "text"
},
{
"cascadeDelete": true,
"collectionId": "_pb_users_auth_",
"hidden": false,
"id": "d5vztyxa",
"maxSelect": 1,
"minSelect": 0,
"name": "user",
"presentable": false,
"required": true,
"system": false,
"type": "relation"
},
{
"hidden": false,
"id": "xcx4qgqq",
"maxSize": 2000000,
"name": "settings",
"presentable": false,
"required": false,
"system": false,
"type": "json"
},
{
"hidden": false,
"id": "autodate2990389176",
"name": "created",
"onCreate": true,
"onUpdate": false,
"presentable": false,
"system": false,
"type": "autodate"
},
{
"hidden": false,
"id": "autodate3332085495",
"name": "updated",
"onCreate": true,
"onUpdate": true,
"presentable": false,
"system": false,
"type": "autodate"
}
],
"indexes": [
"CREATE UNIQUE INDEX ` + "`" + `idx_30Lwgf2` + "`" + ` ON ` + "`" + `user_settings` + "`" + ` (` + "`" + `user` + "`" + `)"
],
"system": false
},
{
"id": "2hz5ncl8tizk5nx",
"listRule": "@request.auth.id != \"\" && users.id ?= @request.auth.id",
"viewRule": "@request.auth.id != \"\" && users.id ?= @request.auth.id",
"createRule": "@request.auth.id != \"\" && users.id ?= @request.auth.id && @request.auth.role != \"readonly\"",
"updateRule": "@request.auth.id != \"\" && users.id ?= @request.auth.id && @request.auth.role != \"readonly\"",
"deleteRule": "@request.auth.id != \"\" && users.id ?= @request.auth.id && @request.auth.role != \"readonly\"",
"name": "systems",
"type": "base",
"fields": [
{
"autogeneratePattern": "[a-z0-9]{15}",
"hidden": false,
"id": "text3208210256",
"max": 15,
"min": 15,
"name": "id",
"pattern": "^[a-z0-9]+$",
"presentable": false,
"primaryKey": true,
"required": true,
"system": true,
"type": "text"
},
{
"autogeneratePattern": "",
"hidden": false,
"id": "7xloxkwk",
"max": 0,
"min": 0,
"name": "name",
"pattern": "",
"presentable": false,
"primaryKey": false,
"required": true,
"system": false,
"type": "text"
},
{
"hidden": false,
"id": "waj7seaf",
"maxSelect": 1,
"name": "status",
"presentable": false,
"required": false,
"system": false,
"type": "select",
"values": [
"up",
"down",
"paused",
"pending"
]
},
{
"autogeneratePattern": "",
"hidden": false,
"id": "ve781smf",
"max": 0,
"min": 0,
"name": "host",
"pattern": "",
"presentable": false,
"primaryKey": false,
"required": true,
"system": false,
"type": "text"
},
{
"autogeneratePattern": "",
"hidden": false,
"id": "pij0k2jk",
"max": 0,
"min": 0,
"name": "port",
"pattern": "",
"presentable": false,
"primaryKey": false,
"required": false,
"system": false,
"type": "text"
},
{
"hidden": false,
"id": "qoq64ntl",
"maxSize": 2000000,
"name": "info",
"presentable": false,
"required": false,
"system": false,
"type": "json"
},
{
"cascadeDelete": true,
"collectionId": "_pb_users_auth_",
"hidden": false,
"id": "jcarjnjj",
"maxSelect": 2147483647,
"minSelect": 0,
"name": "users",
"presentable": false,
"required": true,
"system": false,
"type": "relation"
},
{
"hidden": false,
"id": "autodate2990389176",
"name": "created",
"onCreate": true,
"onUpdate": false,
"presentable": false,
"system": false,
"type": "autodate"
},
{
"hidden": false,
"id": "autodate3332085495",
"name": "updated",
"onCreate": true,
"onUpdate": true,
"presentable": false,
"system": false,
"type": "autodate"
}
],
"indexes": [],
"system": false
},
{
"id": "_pb_users_auth_",
"listRule": "id = @request.auth.id",
"viewRule": "id = @request.auth.id",
"createRule": null,
"updateRule": null,
"deleteRule": null,
"name": "users",
"type": "auth",
"fields": [
{
"autogeneratePattern": "[a-z0-9]{15}",
"hidden": false,
"id": "text3208210256",
"max": 15,
"min": 15,
"name": "id",
"pattern": "^[a-z0-9]+$",
"presentable": false,
"primaryKey": true,
"required": true,
"system": true,
"type": "text"
},
{
"cost": 10,
"hidden": true,
"id": "password901924565",
"max": 0,
"min": 8,
"name": "password",
"pattern": "",
"presentable": false,
"required": true,
"system": true,
"type": "password"
},
{
"autogeneratePattern": "[a-zA-Z0-9_]{50}",
"hidden": true,
"id": "text2504183744",
"max": 60,
"min": 30,
"name": "tokenKey",
"pattern": "",
"presentable": false,
"primaryKey": false,
"required": true,
"system": true,
"type": "text"
},
{
"exceptDomains": null,
"hidden": false,
"id": "email3885137012",
"name": "email",
"onlyDomains": null,
"presentable": false,
"required": true,
"system": true,
"type": "email"
},
{
"hidden": false,
"id": "bool1547992806",
"name": "emailVisibility",
"presentable": false,
"required": false,
"system": true,
"type": "bool"
},
{
"hidden": false,
"id": "bool256245529",
"name": "verified",
"presentable": false,
"required": false,
"system": true,
"type": "bool"
},
{
"autogeneratePattern": "users[0-9]{6}",
"hidden": false,
"id": "text4166911607",
"max": 150,
"min": 3,
"name": "username",
"pattern": "^[\\w][\\w\\.\\-]*$",
"presentable": false,
"primaryKey": false,
"required": false,
"system": false,
"type": "text"
},
{
"hidden": false,
"id": "qkbp58ae",
"maxSelect": 1,
"name": "role",
"presentable": false,
"required": false,
"system": false,
"type": "select",
"values": [
"user",
"admin",
"readonly"
]
},
{
"hidden": false,
"id": "autodate2990389176",
"name": "created",
"onCreate": true,
"onUpdate": false,
"presentable": false,
"system": false,
"type": "autodate"
},
{
"hidden": false,
"id": "autodate3332085495",
"name": "updated",
"onCreate": true,
"onUpdate": true,
"presentable": false,
"system": false,
"type": "autodate"
}
],
"indexes": [
"CREATE UNIQUE INDEX ` + "`" + `__pb_users_auth__username_idx` + "`" + ` ON ` + "`" + `users` + "`" + ` (username COLLATE NOCASE)",
"CREATE UNIQUE INDEX ` + "`" + `__pb_users_auth__email_idx` + "`" + ` ON ` + "`" + `users` + "`" + ` (` + "`" + `email` + "`" + `) WHERE ` + "`" + `email` + "`" + ` != ''",
"CREATE UNIQUE INDEX ` + "`" + `__pb_users_auth__tokenKey_idx` + "`" + ` ON ` + "`" + `users` + "`" + ` (` + "`" + `tokenKey` + "`" + `)"
],
"system": false,
"authRule": "verified=true",
"manageRule": null
}
]`
return app.ImportCollectionsByMarshaledJSON([]byte(jsonData), false)
}, func(app core.App) error {
return nil
})
}

Binary file not shown.

View File

@@ -6,12 +6,7 @@
<link rel="icon" type="image/svg+xml" href="./static/favicon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Beszel</title>
<script>
globalThis.BESZEL = {
BASE_PATH: "%BASE_URL%",
HUB_VERSION: "{{V}}"
}
</script>
<script>window.BASE_PATH = "%BASE_URL%"</script>
</head>
<body>
<div id="app"></div>

View File

@@ -1,6 +1,6 @@
import { defineConfig } from "@lingui/cli"
import type { LinguiConfig } from "@lingui/conf"
export default defineConfig({
const config: LinguiConfig = {
locales: [
"en",
"ar",
@@ -39,4 +39,6 @@ export default defineConfig({
include: ["src"],
},
],
})
}
export default config

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
{
"name": "beszel",
"private": true,
"version": "0.10.2",
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
@@ -12,10 +12,9 @@
},
"dependencies": {
"@henrygd/queue": "^1.0.7",
"@henrygd/semaphore": "^0.0.2",
"@lingui/detect-locale": "^5.2.0",
"@lingui/macro": "^5.2.0",
"@lingui/react": "^5.2.0",
"@lingui/detect-locale": "^4.14.1",
"@lingui/macro": "^4.14.1",
"@lingui/react": "^4.14.1",
"@nanostores/react": "^0.7.3",
"@nanostores/router": "^0.11.0",
"@radix-ui/react-alert-dialog": "^1.1.6",
@@ -32,35 +31,35 @@
"@radix-ui/react-tabs": "^1.1.3",
"@radix-ui/react-toast": "^1.2.6",
"@radix-ui/react-tooltip": "^1.1.8",
"@tanstack/react-table": "^8.21.2",
"@tanstack/react-table": "^8.20.6",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"cmdk": "^1.0.4",
"d3-time": "^3.1.0",
"lucide-react": "^0.452.0",
"nanostores": "^0.11.4",
"pocketbase": "^0.25.2",
"nanostores": "^0.11.3",
"pocketbase": "^0.25.1",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"recharts": "^2.15.1",
"tailwind-merge": "^2.6.0",
"tailwindcss-animate": "^1.0.7",
"valibot": "^0.42.0"
"valibot": "^0.36.0"
},
"devDependencies": {
"@lingui/cli": "^5.2.0",
"@lingui/swc-plugin": "^5.5.0",
"@lingui/vite-plugin": "^5.2.0",
"@types/bun": "^1.2.4",
"@types/react": "^18.3.1",
"@types/react-dom": "^18.3.1",
"@vitejs/plugin-react-swc": "^3.8.0",
"@lingui/cli": "^4.14.1",
"@lingui/swc-plugin": "^4.1.0",
"@lingui/vite-plugin": "^4.14.1",
"@types/bun": "^1.2.2",
"@types/react": "^18.3.18",
"@types/react-dom": "^18.3.5",
"@vitejs/plugin-react-swc": "^3.7.2",
"autoprefixer": "^10.4.20",
"postcss": "^8.5.3",
"postcss": "^8.5.1",
"tailwindcss": "^3.4.17",
"tailwindcss-rtl": "^0.9.0",
"typescript": "^5.8.2",
"vite": "^6.2.0"
"typescript": "^5.7.3",
"vite": "^5.4.14"
},
"overrides": {
"@nanostores/router": {

View File

@@ -1,5 +1,3 @@
import { Trans } from "@lingui/react/macro";
import { t } from "@lingui/core/macro";
import { Button } from "@/components/ui/button"
import {
Dialog,
@@ -16,8 +14,9 @@ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/comp
import { Input } from "@/components/ui/input"
import { Label } from "@/components/ui/label"
import { $publicKey, pb } from "@/lib/stores"
import { cn, copyToClipboard, isReadOnlyUser, useLocalStorage } from "@/lib/utils"
import { cn, copyToClipboard, isReadOnlyUser } from "@/lib/utils"
import { i18n } from "@lingui/core"
import { t, Trans } from "@lingui/macro"
import { useStore } from "@nanostores/react"
import { ChevronDownIcon, Copy, PlusIcon } from "lucide-react"
import { memo, useRef, useState } from "react"
@@ -62,13 +61,13 @@ function copyDockerCompose(port = "45876", publicKey: string) {
# monitor other disks / partitions by mounting a folder in /extra-filesystems
# - /mnt/disk/.beszel:/extra-filesystems/sda1:ro
environment:
LISTEN: ${port}
PORT: ${port}
KEY: "${publicKey}"`)
}
function copyDockerRun(port = "45876", publicKey: string) {
copyToClipboard(
`docker run -d --name beszel-agent --network host --restart unless-stopped -v /var/run/docker.sock:/var/run/docker.sock:ro -e KEY="${publicKey}" -e LISTEN=${port} henrygd/beszel-agent:latest`
`docker run -d --name beszel-agent --network host --restart unless-stopped -v /var/run/docker.sock:/var/run/docker.sock:ro -e KEY="${publicKey}" -e PORT=${port} henrygd/beszel-agent:latest`
)
}
@@ -92,7 +91,6 @@ export const SystemDialog = memo(({ setOpen, system }: { setOpen: (open: boolean
const port = useRef<HTMLInputElement>(null)
const [hostValue, setHostValue] = useState(system?.host ?? "")
const isUnixSocket = hostValue.startsWith("/")
const [tab, setTab] = useLocalStorage("as-tab", "docker")
async function handleSubmit(e: SubmitEvent) {
e.preventDefault()
@@ -120,7 +118,7 @@ export const SystemDialog = memo(({ setOpen, system }: { setOpen: (open: boolean
setHostValue(system?.host ?? "")
}}
>
<Tabs defaultValue={tab} onValueChange={setTab}>
<Tabs defaultValue="docker">
<DialogHeader>
<DialogTitle className="mb-2">
{system ? `${t`Edit`} ${system?.name}` : <Trans>Add New System</Trans>}
@@ -142,7 +140,7 @@ export const SystemDialog = memo(({ setOpen, system }: { setOpen: (open: boolean
</DialogDescription>
</TabsContent>
{/* Binary */}
<TabsContent value="binary" tabIndex={-1}>
<TabsContent value="binary">
<DialogDescription className="mb-4 leading-normal w-0 min-w-full">
<Trans>
The agent must be running on the system to connect. Copy the installation command for the agent below.
@@ -261,12 +259,12 @@ const CopyButton = memo((props: CopyButtonProps) => {
<DropdownMenuContent align="end">
{props.dropdownUrl ? (
<DropdownMenuItem asChild>
<a href={props.dropdownUrl} className="cursor-pointer" target="_blank" rel="noopener noreferrer">
<a href={props.dropdownUrl} target="_blank" rel="noopener noreferrer">
{props.dropdownText}
</a>
</DropdownMenuItem>
) : (
<DropdownMenuItem onClick={props.dropdownOnClick} className="cursor-pointer">{props.dropdownText}</DropdownMenuItem>
<DropdownMenuItem onClick={props.dropdownOnClick}>{props.dropdownText}</DropdownMenuItem>
)}
</DropdownMenuContent>
</DropdownMenu>

View File

@@ -1,8 +1,6 @@
import { t } from "@lingui/core/macro";
import { Trans } from "@lingui/react/macro";
import { memo, useMemo, useState } from "react"
import { memo, useState } from "react"
import { useStore } from "@nanostores/react"
import { $alerts } from "@/lib/stores"
import { $alerts, $systems } from "@/lib/stores"
import {
Dialog,
DialogTrigger,
@@ -19,114 +17,104 @@ import { Link } from "../router"
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
import { Checkbox } from "../ui/checkbox"
import { SystemAlert, SystemAlertGlobal } from "./alerts-system"
import { Trans, t } from "@lingui/macro"
export default memo(function AlertsButton({ system }: { system: SystemRecord }) {
const alerts = useStore($alerts)
const [opened, setOpened] = useState(false)
const hasAlert = alerts.some((alert) => alert.system === system.id)
const systemAlerts = alerts.filter((alert) => alert.system === system.id) as AlertRecord[]
const active = systemAlerts.length > 0
return useMemo(
() => (
<Dialog>
<DialogTrigger asChild>
<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,
})}
/>
</Button>
</DialogTrigger>
<DialogContent className="max-h-full overflow-auto max-w-[35rem]">
{opened && <AlertDialogContent system={system} />}
</DialogContent>
</Dialog>
),
[opened, hasAlert]
return (
<Dialog>
<DialogTrigger asChild>
<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": active,
})}
/>
</Button>
</DialogTrigger>
<DialogContent className="max-h-full overflow-auto max-w-[35rem]">
{opened && <TheContent data={{ system, alerts, systemAlerts }} />}
</DialogContent>
</Dialog>
)
})
function AlertDialogContent({ system }: { system: SystemRecord }) {
const alerts = useStore($alerts)
function TheContent({
data: { system, alerts, systemAlerts },
}: {
data: { system: SystemRecord; alerts: AlertRecord[]; systemAlerts: AlertRecord[] }
}) {
const [overwriteExisting, setOverwriteExisting] = useState<boolean | "indeterminate">(false)
const systems = $systems.get()
// 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
const data = Object.keys(alertInfo).map((key) => {
const alert = alertInfo[key as keyof typeof alertInfo]
return {
key: key as keyof typeof alertInfo,
alert,
system,
}
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="/settings/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])
return (
<>
<DialogHeader>
<DialogTitle className="text-xl">
<Trans>Alerts</Trans>
</DialogTitle>
<DialogDescription>
<Trans>
See{" "}
<Link href="/settings/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.key} 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.key} data={d} overwrite={overwriteExisting} alerts={alerts} systems={systems} />
))}
</div>
</TabsContent>
</Tabs>
</>
)
}

View File

@@ -1,20 +1,18 @@
import { t } from "@lingui/core/macro"
import { Trans, Plural } from "@lingui/react/macro"
import { $alerts, $systems, pb } from "@/lib/stores"
import { 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 { lazy, Suspense, useRef, useState } from "react"
import { toast } from "../ui/use-toast"
import { BatchService } from "pocketbase"
import { getSemaphore } from "@henrygd/semaphore"
import { RecordOptions } from "pocketbase"
import { Trans, t, Plural } from "@lingui/macro"
interface AlertData {
checked?: boolean
val?: number
min?: number
updateAlert?: (checked: boolean, value: number, min: number) => void
name: keyof typeof alertInfo
key: keyof typeof alertInfo
alert: AlertInfo
system: SystemRecord
}
@@ -37,7 +35,7 @@ export function SystemAlert({
systemAlerts: AlertRecord[]
data: AlertData
}) {
const alert = systemAlerts.find((alert) => alert.name === data.name)
const alert = systemAlerts.find((alert) => alert.name === data.key)
data.updateAlert = async (checked: boolean, value: number, min: number) => {
try {
@@ -49,7 +47,7 @@ export function SystemAlert({
pb.collection("alerts").create({
system: system.id,
user: pb.authStore.record!.id,
name: data.name,
name: data.key,
value: value,
min: min,
})
@@ -68,150 +66,99 @@ export function SystemAlert({
return <AlertContent data={data} />
}
export const SystemAlertGlobal = ({ data, overwrite }: { data: AlertData; overwrite: boolean | "indeterminate" }) => {
export function SystemAlertGlobal({
data,
overwrite,
alerts,
systems,
}: {
data: AlertData
overwrite: boolean | "indeterminate"
alerts: AlertRecord[]
systems: SystemRecord[]
}) {
const systemsWithExistingAlerts = useRef<{ set: Set<string>; populatedSet: boolean }>({
set: new Set(),
populatedSet: false,
})
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 { set, populatedSet } = systemsWithExistingAlerts.current
const recordData: Partial<AlertRecord> = {
value,
min,
triggered: false,
}
// if overwrite checked, make sure all alerts will be overwritten
if (overwrite) {
set.clear()
}
const batch = batchWrapper("alerts", 25)
const systems = $systems.get()
const currentAlerts = $alerts.get()
const recordData: Partial<AlertRecord> = {
value,
min,
triggered: false,
}
// 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)
}
}
// we can only send 50 in one batch
let done = 0
if (overwrite) {
existingAlertsSystems.clear()
}
while (done < systems.length) {
const batch = pb.createBatch()
let batchSize = 0
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) {
for (let i = done; i < Math.min(done + 50, systems.length); i++) {
const system = systems[i]
// if overwrite is false and system is in set (alert existed), skip
if (!overwrite && set.has(system.id)) {
continue
}
if (sem.size() > 1) {
return
// find matching existing alert
const existingAlert = alerts.find((alert) => alert.system === system.id && data.key === alert.name)
// if first run, add system to set (alert already existed when global panel was opened)
if (existingAlert && !populatedSet && !overwrite) {
set.add(system.id)
continue
}
batchSize++
const requestOptions: RecordOptions = {
requestKey: system.id,
}
// checked - make sure alert is created or updated
if (checked) {
if (existingAlert) {
batch.collection("alerts").update(existingAlert.id, recordData, requestOptions)
} else {
batch.collection("alerts").create(
{
system: system.id,
user: pb.authStore.record!.id,
name: data.key,
...recordData,
},
requestOptions
)
}
} else if (existingAlert) {
batch.collection("alerts").delete(existingAlert.id)
}
await processSystem(system)
}
await batch.send()
} finally {
sem.release()
try {
batchSize && batch.send()
} catch (e) {
failedUpdateToast()
} finally {
done += 50
}
}
systemsWithExistingAlerts.current.populatedSet = true
}
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 { key } = data
const singleDescription = data.alert.singleDesc?.()
@@ -219,12 +166,17 @@ function AlertContent({ data }: { data: AlertData }) {
const [min, setMin] = useState(data.min || 10)
const [value, setValue] = useState(data.val || (singleDescription ? 0 : 80))
const Icon = alertInfo[name].icon
const newMin = useRef(min)
const newValue = useRef(value)
const Icon = alertInfo[key].icon
const updateAlert = (c?: boolean) => data.updateAlert?.(c ?? checked, newValue.current, newMin.current)
return (
<div className="rounded-lg border border-muted-foreground/15 hover:border-muted-foreground/20 transition-colors duration-100 group">
<label
htmlFor={`s${name}`}
htmlFor={`s${key}`}
className={cn("flex flex-row items-center justify-between gap-4 cursor-pointer p-4", {
"pb-0": checked,
})}
@@ -236,67 +188,56 @@ function AlertContent({ data }: { data: AlertData }) {
{!checked && <span className="block text-sm text-muted-foreground">{data.alert.desc()}</span>}
</div>
<Switch
id={`s${name}`}
id={`s${key}`}
checked={checked}
onCheckedChange={(newChecked) => {
setChecked(newChecked)
data.updateAlert?.(newChecked, value, min)
onCheckedChange={(checked) => {
setChecked(checked)
updateAlert(checked)
}}
/>
</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])
}}
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}
{` `}
</>
)}
{!singleDescription && (
<div>
<p id={`v${key}`} className="text-sm block h-8">
<Trans>
For <strong className="text-foreground">{min}</strong>{" "}
<Plural value={min} one="minute" other="minutes" />
Average exceeds{" "}
<strong className="text-foreground">
{value}
{data.alert.unit}
</strong>
</Trans>
</p>
<div className="flex gap-3">
<Slider
aria-labelledby={`v${name}`}
aria-labelledby={`v${key}`}
defaultValue={[value]}
onValueCommit={(val) => (newValue.current = val[0]) && updateAlert()}
onValueChange={(val) => setValue(val[0])}
min={1}
max={alertInfo[key].max ?? 99}
/>
</div>
</div>
)}
<div className={cn(singleDescription && "col-span-full lowercase")}>
<p id={`t${key}`} className="text-sm block h-8 first-letter:uppercase">
{singleDescription && (
<>{singleDescription}{` `}</>
)}
<Trans>
For <strong className="text-foreground">{min}</strong>{" "}
<Plural value={min} one=" minute" other=" minutes" />
</Trans>
</p>
<div className="flex gap-3">
<Slider
aria-labelledby={`v${key}`}
defaultValue={[min]}
onValueCommit={(min) => {
data.updateAlert?.(true, value, min[0])
}}
onValueChange={(val) => {
setMin(val[0])
}}
onValueCommit={(val) => (newMin.current = val[0]) && updateAlert()}
onValueChange={(val) => setMin(val[0])}
min={1}
max={60}
/>

View File

@@ -1,6 +1,5 @@
import { t } from "@lingui/core/macro"
import { Area, AreaChart, CartesianGrid, YAxis } from "recharts"
import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from "@/components/ui/chart"
import {
useYAxisWidth,
@@ -13,7 +12,8 @@ import {
// import Spinner from '../spinner'
import { ChartData } from "@/types"
import { memo, useMemo } from "react"
import { useLingui } from "@lingui/react/macro"
import { t } from "@lingui/macro"
import { useLingui } from "@lingui/react"
/** [label, key, color, opacity] */
type DataKeys = [string, string, number, number]
@@ -35,7 +35,6 @@ export default memo(function AreaChartDefault({
chartData,
max,
tickFormatter,
contentFormatter,
}: {
maxToggled?: boolean
unit?: string
@@ -43,7 +42,6 @@ export default memo(function AreaChartDefault({
chartData: ChartData
max?: number
tickFormatter?: (value: number) => string
contentFormatter?: (value: number) => string
}) {
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
const { i18n } = useLingui()
@@ -117,12 +115,7 @@ export default memo(function AreaChartDefault({
content={
<ChartTooltipContent
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
contentFormatter={({ value }) => {
if (contentFormatter) {
return contentFormatter(value)
}
return decimalString(value) + unit
}}
contentFormatter={(item) => decimalString(item.value) + unit}
// indicator="line"
/>
}

View File

@@ -1,4 +1,5 @@
import { Area, AreaChart, CartesianGrid, YAxis } from "recharts"
import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from "@/components/ui/chart"
import {
useYAxisWidth,
@@ -11,7 +12,8 @@ import {
} from "@/lib/utils"
import { ChartData } from "@/types"
import { memo } from "react"
import { useLingui } from "@lingui/react/macro"
import { t } from "@lingui/macro"
import { useLingui } from "@lingui/react"
export default memo(function DiskChart({
dataKey,
@@ -23,7 +25,7 @@ export default memo(function DiskChart({
chartData: ChartData
}) {
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
const { t } = useLingui()
const { _ } = useLingui()
// round to nearest GB
if (diskSize >= 100) {
@@ -74,7 +76,7 @@ export default memo(function DiskChart({
/>
<Area
dataKey={dataKey}
name={t`Disk Usage`}
name={_(t`Disk Usage`)}
type="monotoneX"
fill="hsl(var(--chart-4))"
fillOpacity={0.4}

View File

@@ -1,13 +1,15 @@
import { Area, AreaChart, CartesianGrid, YAxis } from "recharts"
import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from "@/components/ui/chart"
import { useYAxisWidth, cn, toFixedFloat, decimalString, formatShortDate, chartMargin } from "@/lib/utils"
import { memo } from "react"
import { ChartData } from "@/types"
import { useLingui } from "@lingui/react/macro"
import { t } from "@lingui/macro"
import { useLingui } from "@lingui/react"
export default memo(function MemChart({ chartData }: { chartData: ChartData }) {
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
const { t } = useLingui()
const { _ } = useLingui()
const totalMem = toFixedFloat(chartData.systemStats.at(-1)?.stats.m ?? 0, 1)
@@ -60,7 +62,7 @@ export default memo(function MemChart({ chartData }: { chartData: ChartData }) {
}
/>
<Area
name={t`Used`}
name={_(t`Used`)}
order={3}
dataKey="stats.mu"
type="monotoneX"
@@ -84,7 +86,7 @@ export default memo(function MemChart({ chartData }: { chartData: ChartData }) {
/>
)}
<Area
name={t`Cache / Buffers`}
name={_(t`Cache / Buffers`)}
order={1}
dataKey="stats.mb"
type="monotoneX"

View File

@@ -1,6 +1,5 @@
import { t } from "@lingui/core/macro";
import { Area, AreaChart, CartesianGrid, YAxis } from "recharts"
import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from "@/components/ui/chart"
import {
useYAxisWidth,
@@ -12,6 +11,7 @@ import {
} from "@/lib/utils"
import { ChartData } from "@/types"
import { memo } from "react"
import { t } from "@lingui/macro"
export default memo(function SwapChart({ chartData }: { chartData: ChartData }) {
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()

View File

@@ -19,15 +19,17 @@ import {
CommandSeparator,
CommandShortcut,
} from "@/components/ui/command"
import { memo, useEffect, useMemo } from "react"
import { useEffect } from "react"
import { useStore } from "@nanostores/react"
import { $systems } from "@/lib/stores"
import { getHostDisplayValue, isAdmin, listen } from "@/lib/utils"
import { getHostDisplayValue, isAdmin } from "@/lib/utils"
import { $router, basePath, navigate } from "./router"
import { Trans } from "@lingui/react/macro"
import { t } from "@lingui/core/macro"
import { Trans, t } from "@lingui/macro"
import { getPagePath } from "@nanostores/router"
export default memo(function CommandPalette({ open, setOpen }: { open: boolean; setOpen: (open: boolean) => void }) {
export default function CommandPalette({ open, setOpen }: { open: boolean; setOpen: (open: boolean) => void }) {
const systems = useStore($systems)
useEffect(() => {
const down = (e: KeyboardEvent) => {
if (e.key === "k" && (e.metaKey || e.ctrlKey)) {
@@ -35,163 +37,162 @@ export default memo(function CommandPalette({ open, setOpen }: { open: boolean;
setOpen(!open)
}
}
return listen(document, "keydown", down)
document.addEventListener("keydown", down)
return () => document.removeEventListener("keydown", down)
}, [open, setOpen])
return useMemo(() => {
const systems = $systems.get()
return (
<CommandDialog open={open} onOpenChange={setOpen}>
<CommandInput placeholder={t`Search for systems or settings...`} />
<CommandList>
<CommandEmpty>
<Trans>No results found.</Trans>
</CommandEmpty>
{systems.length > 0 && (
<>
<CommandGroup>
{systems.map((system) => (
<CommandItem
key={system.id}
onSelect={() => {
navigate(getPagePath($router, "system", { name: system.name }))
setOpen(false)
}}
>
<Server className="me-2 h-4 w-4" />
<span>{system.name}</span>
<CommandShortcut>{getHostDisplayValue(system)}</CommandShortcut>
</CommandItem>
))}
</CommandGroup>
<CommandSeparator className="mb-1.5" />
</>
)}
<CommandGroup heading={t`Pages / Settings`}>
<CommandItem
keywords={["home"]}
onSelect={() => {
navigate(basePath)
setOpen(false)
}}
>
<LayoutDashboard className="me-2 h-4 w-4" />
<span>
<Trans>Dashboard</Trans>
</span>
<CommandShortcut>
<Trans>Page</Trans>
</CommandShortcut>
</CommandItem>
<CommandItem
onSelect={() => {
navigate(getPagePath($router, "settings", { name: "general" }))
setOpen(false)
}}
>
<SettingsIcon className="me-2 h-4 w-4" />
<span>
<Trans>Settings</Trans>
</span>
<CommandShortcut>
<Trans>Settings</Trans>
</CommandShortcut>
</CommandItem>
<CommandItem
keywords={["alerts"]}
onSelect={() => {
navigate(getPagePath($router, "settings", { name: "notifications" }))
setOpen(false)
}}
>
<MailIcon className="me-2 h-4 w-4" />
<span>
<Trans>Notifications</Trans>
</span>
<CommandShortcut>
<Trans>Settings</Trans>
</CommandShortcut>
</CommandItem>
<CommandItem
keywords={["help", "oauth", "oidc"]}
onSelect={() => {
window.location.href = "https://beszel.dev/guide/what-is-beszel"
}}
>
<BookIcon className="me-2 h-4 w-4" />
<span>
<Trans>Documentation</Trans>
</span>
<CommandShortcut>beszel.dev</CommandShortcut>
</CommandItem>
</CommandGroup>
{isAdmin() && (
<>
<CommandSeparator className="mb-1.5" />
<CommandGroup heading={t`Admin`}>
return (
<CommandDialog open={open} onOpenChange={setOpen}>
<CommandInput placeholder={t`Search for systems or settings...`} />
<CommandList>
<CommandEmpty>
<Trans>No results found.</Trans>
</CommandEmpty>
{systems.length > 0 && (
<>
<CommandGroup>
{systems.map((system) => (
<CommandItem
keywords={["pocketbase"]}
key={system.id}
onSelect={() => {
navigate(getPagePath($router, "system", { name: system.name }))
setOpen(false)
window.open("/_/", "_blank")
}}
>
<UsersIcon className="me-2 h-4 w-4" />
<span>
<Trans>Users</Trans>
</span>
<CommandShortcut>
<Trans>Admin</Trans>
</CommandShortcut>
<Server className="me-2 h-4 w-4" />
<span>{system.name}</span>
<CommandShortcut>{getHostDisplayValue(system)}</CommandShortcut>
</CommandItem>
<CommandItem
onSelect={() => {
setOpen(false)
window.open("/_/#/logs", "_blank")
}}
>
<LogsIcon className="me-2 h-4 w-4" />
<span>
<Trans>Logs</Trans>
</span>
<CommandShortcut>
<Trans>Admin</Trans>
</CommandShortcut>
</CommandItem>
<CommandItem
onSelect={() => {
setOpen(false)
window.open("/_/#/settings/backups", "_blank")
}}
>
<DatabaseBackupIcon className="me-2 h-4 w-4" />
<span>
<Trans>Backups</Trans>
</span>
<CommandShortcut>
<Trans>Admin</Trans>
</CommandShortcut>
</CommandItem>
<CommandItem
keywords={["email"]}
onSelect={() => {
setOpen(false)
window.open("/_/#/settings/mail", "_blank")
}}
>
<MailIcon className="me-2 h-4 w-4" />
<span>
<Trans>SMTP settings</Trans>
</span>
<CommandShortcut>
<Trans>Admin</Trans>
</CommandShortcut>
</CommandItem>
</CommandGroup>
</>
)}
</CommandList>
</CommandDialog>
)
}, [open])
})
))}
</CommandGroup>
<CommandSeparator className="mb-1.5" />
</>
)}
<CommandGroup heading={t`Pages / Settings`}>
<CommandItem
keywords={["home"]}
onSelect={() => {
navigate(basePath)
setOpen(false)
}}
>
<LayoutDashboard className="me-2 h-4 w-4" />
<span>
<Trans>Dashboard</Trans>
</span>
<CommandShortcut>
<Trans>Page</Trans>
</CommandShortcut>
</CommandItem>
<CommandItem
onSelect={() => {
navigate(getPagePath($router, "settings", { name: "general" }))
setOpen(false)
}}
>
<SettingsIcon className="me-2 h-4 w-4" />
<span>
<Trans>Settings</Trans>
</span>
<CommandShortcut>
<Trans>Settings</Trans>
</CommandShortcut>
</CommandItem>
<CommandItem
keywords={["alerts"]}
onSelect={() => {
navigate(getPagePath($router, "settings", { name: "notifications" }))
setOpen(false)
}}
>
<MailIcon className="me-2 h-4 w-4" />
<span>
<Trans>Notifications</Trans>
</span>
<CommandShortcut>
<Trans>Settings</Trans>
</CommandShortcut>
</CommandItem>
<CommandItem
keywords={["help", "oauth", "oidc"]}
onSelect={() => {
window.location.href = "https://beszel.dev/guide/what-is-beszel"
}}
>
<BookIcon className="me-2 h-4 w-4" />
<span>
<Trans>Documentation</Trans>
</span>
<CommandShortcut>beszel.dev</CommandShortcut>
</CommandItem>
</CommandGroup>
{isAdmin() && (
<>
<CommandSeparator className="mb-1.5" />
<CommandGroup heading={t`Admin`}>
<CommandItem
keywords={["pocketbase"]}
onSelect={() => {
setOpen(false)
window.open("/_/", "_blank")
}}
>
<UsersIcon className="me-2 h-4 w-4" />
<span>
<Trans>Users</Trans>
</span>
<CommandShortcut>
<Trans>Admin</Trans>
</CommandShortcut>
</CommandItem>
<CommandItem
onSelect={() => {
setOpen(false)
window.open("/_/#/logs", "_blank")
}}
>
<LogsIcon className="me-2 h-4 w-4" />
<span>
<Trans>Logs</Trans>
</span>
<CommandShortcut>
<Trans>Admin</Trans>
</CommandShortcut>
</CommandItem>
<CommandItem
onSelect={() => {
setOpen(false)
window.open("/_/#/settings/backups", "_blank")
}}
>
<DatabaseBackupIcon className="me-2 h-4 w-4" />
<span>
<Trans>Backups</Trans>
</span>
<CommandShortcut>
<Trans>Admin</Trans>
</CommandShortcut>
</CommandItem>
<CommandItem
keywords={["email"]}
onSelect={() => {
setOpen(false)
window.open("/_/#/settings/mail", "_blank")
}}
>
<MailIcon className="me-2 h-4 w-4" />
<span>
<Trans>SMTP settings</Trans>
</span>
<CommandShortcut>
<Trans>Admin</Trans>
</CommandShortcut>
</CommandItem>
</CommandGroup>
</>
)}
</CommandList>
</CommandDialog>
)
}

View File

@@ -1,8 +1,8 @@
import { Trans } from "@lingui/react/macro";
import { useEffect, useMemo, useRef } from "react"
import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "./ui/dialog"
import { Textarea } from "./ui/textarea"
import { $copyContent } from "@/lib/stores"
import { Trans } from "@lingui/macro"
export default function CopyToClipboard({ content }: { content: string }) {
return (

View File

@@ -4,7 +4,7 @@ import { Button } from "@/components/ui/button"
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu"
import languages from "@/lib/languages"
import { cn } from "@/lib/utils"
import { useLingui } from "@lingui/react/macro"
import { useLingui } from "@lingui/react"
import { dynamicActivate } from "@/lib/i18n"
export function LangToggle() {

View File

@@ -1,5 +1,3 @@
import { t } from "@lingui/core/macro";
import { Trans } from "@lingui/react/macro";
import { cn } from "@/lib/utils"
import { buttonVariants } from "@/components/ui/button"
import { Input } from "@/components/ui/input"
@@ -12,6 +10,7 @@ import { Dialog, DialogContent, DialogTrigger, DialogHeader, DialogTitle } from
import { useCallback, useEffect, useState } from "react"
import { AuthMethodsList, AuthProviderInfo, OAuth2AuthConfig } from "pocketbase"
import { $router, Link, prependBasePath } from "../router"
import { Trans, t } from "@lingui/macro"
import { getPagePath } from "@nanostores/router"
const honeypot = v.literal("")
@@ -136,6 +135,7 @@ export function UserAuthForm({
toast({
title: t`Error`,
description: t`Please enable pop-ups for this site`,
variant: "destructive",
})
return
}
@@ -156,17 +156,14 @@ export function UserAuthForm({
useEffect(() => {
// auto login if password disabled and only one auth provider
if (!passwordEnabled && authProviders.length === 1 && !sessionStorage.getItem("lo")) {
// Add a small timeout to ensure browser is ready to handle popups
setTimeout(() => {
loginWithOauth(authProviders[0], true)
}, 300)
if (!passwordEnabled && authProviders.length === 1) {
loginWithOauth(authProviders[0], true)
}
}, [])
return (
<div className={cn("grid gap-6", className)} {...props}>
{passwordEnabled && (
<div className={cn("grid gap-6", className)} {...props}>
{passwordEnabled && (
<>
<form onSubmit={handleSubmit} onChange={() => setErrors({})}>
<div className="grid gap-2.5">
@@ -242,20 +239,21 @@ export function UserAuthForm({
</form>
{(isFirstRun || oauthEnabled) && (
// only show 'continue with' during onboarding or if we have auth providers
(<div className="relative">
<div className="absolute inset-0 flex items-center">
<div className="relative">
<div className="absolute inset-0 flex items-center">
<span className="w-full border-t" />
</div>
<div className="relative flex justify-center text-xs uppercase">
<div className="relative flex justify-center text-xs uppercase">
<span className="bg-background px-2 text-muted-foreground">
<Trans>Or continue with</Trans>
</span>
</div>
</div>)
</div>
)}
</>
)}
{oauthEnabled && (
{oauthEnabled && (
<div className="grid gap-2 -mt-1">
{authMethods.oauth2.providers.map((provider) => (
<button
@@ -285,16 +283,17 @@ export function UserAuthForm({
))}
</div>
)}
{!oauthEnabled && isFirstRun && (
{!oauthEnabled && isFirstRun && (
// only show GitHub button / dialog during onboarding
(<Dialog>
<DialogTrigger asChild>
<Dialog>
<DialogTrigger asChild>
<button type="button" className={cn(buttonVariants({ variant: "outline" }))}>
<img className="me-2 h-4 w-4 dark:invert" src={prependBasePath("/_/images/oauth2/github.svg")} alt="" />
<span className="translate-y-[1px]">GitHub</span>
</button>
</DialogTrigger>
<DialogContent style={{ maxWidth: 440, width: "90%" }}>
<DialogContent style={{ maxWidth: 440, width: "90%" }}>
<DialogHeader>
<DialogTitle>
<Trans>OAuth 2 / OIDC support</Trans>
@@ -318,9 +317,10 @@ export function UserAuthForm({
</p>
</div>
</DialogContent>
</Dialog>)
</Dialog>
)}
{passwordEnabled && !isFirstRun && (
{passwordEnabled && !isFirstRun && (
<Link
href={getPagePath($router, "forgot_password")}
className="text-sm mx-auto hover:text-brand underline underline-offset-4 opacity-70 hover:opacity-100 transition-opacity"
@@ -328,6 +328,6 @@ export function UserAuthForm({
<Trans>Forgot password?</Trans>
</Link>
)}
</div>
);
</div>
)
}

View File

@@ -1,5 +1,3 @@
import { Trans } from "@lingui/react/macro";
import { t } from "@lingui/core/macro";
import { LoaderCircle, MailIcon, SendHorizonalIcon } from "lucide-react"
import { Input } from "../ui/input"
import { Label } from "../ui/label"
@@ -10,6 +8,7 @@ import { cn } from "@/lib/utils"
import { pb } from "@/lib/stores"
import { Dialog, DialogHeader } from "../ui/dialog"
import { DialogContent, DialogTrigger, DialogTitle } from "../ui/dialog"
import { t, Trans } from "@lingui/macro"
const showLoginFaliedToast = () => {
toast({

View File

@@ -1,4 +1,3 @@
import { t } from "@lingui/core/macro";
import { UserAuthForm } from "@/components/login/auth-form"
import { Logo } from "../logo"
import { useEffect, useMemo, useState } from "react"
@@ -7,6 +6,7 @@ import { useStore } from "@nanostores/react"
import ForgotPassword from "./forgot-pass-form"
import { $router } from "../router"
import { AuthMethodsList } from "pocketbase"
import { t } from "@lingui/macro"
import { useTheme } from "../theme-provider"
export default function () {

View File

@@ -1,11 +1,10 @@
import { Trans } from "@lingui/react/macro";
import { t } from "@lingui/core/macro";
import { LaptopIcon, MoonStarIcon, SunIcon } from "lucide-react"
import { Button } from "@/components/ui/button"
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu"
import { useTheme } from "@/components/theme-provider"
import { cn } from "@/lib/utils"
import { t, Trans } from "@lingui/macro"
export function ModeToggle() {
const { theme, setTheme } = useTheme()

View File

@@ -1,4 +1,3 @@
import { Trans } from "@lingui/react/macro";
import { useState, lazy, Suspense } from "react"
import { Button, buttonVariants } from "@/components/ui/button"
import {
@@ -27,6 +26,7 @@ import {
DropdownMenuItem,
} from "@/components/ui/dropdown-menu"
import { AddSystemButton } from "./add-system"
import { Trans } from "@lingui/macro"
import { getPagePath } from "@nanostores/router"
const CommandPalette = lazy(() => import("./command-palette"))

View File

@@ -11,7 +11,7 @@ const routes = {
* The base path of the application.
* This is used to prepend the base path to all routes.
*/
export const basePath = globalThis.BESZEL.BASE_PATH || ""
export const basePath = window.BASE_PATH || ""
/**
* Prepends the base path to the given path.

View File

@@ -1,6 +1,6 @@
import { Suspense, lazy, memo, useEffect, useMemo } from "react"
import { Suspense, lazy, useEffect, useMemo } from "react"
import { Card, CardContent, CardHeader, CardTitle } from "../ui/card"
import { $alerts, $systems, pb } from "@/lib/stores"
import { $alerts, $hubVersion, $systems, pb } from "@/lib/stores"
import { useStore } from "@nanostores/react"
import { GithubIcon } from "lucide-react"
import { Separator } from "../ui/separator"
@@ -8,17 +8,17 @@ import { alertInfo, updateRecordList, updateSystemList } from "@/lib/utils"
import { AlertRecord, SystemRecord } from "@/types"
import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"
import { $router, Link } from "../router"
import { Plural, Trans, useLingui } from "@lingui/react/macro"
import { Plural, t, Trans } from "@lingui/macro"
import { getPagePath } from "@nanostores/router"
const SystemsTable = lazy(() => import("../systems-table/systems-table"))
export const Home = memo(() => {
export default function Home() {
const hubVersion = useStore($hubVersion)
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
@@ -26,17 +26,14 @@ export const Home = memo(() => {
return false
}
alert.sysname = systems.find((system) => system.id === alert.system)?.name
alertsKey += alert.id
return true
})
return activeAlerts
}, [systems, alerts])
}, [alerts])
useEffect(() => {
document.title = t`Dashboard` + " / Beszel"
}, [t])
useEffect(() => {
// make sure we have the latest list of systems
updateSystemList()
@@ -44,6 +41,7 @@ export const Home = memo(() => {
pb.collection<SystemRecord>("systems").subscribe("*", (e) => {
updateRecordList(e, $systems)
})
// todo: add toast if new triggered alert comes in
pb.collection<AlertRecord>("alerts").subscribe("*", (e) => {
updateRecordList(e, $alerts)
})
@@ -53,15 +51,56 @@ export const Home = memo(() => {
}
}, [])
return useMemo(
() => (
<>
{/* show active alerts */}
{activeAlerts.length > 0 && <ActiveAlerts key={activeAlerts.length} activeAlerts={activeAlerts} />}
<Suspense>
<SystemsTable />
</Suspense>
return (
<>
{/* show active alerts */}
{activeAlerts.length > 0 && (
<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>
<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>
)
})}
</div>
)}
</CardContent>
</Card>
)}
<Suspense>
<SystemsTable />
</Suspense>
{hubVersion && (
<div className="flex gap-1.5 justify-end items-center pe-3 sm:pe-6 mt-3.5 text-xs opacity-80">
<a
href="https://github.com/henrygd/beszel"
@@ -76,56 +115,10 @@ export const Home = memo(() => {
target="_blank"
className="text-muted-foreground hover:text-foreground duration-75"
>
Beszel {globalThis.BESZEL.HUB_VERSION}
Beszel {hubVersion}
</a>
</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>
<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>
)
})}
</div>
)}
</CardContent>
</Card>
)
})
}

View File

@@ -1,5 +1,3 @@
import { t } from "@lingui/core/macro";
import { Trans } from "@lingui/react/macro";
import { isAdmin } from "@/lib/utils"
import { Separator } from "@/components/ui/separator"
import { Button } from "@/components/ui/button"
@@ -12,6 +10,7 @@ import { useState } from "react"
import { Textarea } from "@/components/ui/textarea"
import { toast } from "@/components/ui/use-toast"
import clsx from "clsx"
import { Trans, t } from "@lingui/macro"
export default function ConfigYaml() {
const [configContent, setConfigContent] = useState<string>("")

View File

@@ -1,4 +1,3 @@
import { Trans } from "@lingui/react/macro"
import { Button } from "@/components/ui/button"
import { Label } from "@/components/ui/label"
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
@@ -8,9 +7,10 @@ import { LanguagesIcon, LoaderCircleIcon, SaveIcon } from "lucide-react"
import { UserSettings } from "@/types"
import { saveSettings } from "./layout"
import { useState } from "react"
import { Trans } from "@lingui/macro"
import languages from "@/lib/languages"
import { dynamicActivate } from "@/lib/i18n"
import { useLingui } from "@lingui/react/macro"
import { useLingui } from "@lingui/react"
// import { setLang } from "@/lib/i18n"
export default function SettingsProfilePage({ userSettings }: { userSettings: UserSettings }) {

View File

@@ -1,5 +1,3 @@
import { t } from "@lingui/core/macro"
import { Trans } from "@lingui/react/macro"
import { useEffect } from "react"
import { Separator } from "../../ui/separator"
import { SidebarNav } from "./sidebar-nav.tsx"
@@ -14,7 +12,8 @@ import { UserSettings } from "@/types.js"
import General from "./general.tsx"
import Notifications from "./notifications.tsx"
import ConfigYaml from "./config-yaml.tsx"
import { useLingui } from "@lingui/react/macro"
import { Trans, t } from "@lingui/macro"
import { useLingui } from "@lingui/react"
export async function saveSettings(newSettings: Partial<UserSettings>) {
try {
@@ -45,11 +44,11 @@ export async function saveSettings(newSettings: Partial<UserSettings>) {
}
export default function SettingsLayout() {
const { t } = useLingui()
const { _ } = useLingui()
const sidebarNavItems = [
{
title: t({ message: `General`, comment: "Context: General settings" }),
title: _(t({ message: `General`, comment: "Context: General settings" })),
href: getPagePath($router, "settings", { name: "general" }),
icon: SettingsIcon,
},

View File

@@ -1,5 +1,3 @@
import { t } from "@lingui/core/macro";
import { Trans } from "@lingui/react/macro";
import { Button } from "@/components/ui/button"
import { Input } from "@/components/ui/input"
import { Label } from "@/components/ui/label"
@@ -14,6 +12,7 @@ import { UserSettings } from "@/types"
import { saveSettings } from "./layout"
import * as v from "valibot"
import { isAdmin } from "@/lib/utils"
import { Trans, t } from "@lingui/macro"
import { prependBasePath } from "@/components/router"
interface ShoutrrrUrlCardProps {

View File

@@ -1,5 +1,3 @@
import { t } from "@lingui/core/macro"
import { Plural, Trans } from "@lingui/react/macro"
import { $systems, pb, $chartTime, $containerFilter, $userSettings, $direction, $maxValues } from "@/lib/stores"
import { ChartData, ChartTimes, ContainerStatsRecord, GPUData, SystemRecord, SystemStatsRecord } from "@/types"
import React, { lazy, memo, useCallback, useEffect, useMemo, useRef, useState } from "react"
@@ -14,7 +12,6 @@ import {
getHostDisplayValue,
getPbTimestamp,
getSizeAndUnit,
listen,
toFixedFloat,
useLocalStorage,
} from "@/lib/utils"
@@ -26,9 +23,8 @@ import { ChartAverage, ChartMax, Rows, TuxIcon } from "../ui/icons"
import { useIntersectionObserver } from "@/lib/use-intersection-observer"
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../ui/select"
import { timeTicks } from "d3-time"
import { useLingui } from "@lingui/react/macro"
import { $router, navigate } from "../router"
import { getPagePath } from "@nanostores/router"
import { Plural, Trans, t } from "@lingui/macro"
import { useLingui } from "@lingui/react"
const AreaChartDefault = lazy(() => import("../charts/area-chart"))
const ContainerChart = lazy(() => import("../charts/container-chart"))
@@ -107,7 +103,7 @@ function dockerOrPodman(str: string, system: SystemRecord) {
export default function SystemDetail({ name }: { name: string }) {
const direction = useStore($direction)
const { t } = useLingui()
const { _ } = useLingui()
const systems = useStore($systems)
const chartTime = useStore($chartTime)
const maxValues = useStore($maxValues)
@@ -116,7 +112,6 @@ export default function SystemDetail({ name }: { name: string }) {
const [systemStats, setSystemStats] = useState([] as SystemStatsRecord[])
const [containerData, setContainerData] = useState([] as ChartData["containerData"])
const netCardRef = useRef<HTMLDivElement>(null)
const persistChartTime = useRef(false)
const [containerFilterBar, setContainerFilterBar] = useState(null as null | JSX.Element)
const [bottomSpacing, setBottomSpacing] = useState(0)
const [chartLoading, setChartLoading] = useState(true)
@@ -125,10 +120,8 @@ export default function SystemDetail({ name }: { name: string }) {
useEffect(() => {
document.title = `${name} / Beszel`
return () => {
if (!persistChartTime.current) {
$chartTime.set($userSettings.get().chartTime)
}
persistChartTime.current = false
$chartTime.set($userSettings.get().chartTime)
// resetCharts()
setSystemStats([])
setContainerData([])
setContainerFilterBar(null)
@@ -267,7 +260,7 @@ export default function SystemDetail({ name }: { name: string }) {
// hide if hostname is same as host or name
hide: system.info.h === system.host || system.info.h === system.name,
},
{ value: uptime, Icon: ClockArrowUp, label: t`Uptime`, hide: !system.info.u },
{ value: uptime, Icon: ClockArrowUp, label: t`Uptime` },
{ value: system.info.k, Icon: TuxIcon, label: t({ comment: "Linux kernel", message: "Kernel" }) },
{
value: `${system.info.m} (${system.info.c}c${system.info.t ? `/${system.info.t}t` : ""})`,
@@ -296,35 +289,6 @@ export default function SystemDetail({ name }: { name: string }) {
setBottomSpacing(tooltipHeight - distanceToBottom)
}, [netCardRef, containerData])
// keyboard navigation between systems
useEffect(() => {
if (!systems.length) {
return
}
const handleKeyUp = (e: KeyboardEvent) => {
if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) {
return
}
const currentIndex = systems.findIndex((s) => s.name === name)
if (currentIndex === -1 || systems.length <= 1) {
return
}
switch (e.key) {
case "ArrowLeft":
case "h":
const prevIndex = (currentIndex - 1 + systems.length) % systems.length
persistChartTime.current = true
return navigate(getPagePath($router, "system", { name: systems[prevIndex].name }))
case "ArrowRight":
case "l":
const nextIndex = (currentIndex + 1) % systems.length
persistChartTime.current = true
return navigate(getPagePath($router, "system", { name: systems[nextIndex].name }))
}
}
return listen(document, "keyup", handleKeyUp)
}, [name, systems])
if (!system.id) {
return null
}
@@ -431,7 +395,7 @@ export default function SystemDetail({ name }: { name: string }) {
<ChartCard
empty={dataEmpty}
grid={grid}
title={t`CPU Usage`}
title={_(t`CPU Usage`)}
description={t`Average system-wide CPU utilization`}
cornerEl={maxValSelect}
>
@@ -556,10 +520,6 @@ export default function SystemDetail({ name }: { name: string }) {
<div className="grid xl:grid-cols-2 gap-4">
{Object.keys(systemStats.at(-1)?.stats.g ?? {}).map((id) => {
const gpu = systemStats.at(-1)?.stats.g?.[id] as GPUData
const sizeFormatter = (value: number, decimals?: number) => {
const { v, u } = getSizeAndUnit(value, false)
return toFixedFloat(v, decimals || 1) + u
}
return (
<div key={id} className="contents">
<ChartCard
@@ -579,9 +539,12 @@ export default function SystemDetail({ name }: { name: string }) {
<AreaChartDefault
chartData={chartData}
chartName={`g.${id}.mu`}
unit=" MB"
max={gpu.mt}
tickFormatter={sizeFormatter}
contentFormatter={(value) => sizeFormatter(value, 2)}
tickFormatter={(value) => {
const { v, u } = getSizeAndUnit(value, false)
return toFixedFloat(v, 1) + u
}}
/>
</ChartCard>
</div>
@@ -632,7 +595,7 @@ export default function SystemDetail({ name }: { name: string }) {
function ContainerFilterBar() {
const containerFilter = useStore($containerFilter)
const { t } = useLingui()
const { _ } = useLingui()
const handleChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
$containerFilter.set(e.target.value)
@@ -640,7 +603,7 @@ function ContainerFilterBar() {
return (
<>
<Input placeholder={t`Filter...`} className="ps-4 pe-8" value={containerFilter} onChange={handleChange} />
<Input placeholder={_(t`Filter...`)} className="ps-4 pe-8" value={containerFilter} onChange={handleChange} />
{containerFilter && (
<Button
type="button"

View File

@@ -10,8 +10,6 @@ import {
getCoreRowModel,
useReactTable,
HeaderContext,
Row,
Table as TableType,
} from "@tanstack/react-table"
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
@@ -63,13 +61,14 @@ import {
PenBoxIcon,
} from "lucide-react"
import { memo, useEffect, useMemo, useRef, useState } from "react"
import { $systems, pb } from "@/lib/stores"
import { $hubVersion, $systems, pb } from "@/lib/stores"
import { useStore } from "@nanostores/react"
import { cn, copyToClipboard, decimalString, isReadOnlyUser, useLocalStorage } from "@/lib/utils"
import AlertsButton from "../alerts/alert-button"
import { $router, Link, navigate } from "../router"
import { EthernetIcon, GpuIcon, ThermometerIcon } from "../ui/icons"
import { useLingui, Trans } from "@lingui/react/macro"
import { Trans, t } from "@lingui/macro"
import { useLingui } from "@lingui/react"
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../ui/card"
import { Input } from "../ui/input"
import { ClassValue } from "clsx"
@@ -104,66 +103,47 @@ function CellFormatter(info: CellContext<SystemRecord, unknown>) {
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" />}
{/* @ts-ignore */}
{column.columnDef.icon && <column.columnDef.icon className="me-2 size-4" />}
{column.id}
{/* @ts-ignore */}
{column.columnDef.hideSort || <ArrowUpDownIcon className="ms-2 size-4" />}
</Button>
)
}
export default function SystemsTable() {
const data = useStore($systems)
const { i18n, t } = useLingui()
const hubVersion = useStore($hubVersion)
const [filter, setFilter] = useState<string>()
const [sorting, setSorting] = useState<SortingState>([{ id: "system", desc: false }])
const [sorting, setSorting] = useState<SortingState>([{ id: t`System`, desc: false }])
const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([])
const [columnVisibility, setColumnVisibility] = useLocalStorage<VisibilityState>("cols", {})
const [viewMode, setViewMode] = useLocalStorage<ViewMode>("viewMode", window.innerWidth > 1024 ? "table" : "grid")
const locale = i18n.locale
const { i18n } = useLingui()
useEffect(() => {
if (filter !== undefined) {
table.getColumn("system")?.setFilterValue(filter)
table.getColumn(t`System`)?.setFilterValue(filter)
}
}, [filter])
const columnDefs = useMemo(() => {
const statusTranslations = {
up: () => t`Up`.toLowerCase(),
down: () => t`Down`.toLowerCase(),
paused: () => t`Paused`.toLowerCase(),
}
const columns = useMemo(() => {
return [
{
// size: 200,
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
},
id: t`System`,
enableHiding: false,
Icon: ServerIcon,
icon: ServerIcon,
cell: (info) => (
<span className="flex gap-0.5 items-center text-base md:pe-5">
<IndicatorDot system={info.row.original} />
@@ -182,48 +162,43 @@ export default function SystemsTable() {
},
{
accessorKey: "info.cpu",
id: "cpu",
name: () => t`CPU`,
id: t`CPU`,
invertSorting: true,
cell: CellFormatter,
Icon: CpuIcon,
icon: CpuIcon,
header: sortableHeader,
},
{
accessorKey: "info.mp",
id: "memory",
name: () => t`Memory`,
id: t`Memory`,
invertSorting: true,
cell: CellFormatter,
Icon: MemoryStickIcon,
icon: MemoryStickIcon,
header: sortableHeader,
},
{
accessorKey: "info.dp",
id: "disk",
name: () => t`Disk`,
id: t`Disk`,
invertSorting: true,
cell: CellFormatter,
Icon: HardDriveIcon,
icon: HardDriveIcon,
header: sortableHeader,
},
{
accessorFn: (originalRow) => originalRow.info.g,
id: "gpu",
name: () => "GPU",
id: "GPU",
invertSorting: true,
sortUndefined: -1,
cell: CellFormatter,
Icon: GpuIcon,
icon: GpuIcon,
header: sortableHeader,
},
{
accessorFn: (originalRow) => originalRow.info.b || 0,
id: "net",
name: () => t`Net`,
id: t`Net`,
invertSorting: true,
size: 50,
Icon: EthernetIcon,
icon: EthernetIcon,
header: sortableHeader,
cell(info) {
const val = info.getValue() as number
@@ -240,13 +215,15 @@ export default function SystemsTable() {
},
{
accessorFn: (originalRow) => originalRow.info.dt,
id: "temp",
name: () => t({ message: "Temp", comment: "Temperature label in systems table" }),
id: t({
message: "Temp",
comment: "Temperature label in systems table",
}),
invertSorting: true,
sortUndefined: -1,
size: 50,
hideSort: true,
Icon: ThermometerIcon,
icon: ThermometerIcon,
header: sortableHeader,
cell(info) {
const val = info.getValue() as number
@@ -266,16 +243,15 @@ export default function SystemsTable() {
},
{
accessorKey: "info.v",
id: "agent",
name: () => t`Agent`,
id: t`Agent`,
invertSorting: true,
size: 50,
Icon: WifiIcon,
icon: WifiIcon,
hideSort: true,
header: sortableHeader,
cell(info) {
const version = info.getValue() as string
if (!version) {
if (!version || !hubVersion) {
return null
}
const system = info.row.original
@@ -289,7 +265,7 @@ export default function SystemsTable() {
system={system}
className={
(system.status !== "up" && "bg-primary/30") ||
(version === globalThis.BESZEL.HUB_VERSION && "bg-green-500") ||
(version === hubVersion && "bg-green-500") ||
"bg-yellow-500"
}
/>
@@ -299,9 +275,7 @@ export default function SystemsTable() {
},
},
{
id: "actions",
// @ts-ignore
name: () => t({ message: "Actions", comment: "Table column" }),
id: t({ message: "Actions", comment: "Table column" }),
size: 50,
cell: ({ row }) => (
<div className="flex justify-end items-center gap-1">
@@ -311,11 +285,11 @@ export default function SystemsTable() {
),
},
] as ColumnDef<SystemRecord>[]
}, [])
}, [hubVersion, i18n.locale])
const table = useReactTable({
data,
columns: columnDefs,
columns,
getCoreRowModel: getCoreRowModel(),
onSortingChange: setSorting,
getSortedRowModel: getSortedRowModel(),
@@ -329,17 +303,15 @@ export default function SystemsTable() {
},
defaultColumn: {
minSize: 0,
size: 900,
maxSize: 900,
size: Number.MAX_SAFE_INTEGER,
maxSize: Number.MAX_SAFE_INTEGER,
},
})
const rows = table.getRowModel().rows
const columns = table.getAllColumns()
const visibleColumns = table.getVisibleLeafColumns()
// TODO: hiding temp then gpu messes up table headers
const CardHead = useMemo(() => {
return (
return (
<Card>
<CardHeader className="pb-5 px-2 sm:px-6 max-sm:pt-5 max-sm:pb-1">
<div className="grid md:flex gap-5 w-full items-end">
<div className="px-2 sm:px-1">
@@ -390,8 +362,8 @@ export default function SystemsTable() {
</DropdownMenuLabel>
<DropdownMenuSeparator />
<div className="px-1 pb-1">
{columns.map((column) => {
if (!column.getCanSort()) return null
{table.getAllColumns().map((column) => {
if (column.id === t`Actions` || !column.getCanSort()) return null
let Icon = <span className="w-6"></span>
// if current sort column, show sort direction
if (sorting[0]?.id === column.id) {
@@ -410,8 +382,7 @@ export default function SystemsTable() {
key={column.id}
>
{Icon}
{/* @ts-ignore */}
{column.columnDef.name()}
{column.id}
</DropdownMenuItem>
)
})}
@@ -425,7 +396,8 @@ export default function SystemsTable() {
</DropdownMenuLabel>
<DropdownMenuSeparator />
<div className="px-1.5 pb-1">
{columns
{table
.getAllColumns()
.filter((column) => column.getCanHide())
.map((column) => {
return (
@@ -435,8 +407,7 @@ export default function SystemsTable() {
checked={column.getIsVisible()}
onCheckedChange={(value) => column.toggleVisibility(!!value)}
>
{/* @ts-ignore */}
{column.columnDef.name()}
{column.id}
</DropdownMenuCheckboxItem>
)
})}
@@ -448,24 +419,128 @@ export default function SystemsTable() {
</div>
</div>
</CardHeader>
)
}, [visibleColumns.length, sorting, viewMode, locale])
return (
<Card>
{CardHead}
<div className="p-6 pt-0 max-sm:py-3 max-sm:px-2">
{viewMode === "table" ? (
// table layout
<div className="rounded-md border overflow-hidden">
<AllSystemsTable table={table} rows={rows} colLength={visibleColumns.length} />
<Table>
<TableHeader>
{table.getHeaderGroups().map((headerGroup) => (
<TableRow key={headerGroup.id}>
{headerGroup.headers.map((header) => {
return (
<TableHead className="px-2" key={header.id}>
{header.isPlaceholder
? null
: flexRender(header.column.columnDef.header, header.getContext())}
</TableHead>
)
})}
</TableRow>
))}
</TableHeader>
<TableBody>
{rows.length ? (
table.getRowModel().rows.map((row) => (
<TableRow
key={row.original.id}
data-state={row.getIsSelected() && "selected"}
className={cn("cursor-pointer transition-opacity", {
"opacity-50": row.original.status === "paused",
})}
onClick={(e) => {
const target = e.target as HTMLElement
if (!target.closest("[data-nolink]") && e.currentTarget.contains(target)) {
navigate(getPagePath($router, "system", { name: row.original.name }))
}
}}
>
{row.getVisibleCells().map((cell) => (
<TableCell
key={cell.id}
style={{
width: cell.column.getSize() === Number.MAX_SAFE_INTEGER ? "auto" : cell.column.getSize(),
}}
className={cn("overflow-hidden relative", data.length > 10 ? "py-2" : "py-2.5")}
>
{flexRender(cell.column.columnDef.cell, cell.getContext())}
</TableCell>
))}
</TableRow>
))
) : (
<TableRow>
<TableCell colSpan={columns.length} className="h-24 text-center">
<Trans>No systems found.</Trans>
</TableCell>
</TableRow>
)}
</TableBody>
</Table>
</div>
) : (
// grid layout
<div className="grid gap-4 grid-cols-1 sm:grid-cols-2 lg:grid-cols-3">
{rows?.length ? (
rows.map((row) => {
return <SystemCard key={row.original.id} row={row} table={table} colLength={visibleColumns.length} />
{table.getRowModel().rows?.length ? (
table.getRowModel().rows.map((row) => {
const system = row.original
const { status } = system
return (
<Card
key={system.id}
className={cn(
"cursor-pointer hover:shadow-md transition-all bg-transparent w-full dark:border-border duration-200 relative",
{
"opacity-50": status === "paused",
}
)}
>
<CardHeader className="py-1 ps-5 pe-3 bg-muted/30 border-b border-border/60">
<div className="flex items-center justify-between gap-2">
<CardTitle className="text-base tracking-normal shrink-1 text-primary/90 flex items-center min-h-10 gap-2.5 min-w-0">
<div className="flex items-center gap-2.5 min-w-0">
<IndicatorDot system={system} />
<CardTitle className="text-[.95em]/normal tracking-normal truncate text-primary/90">
{system.name}
</CardTitle>
</div>
</CardTitle>
{table.getColumn(t`Actions`)?.getIsVisible() && (
<div className="flex gap-1 flex-shrink-0 relative z-10">
<AlertsButton system={system} />
<ActionsButton system={system} />
</div>
)}
</div>
</CardHeader>
<CardContent className="space-y-2.5 text-sm px-5 pt-3.5 pb-4">
{table.getAllColumns().map((column) => {
if (!column.getIsVisible() || column.id === t`System` || column.id === t`Actions`) return null
const cell = row.getAllCells().find((cell) => cell.column.id === column.id)
if (!cell) return null
return (
<div key={column.id} className="flex items-center gap-3">
{/* @ts-ignore */}
{column.columnDef?.icon && (
// @ts-ignore
<column.columnDef.icon className="size-4 text-muted-foreground" />
)}
<div className="flex items-center gap-3 flex-1">
<span className="text-muted-foreground min-w-16">{column.id}:</span>
<div className="flex-1">{flexRender(cell.column.columnDef.cell, cell.getContext())}</div>
</div>
</div>
)
})}
</CardContent>
<Link
href={getPagePath($router, "system", { name: row.original.name })}
className="inset-0 absolute w-full h-full"
>
<span className="sr-only">{row.original.name}</span>
</Link>
</Card>
)
})
) : (
<div className="col-span-full text-center py-8">
@@ -479,247 +554,6 @@ export default function SystemsTable() {
)
}
const AllSystemsTable = memo(
({ table, rows, colLength }: { table: TableType<SystemRecord>; rows: Row<SystemRecord>[]; colLength: number }) => {
return (
<Table>
<SystemsTableHead table={table} colLength={colLength} />
<TableBody>
{rows.length ? (
rows.map((row) => (
<SystemTableRow key={row.original.id} row={row} length={rows.length} colLength={colLength} />
))
) : (
<TableRow>
<TableCell colSpan={colLength} className="h-24 text-center">
<Trans>No systems found.</Trans>
</TableCell>
</TableRow>
)}
</TableBody>
</Table>
)
}
)
function SystemsTableHead({ table, colLength }: { table: TableType<SystemRecord>; colLength: number }) {
const { i18n } = useLingui()
return useMemo(() => {
return (
<TableHeader>
{table.getHeaderGroups().map((headerGroup) => (
<TableRow key={headerGroup.id}>
{headerGroup.headers.map((header) => {
return (
<TableHead className="px-2" key={header.id}>
{flexRender(header.column.columnDef.header, header.getContext())}
</TableHead>
)
})}
</TableRow>
))}
</TableHeader>
)
}, [i18n.locale, colLength])
}
const SystemTableRow = memo(
({ row, length, colLength }: { row: Row<SystemRecord>; length: number; colLength: number }) => {
const system = row.original
const { t } = useLingui()
return useMemo(() => {
return (
<TableRow
// data-state={row.getIsSelected() && "selected"}
className={cn("cursor-pointer transition-opacity", {
"opacity-50": system.status === "paused",
})}
onClick={(e) => {
const target = e.target as HTMLElement
if (!target.closest("[data-nolink]") && e.currentTarget.contains(target)) {
navigate(getPagePath($router, "system", { name: system.name }))
}
}}
>
{row.getVisibleCells().map((cell) => (
<TableCell
key={cell.id}
style={{
width: cell.column.getSize(),
}}
className={cn("overflow-hidden relative", length > 10 ? "py-2" : "py-2.5")}
>
{flexRender(cell.column.columnDef.cell, cell.getContext())}
</TableCell>
))}
</TableRow>
)
}, [system, system.status, colLength, t])
}
)
const SystemCard = memo(
({ row, table, colLength }: { row: Row<SystemRecord>; table: TableType<SystemRecord>; colLength: number }) => {
const system = row.original
const { t } = useLingui()
return useMemo(() => {
return (
<Card
key={system.id}
className={cn(
"cursor-pointer hover:shadow-md transition-all bg-transparent w-full dark:border-border duration-200 relative",
{
"opacity-50": system.status === "paused",
}
)}
>
<CardHeader className="py-1 ps-5 pe-3 bg-muted/30 border-b border-border/60">
<div className="flex items-center justify-between gap-2">
<CardTitle className="text-base tracking-normal shrink-1 text-primary/90 flex items-center min-h-10 gap-2.5 min-w-0">
<div className="flex items-center gap-2.5 min-w-0">
<IndicatorDot system={system} />
<CardTitle className="text-[.95em]/normal tracking-normal truncate text-primary/90">
{system.name}
</CardTitle>
</div>
</CardTitle>
{table.getColumn("actions")?.getIsVisible() && (
<div className="flex gap-1 flex-shrink-0 relative z-10">
<AlertsButton system={system} />
<ActionsButton system={system} />
</div>
)}
</div>
</CardHeader>
<CardContent className="space-y-2.5 text-sm px-5 pt-3.5 pb-4">
{table.getAllColumns().map((column) => {
if (!column.getIsVisible() || column.id === "system" || column.id === "actions") return null
const cell = row.getAllCells().find((cell) => cell.column.id === column.id)
if (!cell) return null
// @ts-ignore
const { Icon, name } = column.columnDef as ColumnDef<SystemRecord, unknown>
return (
<div key={column.id} className="flex items-center gap-3">
{Icon && <Icon className="size-4 text-muted-foreground" />}
<div className="flex items-center gap-3 flex-1">
<span className="text-muted-foreground min-w-16">{name()}:</span>
<div className="flex-1">{flexRender(cell.column.columnDef.cell, cell.getContext())}</div>
</div>
</div>
)
})}
</CardContent>
<Link
href={getPagePath($router, "system", { name: row.original.name })}
className="inset-0 absolute w-full h-full"
>
<span className="sr-only">{row.original.name}</span>
</Link>
</Card>
)
}, [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(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",
@@ -734,3 +568,99 @@ function IndicatorDot({ system, className }: { system: SystemRecord; className?:
/>
)
}
const ActionsButton = memo(({ system }: { system: SystemRecord }) => {
const [deleteOpen, setDeleteOpen] = useState(false)
const [editOpen, setEditOpen] = useState(false)
let editOpened = useRef(false)
const { id, status, host, name } = system
return (
<>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="ghost" size={"icon"} data-nolink>
<span className="sr-only">
<Trans>Open menu</Trans>
</span>
<MoreHorizontalIcon className="w-5" />
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
{!isReadOnlyUser() && (
<DropdownMenuItem
onSelect={() => {
editOpened.current = true
setEditOpen(true)
}}
>
<PenBoxIcon className="me-2.5 size-4" />
<Trans>Edit</Trans>
</DropdownMenuItem>
)}
<DropdownMenuItem
className={cn(isReadOnlyUser() && "hidden")}
onClick={() => {
pb.collection("systems").update(id, {
status: status === "paused" ? "pending" : "paused",
})
}}
>
{status === "paused" ? (
<>
<PlayCircleIcon className="me-2.5 size-4" />
<Trans>Resume</Trans>
</>
) : (
<>
<PauseCircleIcon className="me-2.5 size-4" />
<Trans>Pause</Trans>
</>
)}
</DropdownMenuItem>
<DropdownMenuItem onClick={() => copyToClipboard(host)}>
<CopyIcon className="me-2.5 size-4" />
<Trans>Copy host</Trans>
</DropdownMenuItem>
<DropdownMenuSeparator className={cn(isReadOnlyUser() && "hidden")} />
<DropdownMenuItem className={cn(isReadOnlyUser() && "hidden")} onSelect={() => setDeleteOpen(true)}>
<Trash2Icon className="me-2.5 size-4" />
<Trans>Delete</Trans>
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
{/* edit dialog */}
<Dialog open={editOpen} onOpenChange={setEditOpen}>
{editOpened.current && <SystemDialog system={system} setOpen={setEditOpen} />}
</Dialog>
{/* deletion dialog */}
<AlertDialog open={deleteOpen} onOpenChange={(open) => setDeleteOpen(open)}>
<AlertDialogContent>
<AlertDialogHeader>
<AlertDialogTitle>
<Trans>Are you sure you want to delete {name}?</Trans>
</AlertDialogTitle>
<AlertDialogDescription>
<Trans>
This action cannot be undone. This will permanently delete all current records for {name} from the
database.
</Trans>
</AlertDialogDescription>
</AlertDialogHeader>
<AlertDialogFooter>
<AlertDialogCancel>
<Trans>Cancel</Trans>
</AlertDialogCancel>
<AlertDialogAction
className={cn(buttonVariants({ variant: "destructive" }))}
onClick={() => pb.collection("systems").delete(id)}
>
<Trans>Continue</Trans>
</AlertDialogAction>
</AlertDialogFooter>
</AlertDialogContent>
</AlertDialog>
</>
)
})

View File

@@ -74,7 +74,6 @@
@layer base {
* {
@apply border-border;
overflow-anchor: none;
}
body {
@apply bg-background text-foreground;

View File

@@ -3,7 +3,15 @@ import { i18n } from "@lingui/core"
import type { Messages } from "@lingui/core"
import languages from "@/lib/languages"
import { detect, fromStorage, fromNavigator } from "@lingui/detect-locale"
import { messages as enMessages } from "@/locales/en/en"
import { messages as enMessages } from "@/locales/en/en.ts"
// let locale = detect(fromUrl("lang"), fromStorage("lang"), fromNavigator(), "en")
let locale = detect(fromStorage("lang"), fromNavigator(), "en")
// log if dev
if (import.meta.env.DEV) {
console.log("detected locale", locale)
}
// activates locale
function activateLocale(locale: string, messages: Messages = enMessages) {
@@ -29,28 +37,21 @@ export async function dynamicActivate(locale: string) {
}
}
export function getLocale() {
// let locale = detect(fromUrl("lang"), fromStorage("lang"), fromNavigator(), "en")
let locale = detect(fromStorage("lang"), fromNavigator(), "en")
// log if dev
if (import.meta.env.DEV) {
console.log("detected locale", locale)
}
// handle zh variants
if (locale?.startsWith("zh-")) {
// map zh variants to zh-CN
const zhVariantMap: Record<string, string> = {
"zh-HK": "zh-HK",
"zh-TW": "zh",
"zh-MO": "zh",
"zh-Hant": "zh",
}
return zhVariantMap[locale] || "zh-CN"
// handle zh variants
if (locale?.startsWith("zh-")) {
// map zh variants to zh-CN
const zhVariantMap: Record<string, string> = {
"zh-HK": "zh-HK",
"zh-TW": "zh",
"zh-MO": "zh",
"zh-Hant": "zh",
}
dynamicActivate(zhVariantMap[locale] || "zh-CN")
} else {
locale = (locale || "en").split("-")[0]
// use en if locale is not in languages
if (!languages.some((l) => l.lang === locale)) {
locale = "en"
}
return locale
dynamicActivate(locale)
}

View File

@@ -18,6 +18,9 @@ export const $alerts = atom([] as AlertRecord[])
/** SSH public key */
export const $publicKey = atom("")
/** Beszel hub version */
export const $hubVersion = atom("")
/** Chart time period */
export const $chartTime = atom("1h") as PreinitializedWritableAtom<ChartTimes>

View File

@@ -1,4 +1,3 @@
import { t } from "@lingui/core/macro";
import { toast } from "@/components/ui/use-toast"
import { type ClassValue, clsx } from "clsx"
import { twMerge } from "tailwind-merge"
@@ -10,21 +9,13 @@ import { timeDay, timeHour } from "d3-time"
import { useEffect, useState } from "react"
import { CpuIcon, HardDriveIcon, MemoryStickIcon, ServerIcon } from "lucide-react"
import { EthernetIcon, ThermometerIcon } from "@/components/ui/icons"
import { t } from "@lingui/macro"
import { prependBasePath } from "@/components/router"
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs))
}
/** Adds event listener to node and returns function that removes the listener */
export function listen<T extends Event = Event>(
node: Node,
event: string,
handler: (event: T) => void
) {
node.addEventListener(event, handler as EventListener)
return () => node.removeEventListener(event, handler as EventListener)
}
// export const cn = clsx
export async function copyToClipboard(content: string) {
const duration = 1500
@@ -77,7 +68,6 @@ export const updateSystemList = (() => {
/** Logs the user out by clearing the auth store and unsubscribing from realtime updates. */
export async function logOut() {
sessionStorage.setItem("lo", "t")
pb.authStore.clear()
pb.realtime.unsubscribe()
}

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: ar\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-03-06 07:27\n"
"PO-Revision-Date: 2025-04-23 17:19\n"
"Last-Translator: \n"
"Language-Team: Arabic\n"
"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n"
@@ -148,7 +148,7 @@ msgstr "يدعم Beszel OpenID Connect والعديد من مزودي المصا
#: src/components/routes/settings/notifications.tsx:129
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "يستخدم Beszel <0>Shoutrrr</0> للتكامل مع خدمات الإشعارات الشهيرة."
msgstr "يستخدم بيزيل <0>Shoutrrr</0> للتكامل مع خدمات الإشعارات الشهيرة."
#: src/components/add-system.tsx:131
msgid "Binary"
@@ -281,7 +281,7 @@ msgstr "استخدام القرص لـ {extraFsName}"
#: src/components/routes/system.tsx:445
msgid "Docker CPU Usage"
msgstr "استخدام CPU لـ Docker"
msgstr "استخدام المعالج لـ Docker"
#: src/components/routes/system.tsx:466
msgid "Docker Memory Usage"
@@ -300,29 +300,29 @@ msgstr "التوثيق"
#: src/components/systems-table/systems-table.tsx:142
#: src/components/routes/system.tsx:345
msgid "Down"
msgstr ""
msgstr "معطل"
#: src/components/add-system.tsx:126
#: src/components/systems-table/systems-table.tsx:653
msgid "Edit"
msgstr ""
msgstr "تعديل"
#: src/components/login/forgot-pass-form.tsx:54
#: src/components/login/auth-form.tsx:176
msgid "Email"
msgstr "البريد الإلكتروني"
msgstr "البريد الإشباكي"
#: src/components/routes/settings/notifications.tsx:93
msgid "Email notifications"
msgstr "إشعارات البريد الإلكتروني"
msgstr "إشعارات البريد الإشباكي"
#: src/components/login/login.tsx:38
msgid "Enter email address to reset password"
msgstr "أدخل عنوان البريد الإلكتروني لإعادة تعيين كلمة المرور"
msgstr "أدخل عنوان البريد الإشباكي لإعادة تعيين كلمة المرور"
#: src/components/routes/settings/notifications.tsx:113
msgid "Enter email address..."
msgstr "أدخل عنوان البريد الإلكتروني..."
msgstr "أدخل عنوان البريد الإشباكي..."
#: src/components/routes/settings/notifications.tsx:189
#: src/components/routes/settings/config-yaml.tsx:29
@@ -403,12 +403,12 @@ msgstr "إذا فقدت كلمة المرور لحساب المسؤول الخا
#: src/components/login/auth-form.tsx:18
msgid "Invalid email address."
msgstr "عنوان البريد الإلكتروني غير صالح."
msgstr "عنوان البريد الإشباكي غير صالح."
#. Linux kernel
#: src/components/routes/system.tsx:271
msgid "Kernel"
msgstr "كيرنل"
msgstr "النواة"
#: src/components/routes/settings/general.tsx:45
msgid "Language"
@@ -451,7 +451,7 @@ msgstr "إدارة تفضيلات العرض والإشعارات."
#: src/components/add-system.tsx:227
msgid "Manual setup instructions"
msgstr ""
msgstr "تعليمات الإعداد اليدوي"
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:673
@@ -541,7 +541,7 @@ msgstr "كلمة المرور يجب أن تتكون من 8 أحرف على ال
#: src/components/login/auth-form.tsx:22
msgid "Password must be less than 72 bytes."
msgstr ""
msgstr "يجب أن تكون كلمة المرور أقل من 72 بايت."
#: src/components/login/forgot-pass-form.tsx:34
msgid "Password reset request received"
@@ -553,7 +553,7 @@ msgstr "إيقاف مؤقت"
#: src/components/systems-table/systems-table.tsx:143
msgid "Paused"
msgstr ""
msgstr "متوقف مؤقتا"
#: src/components/routes/settings/notifications.tsx:97
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
@@ -627,7 +627,7 @@ msgstr "استئناف"
#: src/components/routes/settings/notifications.tsx:119
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "احفظ العنوان باستخدام مفتاح الإدخال أو الفاصلة. اتركه فارغًا لتعطيل إشعارات البريد الإلكتروني."
msgstr "احفظ العنوان باستخدام مفتاح الإدخال أو الفاصلة. اتركه فارغًا لتعطيل إشعارات البريد الإشباكي."
#: src/components/routes/settings/notifications.tsx:169
#: src/components/routes/settings/general.tsx:106
@@ -636,7 +636,7 @@ msgstr "حفظ الإعدادات"
#: src/components/add-system.tsx:232
msgid "Save system"
msgstr ""
msgstr "احفظ النظام"
#: src/components/navbar.tsx:134
msgid "Search"
@@ -717,7 +717,7 @@ msgstr "جدول"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:244
msgid "Temp"
msgstr ""
msgstr "درجة الحرارة"
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:534
@@ -762,7 +762,7 @@ msgstr "معدل نقل نظام الملفات الجذر"
#: src/components/routes/settings/notifications.tsx:108
msgid "To email(s)"
msgstr "إلى البريد الإلكتروني"
msgstr "إلى البريد الإشباكي"
#: src/components/routes/system.tsx:409
#: src/components/routes/system.tsx:422
@@ -801,7 +801,7 @@ msgstr "يتم التفعيل عندما يتجاوز استخدام أي قرص
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:343
msgid "Up"
msgstr ""
msgstr "قيد التشغيل"
#: src/components/systems-table/systems-table.tsx:350
msgid "Updated in real time. Click on a system to view information."
@@ -869,3 +869,4 @@ msgstr "تكوين YAML"
#: src/components/routes/settings/layout.tsx:35
msgid "Your user settings have been updated."
msgstr "تم تحديث إعدادات المستخدم الخاصة بك."

View File

@@ -19,11 +19,11 @@ msgstr ""
"X-Crowdin-File-ID: 16\n"
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:259
#: src/components/routes/system.tsx:255
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# ден} other {# дни}}"
#: src/components/routes/system.tsx:257
#: src/components/routes/system.tsx:253
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# час} other {# часа}}"
@@ -48,27 +48,30 @@ msgid "30 days"
msgstr "30 дни"
#. Table column
#: src/components/systems-table/systems-table.tsx:304
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "Действия"
#: src/components/routes/home.tsx:94
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Активни тревоги"
#: src/components/add-system.tsx:43
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Добави <0>Система</0>"
#: src/components/add-system.tsx:126
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "Добави нова система"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Add system"
msgstr "Добави система"
#: src/components/routes/settings/notifications.tsx:158
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Добави URL"
@@ -84,21 +87,21 @@ msgstr "Настрой опциите за показване на диагра
msgid "Admin"
msgstr "Администратор"
#: src/components/systems-table/systems-table.tsx:270
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "Агент"
#: src/components/alerts/alert-button.tsx:33
#: src/components/alerts/alert-button.tsx:79
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "Тревоги"
#: src/components/systems-table/systems-table.tsx:347
#: src/components/alerts/alert-button.tsx:99
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
msgid "All Systems"
msgstr "Всички системи"
#: src/components/systems-table/systems-table.tsx:696
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "Сигурен ли си, че искаш да изтриеш {name}?"
@@ -106,29 +109,29 @@ msgstr "Сигурен ли си, че искаш да изтриеш {name}?"
msgid "Automatic copy requires a secure context."
msgstr "Автоматичното копиране изисква защитен контескт."
#: src/components/routes/system.tsx:670
#: src/components/routes/system.tsx:660
msgid "Average"
msgstr "Средно"
#: src/components/routes/system.tsx:446
#: src/components/routes/system.tsx:437
msgid "Average CPU utilization of containers"
msgstr "Средно използване на процесора на контейнерите"
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:253
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Средната стойност надхвърля <0>{value}{0}</0>"
#: src/components/routes/system.tsx:547
#: src/components/routes/system.tsx:538
msgid "Average power consumption of GPUs"
msgstr "Средна консумация на ток от графични карти"
#: src/components/routes/system.tsx:435
#: src/components/routes/system.tsx:426
msgid "Average system-wide CPU utilization"
msgstr "Средно използване на процесора на цялата система"
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:569
#: src/components/routes/system.tsx:556
msgid "Average utilization of {0}"
msgstr "Средно използване на {0}"
@@ -138,31 +141,31 @@ msgid "Backups"
msgstr "Архиви"
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:491
#: src/components/routes/system.tsx:482
msgid "Bandwidth"
msgstr "Bandwidth на мрежата"
#: src/components/login/auth-form.tsx:305
#: src/components/login/auth-form.tsx:306
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel поддържа OpenID Connect и много други OAuth2 доставчици за удостоверяване."
#: src/components/routes/settings/notifications.tsx:129
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel ползва <0>Shoutrrr</0> за да се интегрира с известни услуги за уведомяване."
#: src/components/add-system.tsx:131
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "Двоичен код"
#: src/components/charts/mem-chart.tsx:87
#: src/components/charts/mem-chart.tsx:89
msgid "Cache / Buffers"
msgstr "Кеш / Буфери"
#: src/components/systems-table/systems-table.tsx:707
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "Откажи"
#: src/components/routes/settings/config-yaml.tsx:69
#: src/components/routes/settings/config-yaml.tsx:68
msgid "Caution - potential data loss"
msgstr "Внимание - възможност за загуба на данни"
@@ -174,37 +177,37 @@ msgstr "Смени общите опции на приложението."
msgid "Chart options"
msgstr "Опции на диаграмата"
#: src/components/login/forgot-pass-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:34
msgid "Check {email} for a reset link."
msgstr "Провери {email} за линк за нулиране."
#: src/components/routes/settings/layout.tsx:41
#: src/components/routes/settings/layout.tsx:40
msgid "Check logs for more details."
msgstr "Провери log-овете за повече информация."
#: src/components/routes/settings/notifications.tsx:185
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Провери услугата си за удостоверяване"
#: src/components/add-system.tsx:205
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "Настисни за да копираш"
#: src/components/login/forgot-pass-form.tsx:84
#: src/components/login/forgot-pass-form.tsx:90
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Инструкции за командната линия"
#: src/components/routes/settings/notifications.tsx:79
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Настрой как получаваш нотификации за тревоги."
#: src/components/login/auth-form.tsx:213
#: src/components/login/auth-form.tsx:218
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "Потвърди парола"
#: src/components/systems-table/systems-table.tsx:713
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "Продължи"
@@ -212,16 +215,16 @@ msgstr "Продължи"
msgid "Copied to clipboard"
msgstr "Записано в клипборда"
#: src/components/add-system.tsx:216
#: src/components/add-system.tsx:218
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "Копирай"
#: src/components/systems-table/systems-table.tsx:678
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "Копирай хоста"
#: src/components/add-system.tsx:225
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "Копирай linux командата"
@@ -229,27 +232,27 @@ msgstr "Копирай linux командата"
msgid "Copy text"
msgstr "Копирай текста"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "Процесор"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:434
#: src/components/charts/area-chart.tsx:58
#: src/components/routes/system.tsx:425
#: src/components/charts/area-chart.tsx:56
msgid "CPU Usage"
msgstr "Употреба на процесор"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "Създай акаунт"
#. Dark theme
#: src/components/mode-toggle.tsx:22
#: src/components/mode-toggle.tsx:21
msgid "Dark"
msgstr "Тъмно"
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:36
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Табло"
@@ -257,37 +260,37 @@ msgstr "Табло"
msgid "Default time period"
msgstr "Времеви диапазон по подразбиране"
#: src/components/systems-table/systems-table.tsx:683
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "Изтрий"
#: src/components/systems-table/systems-table.tsx:204
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "Диск"
#: src/components/routes/system.tsx:481
#: src/components/routes/system.tsx:472
msgid "Disk I/O"
msgstr "Диск I/O"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:474
#: src/components/charts/disk-chart.tsx:77
#: src/components/routes/system.tsx:465
#: src/components/charts/disk-chart.tsx:79
msgid "Disk Usage"
msgstr "Използване на диск"
#: src/components/routes/system.tsx:603
#: src/components/routes/system.tsx:593
msgid "Disk usage of {extraFsName}"
msgstr "Изполване на диск от {extraFsName}"
#: src/components/routes/system.tsx:445
#: src/components/routes/system.tsx:436
msgid "Docker CPU Usage"
msgstr "Използване на процесор от docker"
#: src/components/routes/system.tsx:466
#: src/components/routes/system.tsx:457
msgid "Docker Memory Usage"
msgstr "Изполване на памет от docker"
#: src/components/routes/system.tsx:507
#: src/components/routes/system.tsx:498
msgid "Docker Network I/O"
msgstr "Мрежов I/O използван от docker"
@@ -297,22 +300,22 @@ msgstr "Документация"
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:142
#: src/components/routes/system.tsx:345
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:336
msgid "Down"
msgstr ""
#: src/components/add-system.tsx:126
#: src/components/systems-table/systems-table.tsx:653
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr ""
#: src/components/login/forgot-pass-form.tsx:54
#: src/components/login/auth-form.tsx:176
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
msgid "Email"
msgstr "Имейл"
#: src/components/routes/settings/notifications.tsx:93
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "Имейл нотификации"
@@ -320,32 +323,32 @@ msgstr "Имейл нотификации"
msgid "Enter email address to reset password"
msgstr "Въведи имейл адрес за да нулираш паролата"
#: src/components/routes/settings/notifications.tsx:113
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Въведи имейл адрес..."
#: src/components/routes/settings/notifications.tsx:189
#: src/components/routes/settings/config-yaml.tsx:29
#: src/components/login/auth-form.tsx:137
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "Грешка"
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: src/components/routes/home.tsx:113
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "Надвишава {0}{1} в последните {2, plural, one {# минута} other {# минути}}"
#: src/components/routes/settings/config-yaml.tsx:73
#: src/components/routes/settings/config-yaml.tsx:72
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "Съществуващи системи които не са дефинирани в <0>config.yml</0> ще бъдат изтрити. Моля прави чести архиви."
#: src/components/routes/settings/config-yaml.tsx:94
#: src/components/routes/settings/config-yaml.tsx:93
msgid "Export configuration"
msgstr "Експортирай конфигурация"
#: src/components/routes/settings/config-yaml.tsx:49
#: src/components/routes/settings/config-yaml.tsx:48
msgid "Export your current systems configuration."
msgstr "Експортирай конфигурацията на системите."
@@ -353,60 +356,60 @@ msgstr "Експортирай конфигурацията на системи
msgid "Failed to authenticate"
msgstr "Неуспешно удостоверяване"
#: src/components/routes/settings/notifications.tsx:64
#: src/components/routes/settings/layout.tsx:40
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
msgid "Failed to save settings"
msgstr "Неуспешно запазване на настройки"
#: src/components/routes/settings/notifications.tsx:190
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Неуспешно изпрати тестова нотификация"
#: src/components/alerts/alerts-system.tsx:26
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Неуспешно обнови тревога"
#: src/components/systems-table/systems-table.tsx:354
#: src/components/routes/system.tsx:643
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:633
msgid "Filter..."
msgstr "Филтрирай..."
#: src/components/alerts/alerts-system.tsx:285
#: src/components/alerts/alerts-system.tsx:230
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "За <0>{min}</0> {min, plural, one {минута} other {минути}}"
#: src/components/login/auth-form.tsx:328
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "Забравена парола?"
#. Context: General settings
#: src/components/routes/settings/layout.tsx:52
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "Общо"
#: src/components/routes/system.tsx:546
#: src/components/routes/system.tsx:537
msgid "GPU Power Draw"
msgstr "Консумация на ток от графична карта"
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "Мрежово"
#: src/components/add-system.tsx:159
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "Хост / IP"
#: src/components/login/forgot-pass-form.tsx:94
#: src/components/login/forgot-pass-form.tsx:93
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Ако си загубил паролата до администраторския акаунт, можеш да я нулираш със следващата команда."
#: src/components/login/auth-form.tsx:18
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Невалиден имейл адрес."
#. Linux kernel
#: src/components/routes/system.tsx:271
#: src/components/routes/system.tsx:267
msgid "Kernel"
msgstr "Linux Kernel"
@@ -414,12 +417,12 @@ msgstr "Linux Kernel"
msgid "Language"
msgstr "Език"
#: src/components/systems-table/systems-table.tsx:367
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "Подреждане"
#. Light theme
#: src/components/mode-toggle.tsx:17
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Светъл"
@@ -431,8 +434,8 @@ msgstr "Изход"
msgid "Login"
msgstr "Вход"
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "Неуспешен опит за вход"
@@ -441,49 +444,49 @@ msgstr "Неуспешен опит за вход"
msgid "Logs"
msgstr "Логове"
#: src/components/routes/settings/notifications.tsx:82
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "Търсиш къде да създадеш тревоги? Натисни емотиконата за звънец <0/> в таблицата за системи."
#: src/components/routes/settings/layout.tsx:86
#: src/components/routes/settings/layout.tsx:85
msgid "Manage display and notification preferences."
msgstr "Управление на предпочитанията за показване и уведомяване."
#: src/components/add-system.tsx:227
#: src/components/add-system.tsx:226
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:673
#: src/components/routes/system.tsx:663
msgid "Max 1 min"
msgstr "Максимум 1 минута"
#: src/components/systems-table/systems-table.tsx:195
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "Памет"
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:456
#: src/components/routes/system.tsx:447
msgid "Memory Usage"
msgstr "Употреба на паметта"
#: src/components/routes/system.tsx:467
#: src/components/routes/system.tsx:458
msgid "Memory usage of docker containers"
msgstr "Използването на памет от docker контейнерите"
#: src/components/add-system.tsx:155
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "Име"
#: src/components/systems-table/systems-table.tsx:223
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "Мрежа"
#: src/components/routes/system.tsx:508
#: src/components/routes/system.tsx:499
msgid "Network traffic of docker containers"
msgstr "Мрежов трафик на docker контейнери"
#: src/components/routes/system.tsx:493
#: src/components/routes/system.tsx:484
msgid "Network traffic of public interfaces"
msgstr "Мрежов трафик на публични интерфейси"
@@ -491,34 +494,34 @@ msgstr "Мрежов трафик на публични интерфейси"
msgid "No results found."
msgstr "Няма намерени резултати."
#: src/components/systems-table/systems-table.tsx:472
#: src/components/systems-table/systems-table.tsx:495
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "Няма намерени системи."
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:76
#: src/components/routes/settings/layout.tsx:57
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
msgid "Notifications"
msgstr "Нотификации"
#: src/components/login/auth-form.tsx:300
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "Поддръжка на OAuth 2 / OIDC"
#: src/components/routes/settings/config-yaml.tsx:62
#: src/components/routes/settings/config-yaml.tsx:61
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "На всеки рестарт, системите в датабазата ще бъдат обновени да съвпадат със системите зададени във файла."
#: src/components/systems-table/systems-table.tsx:639
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "Отвори менюто"
#: src/components/login/auth-form.tsx:251
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "Или продължи с"
#: src/components/alerts/alert-button.tsx:120
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "Презапиши съществуващи тревоги"
@@ -530,41 +533,41 @@ msgstr "Страница"
msgid "Pages / Settings"
msgstr "Страници / Настройки"
#: src/components/login/auth-form.tsx:195
#: src/components/login/auth-form.tsx:200
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "Парола"
#: src/components/login/auth-form.tsx:21
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "Паролата трябва да е поне 8 символа."
#: src/components/login/auth-form.tsx:22
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr ""
#: src/components/login/forgot-pass-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Получено е искането за нулиране на паролата"
#: src/components/systems-table/systems-table.tsx:672
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "Пауза"
#: src/components/systems-table/systems-table.tsx:143
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr ""
#: src/components/routes/settings/notifications.tsx:97
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "Моля <0>конфигурурай SMTP сървър</0> за да се подсигуриш, че тревогите са доставени."
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Моля провери log-овете за повече информация."
#: src/components/login/forgot-pass-form.tsx:17
#: src/components/login/auth-form.tsx:41
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "Моля провери дадената информация и опитай отново"
@@ -572,7 +575,7 @@ msgstr "Моля провери дадената информация и опи
msgid "Please create an admin account"
msgstr "Моля създай администраторски акаунт"
#: src/components/login/auth-form.tsx:138
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Моля активирай изскачащите прозорци за този сайт"
@@ -580,7 +583,7 @@ msgstr "Моля активирай изскачащите прозорци за
msgid "Please log in again"
msgstr "Моля влез отново"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Моля виж <0>документацията</0> за инструкции."
@@ -588,12 +591,12 @@ msgstr "Моля виж <0>документацията</0> за инструк
msgid "Please sign in to your account"
msgstr "Моля влез в акаунта ти"
#: src/components/add-system.tsx:171
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "Порт"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:577
#: src/components/routes/system.tsx:448
#: src/components/routes/system.tsx:564
msgid "Precise utilization at the recorded time"
msgstr "Точно използване в записаното време"
@@ -602,39 +605,39 @@ msgid "Preferred Language"
msgstr "Предпочитан език"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:182
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "Публичен ключ"
#. Disk read
#: src/components/charts/area-chart.tsx:62
#: src/components/charts/area-chart.tsx:72
#: src/components/charts/area-chart.tsx:60
#: src/components/charts/area-chart.tsx:70
msgid "Read"
msgstr "Прочети"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx:67
#: src/components/charts/area-chart.tsx:65
msgid "Received"
msgstr "Получени"
#: src/components/login/forgot-pass-form.tsx:77
#: src/components/login/forgot-pass-form.tsx:76
msgid "Reset Password"
msgstr "Нулиране на парола"
#: src/components/systems-table/systems-table.tsx:667
#: src/components/systems-table/systems-table.tsx:628
msgid "Resume"
msgstr "Възобнови"
#: src/components/routes/settings/notifications.tsx:119
#: src/components/routes/settings/notifications.tsx:118
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Запази адреса с enter или запетая. Остави празно за да изключиш нотификациите чрез имейл."
#: src/components/routes/settings/notifications.tsx:169
#: src/components/routes/settings/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
msgid "Save Settings"
msgstr "Запази настройките"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr ""
@@ -646,12 +649,12 @@ msgstr "Търси"
msgid "Search for systems or settings..."
msgstr "Търси за системи или настройки..."
#: src/components/alerts/alert-button.tsx:82
#: src/components/alerts/alert-button.tsx:71
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Виж <0>настройките за нотификациите</0> за да конфигурираш как получаваш тревоги."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx:66
#: src/components/charts/area-chart.tsx:64
msgid "Sent"
msgstr "Изпратени"
@@ -662,16 +665,16 @@ msgstr "Задава диапазона за време за диаграмит
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:72
#: src/components/routes/settings/layout.tsx:83
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
msgstr "Настройки"
#: src/components/routes/settings/layout.tsx:34
#: src/components/routes/settings/layout.tsx:33
msgid "Settings saved"
msgstr "Настройките са запазени"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "Влез"
@@ -679,7 +682,7 @@ msgstr "Влез"
msgid "SMTP settings"
msgstr "Настройки за SMTP"
#: src/components/systems-table/systems-table.tsx:389
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "Сортиране по"
@@ -687,18 +690,21 @@ msgstr "Сортиране по"
msgid "Status"
msgstr "Статус"
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:514
msgid "Swap space used by the system"
msgstr "Изполван swap от системата"
#: src/components/routes/system.tsx:522
#: src/components/routes/system.tsx:513
msgid "Swap Usage"
msgstr "Използване на swap"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:27
#: src/components/systems-table/systems-table.tsx:152
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "Система"
@@ -706,70 +712,70 @@ msgstr "Система"
msgid "Systems"
msgstr "Системи"
#: src/components/routes/settings/config-yaml.tsx:56
#: src/components/routes/settings/config-yaml.tsx:55
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "Системите могат да бъдат управлявани в <0>config.yml</0> файл намиращ се в директорията с данни."
#: src/components/systems-table/systems-table.tsx:377
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "Таблица"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:244
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr ""
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:534
#: src/components/routes/system.tsx:525
msgid "Temperature"
msgstr "Температура"
#: src/components/routes/system.tsx:535
#: src/components/routes/system.tsx:526
msgid "Temperatures of system sensors"
msgstr "Температири на системни сензори"
#: src/components/routes/settings/notifications.tsx:213
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Тествай <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:184
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Тестова нотификация изпратена"
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:146
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "Агента трябва да работи на системата за да се свърже. Копирай инсталационната команда за агента долу."
#: src/components/add-system.tsx:138
#: src/components/add-system.tsx:137
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "Агемта трябва да работи на системата за да се свърже. Копирай <0>docker-compose.yml</0> файла за агента долу."
#: src/components/login/forgot-pass-form.tsx:99
#: src/components/login/forgot-pass-form.tsx:98
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "След това влез в backend-а и нулирай паролата за потребителския акаунт в таблицата за потребители."
#: src/components/systems-table/systems-table.tsx:699
#: src/components/systems-table/systems-table.tsx:660
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Това действие не може да бъде отменено. Това ще изтрие всички записи за {name} от датабазата."
#: src/components/routes/system.tsx:615
#: src/components/routes/system.tsx:605
msgid "Throughput of {extraFsName}"
msgstr "Пропускателна способност на {extraFsName}"
#: src/components/routes/system.tsx:482
#: src/components/routes/system.tsx:473
msgid "Throughput of root filesystem"
msgstr "Пропускателна способност на root файловата система"
#: src/components/routes/settings/notifications.tsx:108
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "До имейл(ите)"
#: src/components/routes/system.tsx:409
#: src/components/routes/system.tsx:422
#: src/components/routes/system.tsx:400
#: src/components/routes/system.tsx:413
msgid "Toggle grid"
msgstr "Превключване на мрежа"
#: src/components/mode-toggle.tsx:34
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "Включи тема"
@@ -798,32 +804,32 @@ msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Задейства се, когато употребата на някой диск надивши зададен праг"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:343
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:334
msgid "Up"
msgstr ""
#: src/components/systems-table/systems-table.tsx:350
#: src/components/systems-table/systems-table.tsx:337
msgid "Updated in real time. Click on a system to view information."
msgstr "Актуализира се в реално време. Натисни на система за да видиш информация."
#: src/components/routes/system.tsx:270
#: src/components/routes/system.tsx:266
msgid "Uptime"
msgstr "Време на работа"
#: src/components/routes/system.tsx:568
#: src/components/routes/system.tsx:602
#: src/components/charts/area-chart.tsx:75
#: src/components/routes/system.tsx:555
#: src/components/routes/system.tsx:592
#: src/components/charts/area-chart.tsx:73
msgid "Usage"
msgstr "Употреба"
#: src/components/routes/system.tsx:474
#: src/components/routes/system.tsx:465
msgid "Usage of root partition"
msgstr "Употреба на root partition-а"
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:63
#: src/components/charts/area-chart.tsx:75
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "Използвани"
@@ -832,15 +838,15 @@ msgstr "Използвани"
msgid "Users"
msgstr "Потребители"
#: src/components/systems-table/systems-table.tsx:359
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "Изглед"
#: src/components/systems-table/systems-table.tsx:424
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "Видими полета"
#: src/components/routes/system.tsx:707
#: src/components/routes/system.tsx:697
msgid "Waiting for enough records to display"
msgstr "Изчаква се за достатъчно записи за показване"
@@ -848,24 +854,25 @@ msgstr "Изчаква се за достатъчно записи за пока
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "Искаш да помогнеш да направиш преводите още по-добри? Провери нашия <0>Crowdin</0> за повече детайли."
#: src/components/routes/settings/notifications.tsx:126
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / Пуш нотификации"
#. Disk write
#: src/components/charts/area-chart.tsx:61
#: src/components/charts/area-chart.tsx:71
#: src/components/charts/area-chart.tsx:59
#: src/components/charts/area-chart.tsx:69
msgid "Write"
msgstr "Запиши"
#: src/components/routes/settings/layout.tsx:62
#: src/components/routes/settings/layout.tsx:61
msgid "YAML Config"
msgstr "YAML конфигурация"
#: src/components/routes/settings/config-yaml.tsx:46
#: src/components/routes/settings/config-yaml.tsx:45
msgid "YAML Configuration"
msgstr "YAML конфигурация"
#: src/components/routes/settings/layout.tsx:35
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "Настройките за потребителя ти са обновени."

View File

@@ -19,11 +19,11 @@ msgstr ""
"X-Crowdin-File-ID: 16\n"
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:259
#: src/components/routes/system.tsx:258
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# den} few {# dny} other {# dní}}"
#: src/components/routes/system.tsx:257
#: src/components/routes/system.tsx:256
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# Hodina} few {# Hodiny} many {# Hodin} other {# Hodin}}"
@@ -48,27 +48,30 @@ msgid "30 days"
msgstr "30 dní"
#. Table column
#: src/components/systems-table/systems-table.tsx:304
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "Akce"
#: src/components/routes/home.tsx:94
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Aktivní výstrahy"
#: src/components/add-system.tsx:43
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Přidat <0>Systém</0>"
#: src/components/add-system.tsx:126
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "Přidat nový systém"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Add system"
msgstr "Přidat systém"
#: src/components/routes/settings/notifications.tsx:158
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Přidat URL"
@@ -84,21 +87,21 @@ msgstr "Upravit možnosti zobrazení pro grafy."
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx:270
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "Agent"
#: src/components/alerts/alert-button.tsx:33
#: src/components/alerts/alert-button.tsx:79
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "Výstrahy"
#: src/components/systems-table/systems-table.tsx:347
#: src/components/alerts/alert-button.tsx:99
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
msgid "All Systems"
msgstr "Všechny systémy"
#: src/components/systems-table/systems-table.tsx:696
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "Opravdu chcete odstranit {name}?"
@@ -106,29 +109,29 @@ msgstr "Opravdu chcete odstranit {name}?"
msgid "Automatic copy requires a secure context."
msgstr "Automatická kopie vyžaduje zabezpečený kontext."
#: src/components/routes/system.tsx:670
#: src/components/routes/system.tsx:668
msgid "Average"
msgstr "Průměr"
#: src/components/routes/system.tsx:446
#: src/components/routes/system.tsx:445
msgid "Average CPU utilization of containers"
msgstr "Průměrné využití CPU kontejnerů"
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:253
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Průměr je vyšší než <0>{value}{0}</0>"
#: src/components/routes/system.tsx:547
#: src/components/routes/system.tsx:546
msgid "Average power consumption of GPUs"
msgstr "Průměrná spotřeba energie GPU"
#: src/components/routes/system.tsx:435
#: src/components/routes/system.tsx:434
msgid "Average system-wide CPU utilization"
msgstr "Průměrné využití CPU v celém systému"
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:569
#: src/components/routes/system.tsx:564
msgid "Average utilization of {0}"
msgstr "Průměrné využití {0}"
@@ -138,31 +141,31 @@ msgid "Backups"
msgstr "Zálohy"
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:491
#: src/components/routes/system.tsx:490
msgid "Bandwidth"
msgstr "Přenos"
#: src/components/login/auth-form.tsx:305
#: src/components/login/auth-form.tsx:306
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel podporuje OpenID Connect a mnoho poskytovatelů OAuth2 ověřování."
#: src/components/routes/settings/notifications.tsx:129
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel používá <0>Shoutrrr</0> k integraci s populárními notifikačními službami."
#: src/components/add-system.tsx:131
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "Binary"
#: src/components/charts/mem-chart.tsx:87
#: src/components/charts/mem-chart.tsx:89
msgid "Cache / Buffers"
msgstr "Cache / vyrovnávací paměť"
#: src/components/systems-table/systems-table.tsx:707
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "Zrušit"
#: src/components/routes/settings/config-yaml.tsx:69
#: src/components/routes/settings/config-yaml.tsx:68
msgid "Caution - potential data loss"
msgstr "Upozornění - možná ztráta dat"
@@ -174,37 +177,37 @@ msgstr "Změnit obecné nastavení aplikace."
msgid "Chart options"
msgstr "Možnosti grafu"
#: src/components/login/forgot-pass-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:34
msgid "Check {email} for a reset link."
msgstr "Zkontrolujte {email} pro odkaz na obnovení."
#: src/components/routes/settings/layout.tsx:41
#: src/components/routes/settings/layout.tsx:40
msgid "Check logs for more details."
msgstr "Pro více informací zkontrolujte logy."
#: src/components/routes/settings/notifications.tsx:185
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Zkontrolujte službu upozornění"
#: src/components/add-system.tsx:205
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "Klikněte pro zkopírování"
#: src/components/login/forgot-pass-form.tsx:84
#: src/components/login/forgot-pass-form.tsx:90
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Instrukce příkazového řádku"
#: src/components/routes/settings/notifications.tsx:79
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Konfigurace způsobu přijímání upozornění."
#: src/components/login/auth-form.tsx:213
#: src/components/login/auth-form.tsx:218
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "Potvrdit heslo"
#: src/components/systems-table/systems-table.tsx:713
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "Pokračovat"
@@ -212,16 +215,16 @@ msgstr "Pokračovat"
msgid "Copied to clipboard"
msgstr "Zkopírováno do schránky"
#: src/components/add-system.tsx:216
#: src/components/add-system.tsx:218
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "Kopírovat"
#: src/components/systems-table/systems-table.tsx:678
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "Kopírovat hostitele"
#: src/components/add-system.tsx:225
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "Kopírovat příkaz Linux"
@@ -229,27 +232,27 @@ msgstr "Kopírovat příkaz Linux"
msgid "Copy text"
msgstr "Kopírovat text"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "Procesor"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:434
#: src/components/charts/area-chart.tsx:58
#: src/components/routes/system.tsx:433
#: src/components/charts/area-chart.tsx:56
msgid "CPU Usage"
msgstr "Využití procesoru"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "Vytvořit účet"
#. Dark theme
#: src/components/mode-toggle.tsx:22
#: src/components/mode-toggle.tsx:21
msgid "Dark"
msgstr "Tmavý"
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:36
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Přehled"
@@ -257,37 +260,37 @@ msgstr "Přehled"
msgid "Default time period"
msgstr "Výchozí doba"
#: src/components/systems-table/systems-table.tsx:683
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "Odstranit"
#: src/components/systems-table/systems-table.tsx:204
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "Disk"
#: src/components/routes/system.tsx:481
#: src/components/routes/system.tsx:480
msgid "Disk I/O"
msgstr "Disk I/O"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:474
#: src/components/charts/disk-chart.tsx:77
#: src/components/routes/system.tsx:473
#: src/components/charts/disk-chart.tsx:79
msgid "Disk Usage"
msgstr "Využití disku"
#: src/components/routes/system.tsx:603
#: src/components/routes/system.tsx:601
msgid "Disk usage of {extraFsName}"
msgstr "Využití disku {extraFsName}"
#: src/components/routes/system.tsx:445
#: src/components/routes/system.tsx:444
msgid "Docker CPU Usage"
msgstr "Využití CPU Dockeru"
#: src/components/routes/system.tsx:466
#: src/components/routes/system.tsx:465
msgid "Docker Memory Usage"
msgstr "Využití paměti Dockeru"
#: src/components/routes/system.tsx:507
#: src/components/routes/system.tsx:506
msgid "Docker Network I/O"
msgstr "Síťové I/O Dockeru"
@@ -297,22 +300,22 @@ msgstr "Dokumentace"
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:142
#: src/components/routes/system.tsx:345
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:344
msgid "Down"
msgstr "Nefunkční"
#: src/components/add-system.tsx:126
#: src/components/systems-table/systems-table.tsx:653
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr "Upravit"
#: src/components/login/forgot-pass-form.tsx:54
#: src/components/login/auth-form.tsx:176
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
msgid "Email"
msgstr "Email"
#: src/components/routes/settings/notifications.tsx:93
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "Emailová upozornění"
@@ -320,32 +323,32 @@ msgstr "Emailová upozornění"
msgid "Enter email address to reset password"
msgstr "Zadejte e-mailovou adresu pro obnovu hesla"
#: src/components/routes/settings/notifications.tsx:113
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Zadejte e-mailovou adresu..."
#: src/components/routes/settings/notifications.tsx:189
#: src/components/routes/settings/config-yaml.tsx:29
#: src/components/login/auth-form.tsx:137
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "Chyba"
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: src/components/routes/home.tsx:113
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "Překračuje {0}{1} za {2, plural, one {poslední # minutu} few {poslední # minuty} other {posledních # minut}}"
#: src/components/routes/settings/config-yaml.tsx:73
#: src/components/routes/settings/config-yaml.tsx:72
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "Stávající systémy, které nejsou definovány v <0>config.yml</0>, budou odstraněny. Provádějte pravidelné zálohování."
#: src/components/routes/settings/config-yaml.tsx:94
#: src/components/routes/settings/config-yaml.tsx:93
msgid "Export configuration"
msgstr "Exportovat konfiguraci"
#: src/components/routes/settings/config-yaml.tsx:49
#: src/components/routes/settings/config-yaml.tsx:48
msgid "Export your current systems configuration."
msgstr "Exportovat aktuální konfiguraci systémů."
@@ -353,60 +356,60 @@ msgstr "Exportovat aktuální konfiguraci systémů."
msgid "Failed to authenticate"
msgstr "Ověření se nezdařilo"
#: src/components/routes/settings/notifications.tsx:64
#: src/components/routes/settings/layout.tsx:40
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
msgid "Failed to save settings"
msgstr "Nepodařilo se uložit nastavení"
#: src/components/routes/settings/notifications.tsx:190
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Nepodařilo se odeslat testovací oznámení"
#: src/components/alerts/alerts-system.tsx:26
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Nepodařilo se aktualizovat upozornění"
#: src/components/systems-table/systems-table.tsx:354
#: src/components/routes/system.tsx:643
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:641
msgid "Filter..."
msgstr "Filtr..."
#: src/components/alerts/alerts-system.tsx:285
#: src/components/alerts/alerts-system.tsx:230
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "Za <0>{min}</0> {min, plural, one {minutu} few {minuty} other {minut}}"
#: src/components/login/auth-form.tsx:328
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "Zapomněli jste heslo?"
#. Context: General settings
#: src/components/routes/settings/layout.tsx:52
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "Obecné"
#: src/components/routes/system.tsx:546
#: src/components/routes/system.tsx:545
msgid "GPU Power Draw"
msgstr "Spotřeba energie GPU"
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "Mřížka"
#: src/components/add-system.tsx:159
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "Hostitel / IP"
#: src/components/login/forgot-pass-form.tsx:94
#: src/components/login/forgot-pass-form.tsx:93
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Pokud jste ztratili heslo k vašemu účtu správce, můžete jej obnovit pomocí následujícího příkazu."
#: src/components/login/auth-form.tsx:18
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Neplatná e-mailová adresa."
#. Linux kernel
#: src/components/routes/system.tsx:271
#: src/components/routes/system.tsx:270
msgid "Kernel"
msgstr "Kernel"
@@ -414,12 +417,12 @@ msgstr "Kernel"
msgid "Language"
msgstr "Jazyk"
#: src/components/systems-table/systems-table.tsx:367
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "Rozvržení"
#. Light theme
#: src/components/mode-toggle.tsx:17
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Světlý"
@@ -431,8 +434,8 @@ msgstr "Odhlásit"
msgid "Login"
msgstr "Přihlásit"
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "Pokus o přihlášení selhal"
@@ -441,49 +444,49 @@ msgstr "Pokus o přihlášení selhal"
msgid "Logs"
msgstr "Logy"
#: src/components/routes/settings/notifications.tsx:82
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "Hledáte místo kde vytvářet upozornění? Klikněte na ikonu zvonku <0/> v systémové tabulce."
#: src/components/routes/settings/layout.tsx:86
#: src/components/routes/settings/layout.tsx:85
msgid "Manage display and notification preferences."
msgstr "Správa nastavení zobrazení a oznámení."
#: src/components/add-system.tsx:227
#: src/components/add-system.tsx:226
msgid "Manual setup instructions"
msgstr "Pokyny k manuálnímu nastavení"
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:673
#: src/components/routes/system.tsx:671
msgid "Max 1 min"
msgstr "Max. 1 min"
#: src/components/systems-table/systems-table.tsx:195
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "Paměť"
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:456
#: src/components/routes/system.tsx:455
msgid "Memory Usage"
msgstr "Využití paměti"
#: src/components/routes/system.tsx:467
#: src/components/routes/system.tsx:466
msgid "Memory usage of docker containers"
msgstr "Využití paměti docker kontejnerů"
#: src/components/add-system.tsx:155
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "Název"
#: src/components/systems-table/systems-table.tsx:223
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "Síť"
#: src/components/routes/system.tsx:508
#: src/components/routes/system.tsx:507
msgid "Network traffic of docker containers"
msgstr "Síťový provoz kontejnerů docker"
#: src/components/routes/system.tsx:493
#: src/components/routes/system.tsx:492
msgid "Network traffic of public interfaces"
msgstr "Síťový provoz veřejných rozhraní"
@@ -491,34 +494,34 @@ msgstr "Síťový provoz veřejných rozhraní"
msgid "No results found."
msgstr "Nenalezeny žádné výskyty."
#: src/components/systems-table/systems-table.tsx:472
#: src/components/systems-table/systems-table.tsx:495
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "Nenalezeny žádné systémy."
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:76
#: src/components/routes/settings/layout.tsx:57
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
msgid "Notifications"
msgstr "Upozornění"
#: src/components/login/auth-form.tsx:300
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "Podpora OAuth 2 / OIDC"
#: src/components/routes/settings/config-yaml.tsx:62
#: src/components/routes/settings/config-yaml.tsx:61
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "Při každém restartu budou systémy v databázi aktualizovány tak, aby odpovídaly systémům definovaným v souboru."
#: src/components/systems-table/systems-table.tsx:639
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "Otevřít menu"
#: src/components/login/auth-form.tsx:251
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "Nebo pokračujte s"
#: src/components/alerts/alert-button.tsx:120
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "Přepsat existující upozornění"
@@ -530,41 +533,41 @@ msgstr "Stránka"
msgid "Pages / Settings"
msgstr "Stránky / Nastavení"
#: src/components/login/auth-form.tsx:195
#: src/components/login/auth-form.tsx:200
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "Heslo"
#: src/components/login/auth-form.tsx:21
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "Heslo musí obsahovat alespoň 8 znaků."
#: src/components/login/auth-form.tsx:22
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr "Heslo musí být menší než 72 bytů."
#: src/components/login/forgot-pass-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Žádost o obnovu hesla byla přijata"
#: src/components/systems-table/systems-table.tsx:672
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "Pozastavit"
#: src/components/systems-table/systems-table.tsx:143
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr "Pozastaveno"
#: src/components/routes/settings/notifications.tsx:97
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "<0>nakonfigurujte SMTP server</0> pro zajištění toho, aby byla upozornění doručena."
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Pro více informací zkontrolujte logy."
#: src/components/login/forgot-pass-form.tsx:17
#: src/components/login/auth-form.tsx:41
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "Zkontrolujte prosím Vaše přihlašovací údaje a zkuste to znovu"
@@ -572,7 +575,7 @@ msgstr "Zkontrolujte prosím Vaše přihlašovací údaje a zkuste to znovu"
msgid "Please create an admin account"
msgstr "Vytvořte si prosím účet administrátora"
#: src/components/login/auth-form.tsx:138
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Prosím povolte vyskakovací okna pro tento web"
@@ -580,7 +583,7 @@ msgstr "Prosím povolte vyskakovací okna pro tento web"
msgid "Please log in again"
msgstr "Přihlaste se prosím znovu"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Instrukce naleznete v <0>dokumentaci</0>."
@@ -588,12 +591,12 @@ msgstr "Instrukce naleznete v <0>dokumentaci</0>."
msgid "Please sign in to your account"
msgstr "Přihlaste se prosím k vašemu účtu"
#: src/components/add-system.tsx:171
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "Port"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:577
#: src/components/routes/system.tsx:456
#: src/components/routes/system.tsx:572
msgid "Precise utilization at the recorded time"
msgstr "Přesné využití v zaznamenaném čase"
@@ -602,39 +605,39 @@ msgid "Preferred Language"
msgstr "Upřednostňovaný jazyk"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:182
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "Veřejný klíč"
#. Disk read
#: src/components/charts/area-chart.tsx:62
#: src/components/charts/area-chart.tsx:72
#: src/components/charts/area-chart.tsx:60
#: src/components/charts/area-chart.tsx:70
msgid "Read"
msgstr "Číst"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx:67
#: src/components/charts/area-chart.tsx:65
msgid "Received"
msgstr "Přijato"
#: src/components/login/forgot-pass-form.tsx:77
#: src/components/login/forgot-pass-form.tsx:76
msgid "Reset Password"
msgstr "Obnovit heslo"
#: src/components/systems-table/systems-table.tsx:667
#: src/components/systems-table/systems-table.tsx:628
msgid "Resume"
msgstr "Pokračovat"
#: src/components/routes/settings/notifications.tsx:119
#: src/components/routes/settings/notifications.tsx:118
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Adresu uložte pomocí klávesy enter nebo čárky. Pro deaktivaci e-mailových oznámení ponechte prázdné pole."
#: src/components/routes/settings/notifications.tsx:169
#: src/components/routes/settings/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
msgid "Save Settings"
msgstr "Uložit nastavení"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr "Uložit systém"
@@ -646,12 +649,12 @@ msgstr "Hledat"
msgid "Search for systems or settings..."
msgstr "Hledat systémy nebo nastavení..."
#: src/components/alerts/alert-button.tsx:82
#: src/components/alerts/alert-button.tsx:71
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Podívejte se na <0>nastavení upozornění</0> pro nastavení toho, jak přijímáte upozornění."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx:66
#: src/components/charts/area-chart.tsx:64
msgid "Sent"
msgstr "Odeslat"
@@ -662,16 +665,16 @@ msgstr "Nastaví výchozí časový rozsah grafů, když je systém zobrazen."
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:72
#: src/components/routes/settings/layout.tsx:83
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
msgstr "Nastavení"
#: src/components/routes/settings/layout.tsx:34
#: src/components/routes/settings/layout.tsx:33
msgid "Settings saved"
msgstr "Nastavení uloženo"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "Přihlásit se"
@@ -679,7 +682,7 @@ msgstr "Přihlásit se"
msgid "SMTP settings"
msgstr "Nastavení SMTP"
#: src/components/systems-table/systems-table.tsx:389
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "Seřadit podle"
@@ -687,18 +690,21 @@ msgstr "Seřadit podle"
msgid "Status"
msgstr "Stav"
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:522
msgid "Swap space used by the system"
msgstr "Swap prostor využívaný systémem"
#: src/components/routes/system.tsx:522
#: src/components/routes/system.tsx:521
msgid "Swap Usage"
msgstr "Swap využití"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:27
#: src/components/systems-table/systems-table.tsx:152
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "Systém"
@@ -706,70 +712,70 @@ msgstr "Systém"
msgid "Systems"
msgstr "Systémy"
#: src/components/routes/settings/config-yaml.tsx:56
#: src/components/routes/settings/config-yaml.tsx:55
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "Systémy lze spravovat v souboru <0>config.yml</0> uvnitř datového adresáře."
#: src/components/systems-table/systems-table.tsx:377
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "Tabulka"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:244
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr "Teplota"
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:534
#: src/components/routes/system.tsx:533
msgid "Temperature"
msgstr "Teplota"
#: src/components/routes/system.tsx:535
#: src/components/routes/system.tsx:534
msgid "Temperatures of system sensors"
msgstr "Teploty systémových senzorů"
#: src/components/routes/settings/notifications.tsx:213
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Test <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:184
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Testovací oznámení odesláno"
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:146
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "Agent musí být v systému spuštěn, aby se mohl připojit. Zkopírujte níže uvedený instalační příkaz pro agenta."
#: src/components/add-system.tsx:138
#: src/components/add-system.tsx:137
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "Agent musí být v systému spuštěn, aby se mohl připojit. Zkopírujte níže uvedený soubor<0>docker-compose.yml</0> pro agenta."
#: src/components/login/forgot-pass-form.tsx:99
#: src/components/login/forgot-pass-form.tsx:98
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Poté se přihlaste do backendu a obnovte heslo k uživatelskému účtu v tabulce uživatelů."
#: src/components/systems-table/systems-table.tsx:699
#: src/components/systems-table/systems-table.tsx:660
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Tuto akci nelze vzít zpět. Tím se z databáze trvale odstraní všechny aktuální záznamy pro {name}."
#: src/components/routes/system.tsx:615
#: src/components/routes/system.tsx:613
msgid "Throughput of {extraFsName}"
msgstr "Propustnost {extraFsName}"
#: src/components/routes/system.tsx:482
#: src/components/routes/system.tsx:481
msgid "Throughput of root filesystem"
msgstr "Propustnost kořenového souborového systému"
#: src/components/routes/settings/notifications.tsx:108
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "Na email(y)"
#: src/components/routes/system.tsx:409
#: src/components/routes/system.tsx:422
#: src/components/routes/system.tsx:408
#: src/components/routes/system.tsx:421
msgid "Toggle grid"
msgstr "Přepnout mřížku"
#: src/components/mode-toggle.tsx:34
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "Přepnout motiv"
@@ -798,32 +804,32 @@ msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Spustí se, když využití disku překročí prahovou hodnotu"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:343
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:342
msgid "Up"
msgstr "Funkční"
#: src/components/systems-table/systems-table.tsx:350
#: src/components/systems-table/systems-table.tsx:337
msgid "Updated in real time. Click on a system to view information."
msgstr "Aktualizováno v reálném čase. Klepnutím na systém zobrazíte informace."
#: src/components/routes/system.tsx:270
#: src/components/routes/system.tsx:269
msgid "Uptime"
msgstr "Doba provozu"
#: src/components/routes/system.tsx:568
#: src/components/routes/system.tsx:602
#: src/components/charts/area-chart.tsx:75
#: src/components/routes/system.tsx:563
#: src/components/routes/system.tsx:600
#: src/components/charts/area-chart.tsx:73
msgid "Usage"
msgstr "Využití"
#: src/components/routes/system.tsx:474
#: src/components/routes/system.tsx:473
msgid "Usage of root partition"
msgstr "Využití kořenového oddílu"
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:63
#: src/components/charts/area-chart.tsx:75
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "Využito"
@@ -832,15 +838,15 @@ msgstr "Využito"
msgid "Users"
msgstr "Uživatelé"
#: src/components/systems-table/systems-table.tsx:359
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "Zobrazení"
#: src/components/systems-table/systems-table.tsx:424
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "Viditelné sloupce"
#: src/components/routes/system.tsx:707
#: src/components/routes/system.tsx:705
msgid "Waiting for enough records to display"
msgstr "Čeká se na dostatek záznamů k zobrazení"
@@ -848,24 +854,25 @@ msgstr "Čeká se na dostatek záznamů k zobrazení"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "Chcete nám pomoci s našimi překlady ještě lépe? Podívejte se na <0>Crowdin</0> pro více informací."
#: src/components/routes/settings/notifications.tsx:126
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / Push oznámení"
#. Disk write
#: src/components/charts/area-chart.tsx:61
#: src/components/charts/area-chart.tsx:71
#: src/components/charts/area-chart.tsx:59
#: src/components/charts/area-chart.tsx:69
msgid "Write"
msgstr "Psát"
#: src/components/routes/settings/layout.tsx:62
#: src/components/routes/settings/layout.tsx:61
msgid "YAML Config"
msgstr "YAML konfigurace"
#: src/components/routes/settings/config-yaml.tsx:46
#: src/components/routes/settings/config-yaml.tsx:45
msgid "YAML Configuration"
msgstr "YAML konfigurace"
#: src/components/routes/settings/layout.tsx:35
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "Vaše uživatelská nastavení byla aktualizována."

View File

@@ -19,11 +19,11 @@ msgstr ""
"X-Crowdin-File-ID: 16\n"
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:259
#: src/components/routes/system.tsx:255
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# day} other {# days}}"
#: src/components/routes/system.tsx:257
#: src/components/routes/system.tsx:253
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# hour} other {# hours}}"
@@ -48,27 +48,30 @@ msgid "30 days"
msgstr "30 dage"
#. Table column
#: src/components/systems-table/systems-table.tsx:304
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "Handlinger"
#: src/components/routes/home.tsx:94
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Aktive Alarmer"
#: src/components/add-system.tsx:43
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Tilføj <0>System</0>"
#: src/components/add-system.tsx:126
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "Tilføj nyt system"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Add system"
msgstr "Tilføj system"
#: src/components/routes/settings/notifications.tsx:158
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Tilføj URL"
@@ -84,21 +87,21 @@ msgstr "Juster visningsindstillinger for diagrammer."
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx:270
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "Agent"
#: src/components/alerts/alert-button.tsx:33
#: src/components/alerts/alert-button.tsx:79
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "Alarmer"
#: src/components/systems-table/systems-table.tsx:347
#: src/components/alerts/alert-button.tsx:99
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
msgid "All Systems"
msgstr "Alle systemer"
#: src/components/systems-table/systems-table.tsx:696
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "Er du sikker på, at du vil slette {name}?"
@@ -106,29 +109,29 @@ msgstr "Er du sikker på, at du vil slette {name}?"
msgid "Automatic copy requires a secure context."
msgstr "Automatisk kopiering kræver en sikker kontekst."
#: src/components/routes/system.tsx:670
#: src/components/routes/system.tsx:660
msgid "Average"
msgstr "Gennemsnitlig"
#: src/components/routes/system.tsx:446
#: src/components/routes/system.tsx:437
msgid "Average CPU utilization of containers"
msgstr "Gennemsnitlig CPU udnyttelse af containere"
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:253
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Gennemsnit overstiger <0>{value}{0}</0>"
#: src/components/routes/system.tsx:547
#: src/components/routes/system.tsx:538
msgid "Average power consumption of GPUs"
msgstr "Gennemsnitligt strømforbrug for GPU'er"
#: src/components/routes/system.tsx:435
#: src/components/routes/system.tsx:426
msgid "Average system-wide CPU utilization"
msgstr "Gennemsnitlig systembaseret CPU-udnyttelse"
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:569
#: src/components/routes/system.tsx:556
msgid "Average utilization of {0}"
msgstr "Gennemsnitlig udnyttelse af {0}"
@@ -138,31 +141,31 @@ msgid "Backups"
msgstr "Sikkerhedskopier"
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:491
#: src/components/routes/system.tsx:482
msgid "Bandwidth"
msgstr "Båndbredde"
#: src/components/login/auth-form.tsx:305
#: src/components/login/auth-form.tsx:306
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel understøtter OpenID Connect og mange OAuth2 godkendelsesudbydere."
#: src/components/routes/settings/notifications.tsx:129
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel bruger <0>Shoutrrr</0> til at integrere med populære notifikationstjenester."
#: src/components/add-system.tsx:131
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "Binær"
#: src/components/charts/mem-chart.tsx:87
#: src/components/charts/mem-chart.tsx:89
msgid "Cache / Buffers"
msgstr "Cache / Buffere"
#: src/components/systems-table/systems-table.tsx:707
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "Fortryd"
#: src/components/routes/settings/config-yaml.tsx:69
#: src/components/routes/settings/config-yaml.tsx:68
msgid "Caution - potential data loss"
msgstr "Forsigtig - muligt tab af data"
@@ -174,37 +177,37 @@ msgstr "Skift generelle applikationsindstillinger."
msgid "Chart options"
msgstr "Diagrammuligheder"
#: src/components/login/forgot-pass-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:34
msgid "Check {email} for a reset link."
msgstr "Tjek {email} for et nulstillingslink."
#: src/components/routes/settings/layout.tsx:41
#: src/components/routes/settings/layout.tsx:40
msgid "Check logs for more details."
msgstr "Tjek logfiler for flere detaljer."
#: src/components/routes/settings/notifications.tsx:185
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Tjek din notifikationstjeneste"
#: src/components/add-system.tsx:205
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "Klik for at kopiere"
#: src/components/login/forgot-pass-form.tsx:84
#: src/components/login/forgot-pass-form.tsx:90
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Instruktioner for kommandolinje"
#: src/components/routes/settings/notifications.tsx:79
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Konfigurer hvordan du modtager advarselsmeddelelser."
#: src/components/login/auth-form.tsx:213
#: src/components/login/auth-form.tsx:218
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "Bekræft adgangskode"
#: src/components/systems-table/systems-table.tsx:713
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "Forsæt"
@@ -212,16 +215,16 @@ msgstr "Forsæt"
msgid "Copied to clipboard"
msgstr "Kopieret til udklipsholder"
#: src/components/add-system.tsx:216
#: src/components/add-system.tsx:218
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "Kopier"
#: src/components/systems-table/systems-table.tsx:678
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "Kopier host"
#: src/components/add-system.tsx:225
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "Kopier Linux kommando"
@@ -229,27 +232,27 @@ msgstr "Kopier Linux kommando"
msgid "Copy text"
msgstr "Kopier tekst"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "CPU"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:434
#: src/components/charts/area-chart.tsx:58
#: src/components/routes/system.tsx:425
#: src/components/charts/area-chart.tsx:56
msgid "CPU Usage"
msgstr "CPU forbrug"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "Opret konto"
#. Dark theme
#: src/components/mode-toggle.tsx:22
#: src/components/mode-toggle.tsx:21
msgid "Dark"
msgstr "Mørk"
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:36
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Oversigtspanel"
@@ -257,37 +260,37 @@ msgstr "Oversigtspanel"
msgid "Default time period"
msgstr "Standard tidsperiode"
#: src/components/systems-table/systems-table.tsx:683
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "Slet"
#: src/components/systems-table/systems-table.tsx:204
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "Disk"
#: src/components/routes/system.tsx:481
#: src/components/routes/system.tsx:472
msgid "Disk I/O"
msgstr "Disk I/O"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:474
#: src/components/charts/disk-chart.tsx:77
#: src/components/routes/system.tsx:465
#: src/components/charts/disk-chart.tsx:79
msgid "Disk Usage"
msgstr "Diskforbrug"
#: src/components/routes/system.tsx:603
#: src/components/routes/system.tsx:593
msgid "Disk usage of {extraFsName}"
msgstr "Diskforbrug af {extraFsName}"
#: src/components/routes/system.tsx:445
#: src/components/routes/system.tsx:436
msgid "Docker CPU Usage"
msgstr "Docker CPU forbrug"
#: src/components/routes/system.tsx:466
#: src/components/routes/system.tsx:457
msgid "Docker Memory Usage"
msgstr "Docker Hukommelsesforbrug"
#: src/components/routes/system.tsx:507
#: src/components/routes/system.tsx:498
msgid "Docker Network I/O"
msgstr "Docker Netværk I/O"
@@ -297,22 +300,22 @@ msgstr "Dokumentation"
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:142
#: src/components/routes/system.tsx:345
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:336
msgid "Down"
msgstr ""
#: src/components/add-system.tsx:126
#: src/components/systems-table/systems-table.tsx:653
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr ""
#: src/components/login/forgot-pass-form.tsx:54
#: src/components/login/auth-form.tsx:176
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
msgid "Email"
msgstr "E-mail"
#: src/components/routes/settings/notifications.tsx:93
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "Email-notifikationer"
@@ -320,32 +323,32 @@ msgstr "Email-notifikationer"
msgid "Enter email address to reset password"
msgstr "Indtast e-mailadresse for at nulstille adgangskoden"
#: src/components/routes/settings/notifications.tsx:113
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Indtast e-mailadresse..."
#: src/components/routes/settings/notifications.tsx:189
#: src/components/routes/settings/config-yaml.tsx:29
#: src/components/login/auth-form.tsx:137
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "Fejl"
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: src/components/routes/home.tsx:113
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "Overskrider {0}{1} i sidste {2, plural, one {# minut} other {# minutter}}"
#: src/components/routes/settings/config-yaml.tsx:73
#: src/components/routes/settings/config-yaml.tsx:72
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "Eksisterende systemer ikke defineret i <0>config.yml</0> vil blive slettet. Opret venligst regelmæssige sikkerhedskopier."
#: src/components/routes/settings/config-yaml.tsx:94
#: src/components/routes/settings/config-yaml.tsx:93
msgid "Export configuration"
msgstr "Eksporter konfiguration"
#: src/components/routes/settings/config-yaml.tsx:49
#: src/components/routes/settings/config-yaml.tsx:48
msgid "Export your current systems configuration."
msgstr "Eksporter din nuværende systemkonfiguration."
@@ -353,60 +356,60 @@ msgstr "Eksporter din nuværende systemkonfiguration."
msgid "Failed to authenticate"
msgstr "Kunne ikke godkende"
#: src/components/routes/settings/notifications.tsx:64
#: src/components/routes/settings/layout.tsx:40
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
msgid "Failed to save settings"
msgstr "Kunne ikke gemme indstillinger"
#: src/components/routes/settings/notifications.tsx:190
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Afsendelse af testnotifikation mislykkedes"
#: src/components/alerts/alerts-system.tsx:26
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Kunne ikke opdatere alarm"
#: src/components/systems-table/systems-table.tsx:354
#: src/components/routes/system.tsx:643
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:633
msgid "Filter..."
msgstr "Filter..."
#: src/components/alerts/alerts-system.tsx:285
#: src/components/alerts/alerts-system.tsx:230
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "For <0>{min}</0> {min, plural, one {minut} other {minutter}}"
#: src/components/login/auth-form.tsx:328
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "Glemt adgangskode?"
#. Context: General settings
#: src/components/routes/settings/layout.tsx:52
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "Generelt"
#: src/components/routes/system.tsx:546
#: src/components/routes/system.tsx:537
msgid "GPU Power Draw"
msgstr "Gpu Strøm Træk"
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "Gitter"
#: src/components/add-system.tsx:159
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "Vært / IP"
#: src/components/login/forgot-pass-form.tsx:94
#: src/components/login/forgot-pass-form.tsx:93
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Hvis du har mistet adgangskoden til din administratorkonto, kan du nulstille den ved hjælp af følgende kommando."
#: src/components/login/auth-form.tsx:18
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Ugyldig email adresse."
#. Linux kernel
#: src/components/routes/system.tsx:271
#: src/components/routes/system.tsx:267
msgid "Kernel"
msgstr "Kernel"
@@ -414,12 +417,12 @@ msgstr "Kernel"
msgid "Language"
msgstr "Sprog"
#: src/components/systems-table/systems-table.tsx:367
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "Layout"
#. Light theme
#: src/components/mode-toggle.tsx:17
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Lys"
@@ -431,8 +434,8 @@ msgstr "Log ud"
msgid "Login"
msgstr "Log ind"
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "Loginforsøg mislykkedes"
@@ -441,49 +444,49 @@ msgstr "Loginforsøg mislykkedes"
msgid "Logs"
msgstr "Logs"
#: src/components/routes/settings/notifications.tsx:82
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "Leder du i stedet for efter hvor du kan oprette alarmer? Klik på klokken <0/> ikoner i system tabellen."
#: src/components/routes/settings/layout.tsx:86
#: src/components/routes/settings/layout.tsx:85
msgid "Manage display and notification preferences."
msgstr "Administrer display og notifikationsindstillinger."
#: src/components/add-system.tsx:227
#: src/components/add-system.tsx:226
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:673
#: src/components/routes/system.tsx:663
msgid "Max 1 min"
msgstr "Maks. 1 min"
#: src/components/systems-table/systems-table.tsx:195
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "Hukommelse"
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:456
#: src/components/routes/system.tsx:447
msgid "Memory Usage"
msgstr "Hukommelsesforbrug"
#: src/components/routes/system.tsx:467
#: src/components/routes/system.tsx:458
msgid "Memory usage of docker containers"
msgstr "Hukommelsesforbrug af dockercontainere"
#: src/components/add-system.tsx:155
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "Navn"
#: src/components/systems-table/systems-table.tsx:223
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "Net"
#: src/components/routes/system.tsx:508
#: src/components/routes/system.tsx:499
msgid "Network traffic of docker containers"
msgstr "Netværkstrafik af dockercontainere"
#: src/components/routes/system.tsx:493
#: src/components/routes/system.tsx:484
msgid "Network traffic of public interfaces"
msgstr "Netværkstrafik af offentlige grænseflader"
@@ -491,34 +494,34 @@ msgstr "Netværkstrafik af offentlige grænseflader"
msgid "No results found."
msgstr "Ingen resultater fundet."
#: src/components/systems-table/systems-table.tsx:472
#: src/components/systems-table/systems-table.tsx:495
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "Ingen systemer fundet."
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:76
#: src/components/routes/settings/layout.tsx:57
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
msgid "Notifications"
msgstr "Notifikationer"
#: src/components/login/auth-form.tsx:300
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "OAuth 2 / OIDC understøttelse"
#: src/components/routes/settings/config-yaml.tsx:62
#: src/components/routes/settings/config-yaml.tsx:61
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "Ved hver genstart vil systemer i databasen blive opdateret til at matche de systemer, der er defineret i filen."
#: src/components/systems-table/systems-table.tsx:639
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "Åbn menu"
#: src/components/login/auth-form.tsx:251
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "Eller fortsæt med"
#: src/components/alerts/alert-button.tsx:120
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "Overskriv eksisterende alarmer"
@@ -530,41 +533,41 @@ msgstr "Side"
msgid "Pages / Settings"
msgstr "Sider / Indstillinger"
#: src/components/login/auth-form.tsx:195
#: src/components/login/auth-form.tsx:200
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "Adgangskode"
#: src/components/login/auth-form.tsx:21
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "Adgangskoden skal være på mindst 8 tegn."
#: src/components/login/auth-form.tsx:22
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr ""
#: src/components/login/forgot-pass-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Anmodning om nulstilling af adgangskode modtaget"
#: src/components/systems-table/systems-table.tsx:672
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "Pause"
#: src/components/systems-table/systems-table.tsx:143
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr ""
#: src/components/routes/settings/notifications.tsx:97
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "Konfigurer <0>en SMTP server</0> for at sikre at alarmer bliver leveret."
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Tjek logfiler for flere detaljer."
#: src/components/login/forgot-pass-form.tsx:17
#: src/components/login/auth-form.tsx:41
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "Tjek dine legitimationsoplysninger og prøv igen"
@@ -572,7 +575,7 @@ msgstr "Tjek dine legitimationsoplysninger og prøv igen"
msgid "Please create an admin account"
msgstr "Opret venligst en administratorkonto"
#: src/components/login/auth-form.tsx:138
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Aktiver pop-ups for dette websted"
@@ -580,7 +583,7 @@ msgstr "Aktiver pop-ups for dette websted"
msgid "Please log in again"
msgstr "Log venligst ind igen"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Se <0>dokumentationen</0> for instruktioner."
@@ -588,12 +591,12 @@ msgstr "Se <0>dokumentationen</0> for instruktioner."
msgid "Please sign in to your account"
msgstr "Log venligst ind på din konto"
#: src/components/add-system.tsx:171
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "Port"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:577
#: src/components/routes/system.tsx:448
#: src/components/routes/system.tsx:564
msgid "Precise utilization at the recorded time"
msgstr "Præcis udnyttelse på det registrerede tidspunkt"
@@ -602,39 +605,39 @@ msgid "Preferred Language"
msgstr "Foretrukket sprog"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:182
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "Offentlig nøgle"
#. Disk read
#: src/components/charts/area-chart.tsx:62
#: src/components/charts/area-chart.tsx:72
#: src/components/charts/area-chart.tsx:60
#: src/components/charts/area-chart.tsx:70
msgid "Read"
msgstr "Læs"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx:67
#: src/components/charts/area-chart.tsx:65
msgid "Received"
msgstr "Modtaget"
#: src/components/login/forgot-pass-form.tsx:77
#: src/components/login/forgot-pass-form.tsx:76
msgid "Reset Password"
msgstr "Nulstil adgangskode"
#: src/components/systems-table/systems-table.tsx:667
#: src/components/systems-table/systems-table.tsx:628
msgid "Resume"
msgstr "Genoptag"
#: src/components/routes/settings/notifications.tsx:119
#: src/components/routes/settings/notifications.tsx:118
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Gem adresse ved hjælp af enter eller komma. Lad feltet stå tomt for at deaktivere e-mail-meddelelser."
#: src/components/routes/settings/notifications.tsx:169
#: src/components/routes/settings/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
msgid "Save Settings"
msgstr "Gem indstillinger"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr ""
@@ -646,12 +649,12 @@ msgstr "Søg"
msgid "Search for systems or settings..."
msgstr "Søg efter systemer eller indstillinger..."
#: src/components/alerts/alert-button.tsx:82
#: src/components/alerts/alert-button.tsx:71
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Se <0>meddelelsesindstillinger</0> for at konfigurere, hvordan du modtager alarmer."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx:66
#: src/components/charts/area-chart.tsx:64
msgid "Sent"
msgstr "Sendt"
@@ -662,16 +665,16 @@ msgstr "Sætter standardtidsintervallet for diagrammer når et system vises."
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:72
#: src/components/routes/settings/layout.tsx:83
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
msgstr "Indstillinger"
#: src/components/routes/settings/layout.tsx:34
#: src/components/routes/settings/layout.tsx:33
msgid "Settings saved"
msgstr "Indstillinger gemt"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "Log ind"
@@ -679,7 +682,7 @@ msgstr "Log ind"
msgid "SMTP settings"
msgstr "SMTP-indstillinger"
#: src/components/systems-table/systems-table.tsx:389
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "Sorter efter"
@@ -687,18 +690,21 @@ msgstr "Sorter efter"
msgid "Status"
msgstr "Status"
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:514
msgid "Swap space used by the system"
msgstr "Swap plads brugt af systemet"
#: src/components/routes/system.tsx:522
#: src/components/routes/system.tsx:513
msgid "Swap Usage"
msgstr "Swap forbrug"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:27
#: src/components/systems-table/systems-table.tsx:152
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "System"
@@ -706,70 +712,70 @@ msgstr "System"
msgid "Systems"
msgstr "Systemer"
#: src/components/routes/settings/config-yaml.tsx:56
#: src/components/routes/settings/config-yaml.tsx:55
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "Systemer kan være administreres i filen <0>config.yml</0> i din datamappe."
#: src/components/systems-table/systems-table.tsx:377
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "Tabel"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:244
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr ""
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:534
#: src/components/routes/system.tsx:525
msgid "Temperature"
msgstr "Temperatur"
#: src/components/routes/system.tsx:535
#: src/components/routes/system.tsx:526
msgid "Temperatures of system sensors"
msgstr "Temperaturer i systemsensorer"
#: src/components/routes/settings/notifications.tsx:213
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Test <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:184
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Test notifikation sendt"
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:146
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "Agenten skal køre på systemet for at forbinde. Kopier installationskommandoen for agenten nedenfor."
#: src/components/add-system.tsx:138
#: src/components/add-system.tsx:137
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "Agenten skal køre på systemet for at forbinde. Kopier <0>docker-compose.yml</0> for agenten nedenfor."
#: src/components/login/forgot-pass-form.tsx:99
#: src/components/login/forgot-pass-form.tsx:98
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Log derefter ind på backend og nulstil adgangskoden til din brugerkonto i tabellen brugere."
#: src/components/systems-table/systems-table.tsx:699
#: src/components/systems-table/systems-table.tsx:660
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Denne handling kan ikke fortrydes. Dette vil permanent slette alle aktuelle elementer for {name} fra databasen."
#: src/components/routes/system.tsx:615
#: src/components/routes/system.tsx:605
msgid "Throughput of {extraFsName}"
msgstr "Gennemløb af {extraFsName}"
#: src/components/routes/system.tsx:482
#: src/components/routes/system.tsx:473
msgid "Throughput of root filesystem"
msgstr "Gennemløb af rodfilsystemet"
#: src/components/routes/settings/notifications.tsx:108
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "Til email(s)"
#: src/components/routes/system.tsx:409
#: src/components/routes/system.tsx:422
#: src/components/routes/system.tsx:400
#: src/components/routes/system.tsx:413
msgid "Toggle grid"
msgstr "Slå gitter til/fra"
#: src/components/mode-toggle.tsx:34
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "Skift tema"
@@ -798,32 +804,32 @@ msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Udløser når brugen af en disk overstiger en tærskel"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:343
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:334
msgid "Up"
msgstr ""
#: src/components/systems-table/systems-table.tsx:350
#: src/components/systems-table/systems-table.tsx:337
msgid "Updated in real time. Click on a system to view information."
msgstr "Opdateret i realtid. Klik på et system for at se information."
#: src/components/routes/system.tsx:270
#: src/components/routes/system.tsx:266
msgid "Uptime"
msgstr "Oppetid"
#: src/components/routes/system.tsx:568
#: src/components/routes/system.tsx:602
#: src/components/charts/area-chart.tsx:75
#: src/components/routes/system.tsx:555
#: src/components/routes/system.tsx:592
#: src/components/charts/area-chart.tsx:73
msgid "Usage"
msgstr "Forbrug"
#: src/components/routes/system.tsx:474
#: src/components/routes/system.tsx:465
msgid "Usage of root partition"
msgstr "Brug af rodpartition"
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:63
#: src/components/charts/area-chart.tsx:75
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "Brugt"
@@ -832,15 +838,15 @@ msgstr "Brugt"
msgid "Users"
msgstr "Brugere"
#: src/components/systems-table/systems-table.tsx:359
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "Vis"
#: src/components/systems-table/systems-table.tsx:424
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "Synlige felter"
#: src/components/routes/system.tsx:707
#: src/components/routes/system.tsx:697
msgid "Waiting for enough records to display"
msgstr "Venter på nok posteringer til at vise"
@@ -848,24 +854,25 @@ msgstr "Venter på nok posteringer til at vise"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "Vil du hjælpe os med at gøre vores oversættelser endnu bedre? Tjek <0>Crowdin</0> for flere detaljer."
#: src/components/routes/settings/notifications.tsx:126
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / Push notifikationer"
#. Disk write
#: src/components/charts/area-chart.tsx:61
#: src/components/charts/area-chart.tsx:71
#: src/components/charts/area-chart.tsx:59
#: src/components/charts/area-chart.tsx:69
msgid "Write"
msgstr "Skriv"
#: src/components/routes/settings/layout.tsx:62
#: src/components/routes/settings/layout.tsx:61
msgid "YAML Config"
msgstr "YAML Konfiguration"
#: src/components/routes/settings/config-yaml.tsx:46
#: src/components/routes/settings/config-yaml.tsx:45
msgid "YAML Configuration"
msgstr "YAML Konfiguration"
#: src/components/routes/settings/layout.tsx:35
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "Dine brugerindstillinger er opdateret."

View File

@@ -19,11 +19,11 @@ msgstr ""
"X-Crowdin-File-ID: 16\n"
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:259
#: src/components/routes/system.tsx:255
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# Tag} other {# Tage}}"
#: src/components/routes/system.tsx:257
#: src/components/routes/system.tsx:253
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# Stunde} other {# Stunden}}"
@@ -48,27 +48,30 @@ msgid "30 days"
msgstr "30 Tage"
#. Table column
#: src/components/systems-table/systems-table.tsx:304
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "Aktionen"
#: src/components/routes/home.tsx:94
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Aktive Warnungen"
#: src/components/add-system.tsx:43
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "<0>System</0> hinzufügen"
#: src/components/add-system.tsx:126
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "Neues System hinzufügen"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Add system"
msgstr "System hinzufügen"
#: src/components/routes/settings/notifications.tsx:158
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "URL hinzufügen"
@@ -84,21 +87,21 @@ msgstr "Anzeigeoptionen für Diagramme anpassen."
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx:270
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "Agent"
#: src/components/alerts/alert-button.tsx:33
#: src/components/alerts/alert-button.tsx:79
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "Warnungen"
#: src/components/systems-table/systems-table.tsx:347
#: src/components/alerts/alert-button.tsx:99
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
msgid "All Systems"
msgstr "Alle Systeme"
#: src/components/systems-table/systems-table.tsx:696
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "Möchtest du {name} wirklich löschen?"
@@ -106,29 +109,29 @@ msgstr "Möchtest du {name} wirklich löschen?"
msgid "Automatic copy requires a secure context."
msgstr "Automatisches Kopieren erfordert einen sicheren Kontext."
#: src/components/routes/system.tsx:670
#: src/components/routes/system.tsx:660
msgid "Average"
msgstr "Durchschnitt"
#: src/components/routes/system.tsx:446
#: src/components/routes/system.tsx:437
msgid "Average CPU utilization of containers"
msgstr "Durchschnittliche CPU-Auslastung der Container"
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:253
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Durchschnitt überschreitet <0>{value}{0}</0>"
#: src/components/routes/system.tsx:547
#: src/components/routes/system.tsx:538
msgid "Average power consumption of GPUs"
msgstr "Durchschnittlicher Stromverbrauch der GPUs"
#: src/components/routes/system.tsx:435
#: src/components/routes/system.tsx:426
msgid "Average system-wide CPU utilization"
msgstr "Durchschnittliche systemweite CPU-Auslastung"
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:569
#: src/components/routes/system.tsx:556
msgid "Average utilization of {0}"
msgstr "Durchschnittliche Auslastung von {0}"
@@ -138,31 +141,31 @@ msgid "Backups"
msgstr "Backups"
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:491
#: src/components/routes/system.tsx:482
msgid "Bandwidth"
msgstr "Bandbreite"
#: src/components/login/auth-form.tsx:305
#: src/components/login/auth-form.tsx:306
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel unterstützt OpenID Connect und viele OAuth2-Authentifizierungsanbieter."
#: src/components/routes/settings/notifications.tsx:129
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel verwendet <0>Shoutrrr</0>, um sich mit beliebten Benachrichtigungsdiensten zu integrieren."
#: src/components/add-system.tsx:131
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "Binär"
#: src/components/charts/mem-chart.tsx:87
#: src/components/charts/mem-chart.tsx:89
msgid "Cache / Buffers"
msgstr "Cache / Puffer"
#: src/components/systems-table/systems-table.tsx:707
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "Abbrechen"
#: src/components/routes/settings/config-yaml.tsx:69
#: src/components/routes/settings/config-yaml.tsx:68
msgid "Caution - potential data loss"
msgstr "Vorsicht - potenzieller Datenverlust"
@@ -174,37 +177,37 @@ msgstr "Allgemeine Anwendungsoptionen ändern."
msgid "Chart options"
msgstr "Diagrammoptionen"
#: src/components/login/forgot-pass-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:34
msgid "Check {email} for a reset link."
msgstr "Überprüfe {email} auf einen Link zum Zurücksetzen."
#: src/components/routes/settings/layout.tsx:41
#: src/components/routes/settings/layout.tsx:40
msgid "Check logs for more details."
msgstr "Überprüfe die Protokolle für weitere Details."
#: src/components/routes/settings/notifications.tsx:185
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Überprüfe deinen Benachrichtigungsdienst"
#: src/components/add-system.tsx:205
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "Zum Kopieren klicken"
#: src/components/login/forgot-pass-form.tsx:84
#: src/components/login/forgot-pass-form.tsx:90
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Befehlszeilenanweisungen"
#: src/components/routes/settings/notifications.tsx:79
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Konfiguriere, wie du Warnbenachrichtigungen erhältst."
#: src/components/login/auth-form.tsx:213
#: src/components/login/auth-form.tsx:218
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "Passwort bestätigen"
#: src/components/systems-table/systems-table.tsx:713
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "Fortfahren"
@@ -212,16 +215,16 @@ msgstr "Fortfahren"
msgid "Copied to clipboard"
msgstr "In die Zwischenablage kopiert"
#: src/components/add-system.tsx:216
#: src/components/add-system.tsx:218
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "Kopieren"
#: src/components/systems-table/systems-table.tsx:678
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "Host kopieren"
#: src/components/add-system.tsx:225
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "Linux-Befehl kopieren"
@@ -229,27 +232,27 @@ msgstr "Linux-Befehl kopieren"
msgid "Copy text"
msgstr "Text kopieren"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "CPU"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:434
#: src/components/charts/area-chart.tsx:58
#: src/components/routes/system.tsx:425
#: src/components/charts/area-chart.tsx:56
msgid "CPU Usage"
msgstr "CPU-Auslastung"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "Konto erstellen"
#. Dark theme
#: src/components/mode-toggle.tsx:22
#: src/components/mode-toggle.tsx:21
msgid "Dark"
msgstr "Dunkel"
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:36
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Dashboard"
@@ -257,37 +260,37 @@ msgstr "Dashboard"
msgid "Default time period"
msgstr "Standardzeitraum"
#: src/components/systems-table/systems-table.tsx:683
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "Löschen"
#: src/components/systems-table/systems-table.tsx:204
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "Festplatte"
#: src/components/routes/system.tsx:481
#: src/components/routes/system.tsx:472
msgid "Disk I/O"
msgstr "Festplatten-I/O"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:474
#: src/components/charts/disk-chart.tsx:77
#: src/components/routes/system.tsx:465
#: src/components/charts/disk-chart.tsx:79
msgid "Disk Usage"
msgstr "Festplattennutzung"
#: src/components/routes/system.tsx:603
#: src/components/routes/system.tsx:593
msgid "Disk usage of {extraFsName}"
msgstr "Festplattennutzung von {extraFsName}"
#: src/components/routes/system.tsx:445
#: src/components/routes/system.tsx:436
msgid "Docker CPU Usage"
msgstr "Docker-CPU-Auslastung"
#: src/components/routes/system.tsx:466
#: src/components/routes/system.tsx:457
msgid "Docker Memory Usage"
msgstr "Docker-Arbeitsspeichernutzung"
#: src/components/routes/system.tsx:507
#: src/components/routes/system.tsx:498
msgid "Docker Network I/O"
msgstr "Docker-Netzwerk-I/O"
@@ -297,22 +300,22 @@ msgstr "Dokumentation"
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:142
#: src/components/routes/system.tsx:345
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:336
msgid "Down"
msgstr ""
#: src/components/add-system.tsx:126
#: src/components/systems-table/systems-table.tsx:653
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr "Bearbeiten"
#: src/components/login/forgot-pass-form.tsx:54
#: src/components/login/auth-form.tsx:176
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
msgid "Email"
msgstr "E-Mail"
#: src/components/routes/settings/notifications.tsx:93
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "E-Mail-Benachrichtigungen"
@@ -320,32 +323,32 @@ msgstr "E-Mail-Benachrichtigungen"
msgid "Enter email address to reset password"
msgstr "E-Mail-Adresse eingeben, um das Passwort zurückzusetzen"
#: src/components/routes/settings/notifications.tsx:113
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "E-Mail-Adresse eingeben..."
#: src/components/routes/settings/notifications.tsx:189
#: src/components/routes/settings/config-yaml.tsx:29
#: src/components/login/auth-form.tsx:137
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "Fehler"
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: src/components/routes/home.tsx:113
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "Überschreitet {0}{1} in den letzten {2, plural, one {# Minute} other {# Minuten}}"
#: src/components/routes/settings/config-yaml.tsx:73
#: src/components/routes/settings/config-yaml.tsx:72
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "Bestehende Systeme, die nicht in der <0>config.yml</0> definiert sind, werden gelöscht. Bitte mache regelmäßige Backups."
#: src/components/routes/settings/config-yaml.tsx:94
#: src/components/routes/settings/config-yaml.tsx:93
msgid "Export configuration"
msgstr "Konfiguration exportieren"
#: src/components/routes/settings/config-yaml.tsx:49
#: src/components/routes/settings/config-yaml.tsx:48
msgid "Export your current systems configuration."
msgstr "Exportiere die aktuelle Systemkonfiguration."
@@ -353,60 +356,60 @@ msgstr "Exportiere die aktuelle Systemkonfiguration."
msgid "Failed to authenticate"
msgstr "Authentifizierung fehlgeschlagen"
#: src/components/routes/settings/notifications.tsx:64
#: src/components/routes/settings/layout.tsx:40
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
msgid "Failed to save settings"
msgstr "Einstellungen konnten nicht gespeichert werden"
#: src/components/routes/settings/notifications.tsx:190
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Testbenachrichtigung konnte nicht gesendet werden"
#: src/components/alerts/alerts-system.tsx:26
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Warnung konnte nicht aktualisiert werden"
#: src/components/systems-table/systems-table.tsx:354
#: src/components/routes/system.tsx:643
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:633
msgid "Filter..."
msgstr "Filter..."
#: src/components/alerts/alerts-system.tsx:285
#: src/components/alerts/alerts-system.tsx:230
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "Für <0>{min}</0> {min, plural, one {Minute} other {Minuten}}"
#: src/components/login/auth-form.tsx:328
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "Passwort vergessen?"
#. Context: General settings
#: src/components/routes/settings/layout.tsx:52
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "Allgemein"
#: src/components/routes/system.tsx:546
#: src/components/routes/system.tsx:537
msgid "GPU Power Draw"
msgstr "GPU-Leistungsaufnahme"
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "Raster"
#: src/components/add-system.tsx:159
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "Host / IP"
#: src/components/login/forgot-pass-form.tsx:94
#: src/components/login/forgot-pass-form.tsx:93
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Wenn du das Passwort für dein Administratorkonto verloren hast, kannst du es mit dem folgenden Befehl zurücksetzen."
#: src/components/login/auth-form.tsx:18
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Ungültige E-Mail-Adresse."
#. Linux kernel
#: src/components/routes/system.tsx:271
#: src/components/routes/system.tsx:267
msgid "Kernel"
msgstr "Kernel"
@@ -414,12 +417,12 @@ msgstr "Kernel"
msgid "Language"
msgstr "Sprache"
#: src/components/systems-table/systems-table.tsx:367
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "Anordnung"
#. Light theme
#: src/components/mode-toggle.tsx:17
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Hell"
@@ -431,8 +434,8 @@ msgstr "Abmelden"
msgid "Login"
msgstr "Anmelden"
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "Anmeldeversuch fehlgeschlagen"
@@ -441,49 +444,49 @@ msgstr "Anmeldeversuch fehlgeschlagen"
msgid "Logs"
msgstr "Protokolle"
#: src/components/routes/settings/notifications.tsx:82
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "Du möchtest neue Warnungen erstellen? Klicke dafür auf die Glocken-<0/>-Symbole in der Systemtabelle."
#: src/components/routes/settings/layout.tsx:86
#: src/components/routes/settings/layout.tsx:85
msgid "Manage display and notification preferences."
msgstr "Anzeige- und Benachrichtigungseinstellungen verwalten."
#: src/components/add-system.tsx:227
#: src/components/add-system.tsx:226
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:673
#: src/components/routes/system.tsx:663
msgid "Max 1 min"
msgstr "Max 1 Min"
#: src/components/systems-table/systems-table.tsx:195
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "Arbeitsspeicher"
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:456
#: src/components/routes/system.tsx:447
msgid "Memory Usage"
msgstr "Arbeitsspeichernutzung"
#: src/components/routes/system.tsx:467
#: src/components/routes/system.tsx:458
msgid "Memory usage of docker containers"
msgstr "Arbeitsspeichernutzung der Docker-Container"
#: src/components/add-system.tsx:155
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "Name"
#: src/components/systems-table/systems-table.tsx:223
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "Netz"
#: src/components/routes/system.tsx:508
#: src/components/routes/system.tsx:499
msgid "Network traffic of docker containers"
msgstr "Netzwerkverkehr der Docker-Container"
#: src/components/routes/system.tsx:493
#: src/components/routes/system.tsx:484
msgid "Network traffic of public interfaces"
msgstr "Netzwerkverkehr der öffentlichen Schnittstellen"
@@ -491,34 +494,34 @@ msgstr "Netzwerkverkehr der öffentlichen Schnittstellen"
msgid "No results found."
msgstr "Keine Ergebnisse gefunden."
#: src/components/systems-table/systems-table.tsx:472
#: src/components/systems-table/systems-table.tsx:495
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "Keine Systeme gefunden."
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:76
#: src/components/routes/settings/layout.tsx:57
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
msgid "Notifications"
msgstr "Benachrichtigungen"
#: src/components/login/auth-form.tsx:300
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "OAuth 2 / OIDC-Unterstützung"
#: src/components/routes/settings/config-yaml.tsx:62
#: src/components/routes/settings/config-yaml.tsx:61
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "Bei jedem Neustart werden die Systeme in der Datenbank aktualisiert, um den in der Datei definierten Systemen zu entsprechen."
#: src/components/systems-table/systems-table.tsx:639
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "Menü öffnen"
#: src/components/login/auth-form.tsx:251
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "Oder fortfahren mit"
#: src/components/alerts/alert-button.tsx:120
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "Bestehende Warnungen überschreiben"
@@ -530,41 +533,41 @@ msgstr "Seite"
msgid "Pages / Settings"
msgstr "Seiten / Einstellungen"
#: src/components/login/auth-form.tsx:195
#: src/components/login/auth-form.tsx:200
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "Passwort"
#: src/components/login/auth-form.tsx:21
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "Das Passwort muss mindestens 8 Zeichen haben."
#: src/components/login/auth-form.tsx:22
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr "Das Passwort muss weniger als 72 Bytes lang sein."
#: src/components/login/forgot-pass-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Anfrage zum Zurücksetzen des Passworts erhalten"
#: src/components/systems-table/systems-table.tsx:672
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "Pause"
#: src/components/systems-table/systems-table.tsx:143
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr ""
#: src/components/routes/settings/notifications.tsx:97
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "Bitte <0>konfiguriere einen SMTP-Server</0>, um sicherzustellen, dass Warnungen zugestellt werden."
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Bitte überprüfe die Protokolle für weitere Details."
#: src/components/login/forgot-pass-form.tsx:17
#: src/components/login/auth-form.tsx:41
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "Bitte überprüfe deine Anmeldedaten und versuche es erneut"
@@ -572,7 +575,7 @@ msgstr "Bitte überprüfe deine Anmeldedaten und versuche es erneut"
msgid "Please create an admin account"
msgstr "Bitte erstelle ein Administratorkonto"
#: src/components/login/auth-form.tsx:138
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Bitte aktiviere Pop-ups für diese Seite"
@@ -580,7 +583,7 @@ msgstr "Bitte aktiviere Pop-ups für diese Seite"
msgid "Please log in again"
msgstr "Bitte melde dich erneut an"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "In der <0>Dokumentation</0> findest du weitere Anweisungen."
@@ -588,12 +591,12 @@ msgstr "In der <0>Dokumentation</0> findest du weitere Anweisungen."
msgid "Please sign in to your account"
msgstr "Bitte melde dich bei beinem Konto an"
#: src/components/add-system.tsx:171
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "Port"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:577
#: src/components/routes/system.tsx:448
#: src/components/routes/system.tsx:564
msgid "Precise utilization at the recorded time"
msgstr "Genaue Nutzung zum aufgezeichneten Zeitpunkt"
@@ -602,39 +605,39 @@ msgid "Preferred Language"
msgstr "Bevorzugte Sprache"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:182
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "Schlüssel"
#. Disk read
#: src/components/charts/area-chart.tsx:62
#: src/components/charts/area-chart.tsx:72
#: src/components/charts/area-chart.tsx:60
#: src/components/charts/area-chart.tsx:70
msgid "Read"
msgstr "Lesen"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx:67
#: src/components/charts/area-chart.tsx:65
msgid "Received"
msgstr "Empfangen"
#: src/components/login/forgot-pass-form.tsx:77
#: src/components/login/forgot-pass-form.tsx:76
msgid "Reset Password"
msgstr "Passwort zurücksetzen"
#: src/components/systems-table/systems-table.tsx:667
#: src/components/systems-table/systems-table.tsx:628
msgid "Resume"
msgstr "Fortsetzen"
#: src/components/routes/settings/notifications.tsx:119
#: src/components/routes/settings/notifications.tsx:118
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Adresse mit der Enter-Taste oder Komma speichern. Leer lassen, um E-Mail-Benachrichtigungen zu deaktivieren."
#: src/components/routes/settings/notifications.tsx:169
#: src/components/routes/settings/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
msgid "Save Settings"
msgstr "Einstellungen speichern"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr ""
@@ -646,12 +649,12 @@ msgstr "Suche"
msgid "Search for systems or settings..."
msgstr "Nach Systemen oder Einstellungen suchen..."
#: src/components/alerts/alert-button.tsx:82
#: src/components/alerts/alert-button.tsx:71
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Siehe <0>Benachrichtigungseinstellungen</0>, um zu konfigurieren, wie du Warnungen erhältst."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx:66
#: src/components/charts/area-chart.tsx:64
msgid "Sent"
msgstr "Gesendet"
@@ -662,16 +665,16 @@ msgstr "Legt den Standardzeitraum für Diagramme fest, wenn ein System angezeigt
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:72
#: src/components/routes/settings/layout.tsx:83
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
msgstr "Einstellungen"
#: src/components/routes/settings/layout.tsx:34
#: src/components/routes/settings/layout.tsx:33
msgid "Settings saved"
msgstr "Einstellungen gespeichert"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "Anmelden"
@@ -679,7 +682,7 @@ msgstr "Anmelden"
msgid "SMTP settings"
msgstr "SMTP-Einstellungen"
#: src/components/systems-table/systems-table.tsx:389
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "Sortieren nach"
@@ -687,18 +690,21 @@ msgstr "Sortieren nach"
msgid "Status"
msgstr "Status"
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:514
msgid "Swap space used by the system"
msgstr "Vom System genutzter Swap-Speicher"
#: src/components/routes/system.tsx:522
#: src/components/routes/system.tsx:513
msgid "Swap Usage"
msgstr "Swap-Nutzung"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:27
#: src/components/systems-table/systems-table.tsx:152
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "System"
@@ -706,70 +712,70 @@ msgstr "System"
msgid "Systems"
msgstr "Systeme"
#: src/components/routes/settings/config-yaml.tsx:56
#: src/components/routes/settings/config-yaml.tsx:55
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "Systeme können in einer <0>config.yml</0>-Datei im Datenverzeichnis verwaltet werden."
#: src/components/systems-table/systems-table.tsx:377
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "Tabelle"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:244
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr ""
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:534
#: src/components/routes/system.tsx:525
msgid "Temperature"
msgstr "Temperatur"
#: src/components/routes/system.tsx:535
#: src/components/routes/system.tsx:526
msgid "Temperatures of system sensors"
msgstr "Temperaturen der Systemsensoren"
#: src/components/routes/settings/notifications.tsx:213
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Test <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:184
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Testbenachrichtigung gesendet"
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:146
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "Der Agent muss auf dem System laufen, um eine Verbindung herzustellen. Kopiere den Installationsbefehl für den Agent unten."
#: src/components/add-system.tsx:138
#: src/components/add-system.tsx:137
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "Der Agent muss auf dem System laufen, um eine Verbindung herzustellen. Kopiere die <0>docker-compose.yml</0> für den Agent unten."
#: src/components/login/forgot-pass-form.tsx:99
#: src/components/login/forgot-pass-form.tsx:98
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Melde dich dann im Backend an und setze dein Benutzerkontopasswort in der Benutzertabelle zurück."
#: src/components/systems-table/systems-table.tsx:699
#: src/components/systems-table/systems-table.tsx:660
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Diese Aktion kann nicht rückgängig gemacht werden. Dadurch werden alle aktuellen Datensätze für {name} dauerhaft aus der Datenbank gelöscht."
#: src/components/routes/system.tsx:615
#: src/components/routes/system.tsx:605
msgid "Throughput of {extraFsName}"
msgstr "Durchsatz von {extraFsName}"
#: src/components/routes/system.tsx:482
#: src/components/routes/system.tsx:473
msgid "Throughput of root filesystem"
msgstr "Durchsatz des Root-Dateisystems"
#: src/components/routes/settings/notifications.tsx:108
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "An E-Mail(s)"
#: src/components/routes/system.tsx:409
#: src/components/routes/system.tsx:422
#: src/components/routes/system.tsx:400
#: src/components/routes/system.tsx:413
msgid "Toggle grid"
msgstr "Raster umschalten"
#: src/components/mode-toggle.tsx:34
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "Darstellung umschalten"
@@ -798,32 +804,32 @@ msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Löst aus, wenn die Nutzung einer Festplatte einen Schwellenwert überschreitet"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:343
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:334
msgid "Up"
msgstr ""
#: src/components/systems-table/systems-table.tsx:350
#: src/components/systems-table/systems-table.tsx:337
msgid "Updated in real time. Click on a system to view information."
msgstr "In Echtzeit aktualisiert. Klicke auf ein System, um Informationen anzuzeigen."
#: src/components/routes/system.tsx:270
#: src/components/routes/system.tsx:266
msgid "Uptime"
msgstr "Betriebszeit"
#: src/components/routes/system.tsx:568
#: src/components/routes/system.tsx:602
#: src/components/charts/area-chart.tsx:75
#: src/components/routes/system.tsx:555
#: src/components/routes/system.tsx:592
#: src/components/charts/area-chart.tsx:73
msgid "Usage"
msgstr "Nutzung"
#: src/components/routes/system.tsx:474
#: src/components/routes/system.tsx:465
msgid "Usage of root partition"
msgstr "Nutzung der Root-Partition"
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:63
#: src/components/charts/area-chart.tsx:75
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "Verwendet"
@@ -832,15 +838,15 @@ msgstr "Verwendet"
msgid "Users"
msgstr "Benutzer"
#: src/components/systems-table/systems-table.tsx:359
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "Ansicht"
#: src/components/systems-table/systems-table.tsx:424
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "Sichtbare Spalten"
#: src/components/routes/system.tsx:707
#: src/components/routes/system.tsx:697
msgid "Waiting for enough records to display"
msgstr "Warten auf genügend Datensätze zur Anzeige"
@@ -848,24 +854,25 @@ msgstr "Warten auf genügend Datensätze zur Anzeige"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more 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/notifications.tsx:126
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / Push-Benachrichtigungen"
#. Disk write
#: src/components/charts/area-chart.tsx:61
#: src/components/charts/area-chart.tsx:71
#: src/components/charts/area-chart.tsx:59
#: src/components/charts/area-chart.tsx:69
msgid "Write"
msgstr "Schreiben"
#: src/components/routes/settings/layout.tsx:62
#: src/components/routes/settings/layout.tsx:61
msgid "YAML Config"
msgstr "YAML-Konfiguration"
#: src/components/routes/settings/config-yaml.tsx:46
#: src/components/routes/settings/config-yaml.tsx:45
msgid "YAML Configuration"
msgstr "YAML-Konfiguration"
#: src/components/routes/settings/layout.tsx:35
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "Deine Benutzereinstellungen wurden aktualisiert."

File diff suppressed because it is too large Load Diff

View File

@@ -19,11 +19,11 @@ msgstr ""
"X-Crowdin-File-ID: 16\n"
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:259
#: src/components/routes/system.tsx:255
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# día} other {# días}}"
#: src/components/routes/system.tsx:257
#: src/components/routes/system.tsx:253
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# hora} other {# horas}}"
@@ -48,27 +48,30 @@ msgid "30 days"
msgstr "30 días"
#. Table column
#: src/components/systems-table/systems-table.tsx:304
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "Acciones"
#: src/components/routes/home.tsx:94
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Alertas Activas"
#: src/components/add-system.tsx:43
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Agregar <0>Sistema</0>"
#: src/components/add-system.tsx:126
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "Agregar Nuevo Sistema"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Add system"
msgstr "Agregar sistema"
#: src/components/routes/settings/notifications.tsx:158
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Agregar URL"
@@ -84,21 +87,21 @@ msgstr "Ajustar las opciones de visualización para los gráficos."
msgid "Admin"
msgstr "Administrador"
#: src/components/systems-table/systems-table.tsx:270
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "Agente"
#: src/components/alerts/alert-button.tsx:33
#: src/components/alerts/alert-button.tsx:79
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "Alertas"
#: src/components/systems-table/systems-table.tsx:347
#: src/components/alerts/alert-button.tsx:99
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
msgid "All Systems"
msgstr "Todos los Sistemas"
#: src/components/systems-table/systems-table.tsx:696
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "¿Está seguro de que desea eliminar {name}?"
@@ -106,29 +109,29 @@ msgstr "¿Está seguro de que desea eliminar {name}?"
msgid "Automatic copy requires a secure context."
msgstr "La copia automática requiere un contexto seguro."
#: src/components/routes/system.tsx:670
#: src/components/routes/system.tsx:660
msgid "Average"
msgstr "Promedio"
#: src/components/routes/system.tsx:446
#: src/components/routes/system.tsx:437
msgid "Average CPU utilization of containers"
msgstr "Utilización promedio de CPU de los contenedores"
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:253
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "El promedio excede <0>{value}{0}</0>"
#: src/components/routes/system.tsx:547
#: src/components/routes/system.tsx:538
msgid "Average power consumption of GPUs"
msgstr "Consumo de energía promedio de GPUs"
#: src/components/routes/system.tsx:435
#: src/components/routes/system.tsx:426
msgid "Average system-wide CPU utilization"
msgstr "Utilización promedio de CPU del sistema"
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:569
#: src/components/routes/system.tsx:556
msgid "Average utilization of {0}"
msgstr "Uso promedio de {0}"
@@ -138,31 +141,31 @@ msgid "Backups"
msgstr "Copias de Seguridad"
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:491
#: src/components/routes/system.tsx:482
msgid "Bandwidth"
msgstr "Ancho de banda"
#: src/components/login/auth-form.tsx:305
#: src/components/login/auth-form.tsx:306
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel admite OpenID Connect y muchos proveedores de autenticación OAuth2."
#: src/components/routes/settings/notifications.tsx:129
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel utiliza <0>Shoutrrr</0> para integrarse con servicios populares de notificación."
#: src/components/add-system.tsx:131
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "Binario"
#: src/components/charts/mem-chart.tsx:87
#: src/components/charts/mem-chart.tsx:89
msgid "Cache / Buffers"
msgstr "Caché / Buffers"
#: src/components/systems-table/systems-table.tsx:707
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "Cancelar"
#: src/components/routes/settings/config-yaml.tsx:69
#: src/components/routes/settings/config-yaml.tsx:68
msgid "Caution - potential data loss"
msgstr "Precaución - posible pérdida de datos"
@@ -174,37 +177,37 @@ msgstr "Cambiar las opciones generales de la aplicación."
msgid "Chart options"
msgstr "Opciones de Gráficos"
#: src/components/login/forgot-pass-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:34
msgid "Check {email} for a reset link."
msgstr "Revise {email} para un enlace de restablecimiento."
#: src/components/routes/settings/layout.tsx:41
#: src/components/routes/settings/layout.tsx:40
msgid "Check logs for more details."
msgstr "Revise los registros para más detalles."
#: src/components/routes/settings/notifications.tsx:185
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Verifique su servicio de notificaciones"
#: src/components/add-system.tsx:205
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "Haga clic para copiar"
#: src/components/login/forgot-pass-form.tsx:84
#: src/components/login/forgot-pass-form.tsx:90
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Instrucciones de línea de comandos"
#: src/components/routes/settings/notifications.tsx:79
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Configure cómo recibe las notificaciones de alertas."
#: src/components/login/auth-form.tsx:213
#: src/components/login/auth-form.tsx:218
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "Confirmar contraseña"
#: src/components/systems-table/systems-table.tsx:713
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "Continuar"
@@ -212,16 +215,16 @@ msgstr "Continuar"
msgid "Copied to clipboard"
msgstr "Copiado al portapapeles"
#: src/components/add-system.tsx:216
#: src/components/add-system.tsx:218
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "Copiar"
#: src/components/systems-table/systems-table.tsx:678
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "Copiar host"
#: src/components/add-system.tsx:225
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "Copiar comando de Linux"
@@ -229,27 +232,27 @@ msgstr "Copiar comando de Linux"
msgid "Copy text"
msgstr "Copiar texto"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "CPU"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:434
#: src/components/charts/area-chart.tsx:58
#: src/components/routes/system.tsx:425
#: src/components/charts/area-chart.tsx:56
msgid "CPU Usage"
msgstr "Uso de CPU"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "Crear cuenta"
#. Dark theme
#: src/components/mode-toggle.tsx:22
#: src/components/mode-toggle.tsx:21
msgid "Dark"
msgstr "Oscuro"
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:36
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Tablero"
@@ -257,37 +260,37 @@ msgstr "Tablero"
msgid "Default time period"
msgstr "Período de tiempo predeterminado"
#: src/components/systems-table/systems-table.tsx:683
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "Eliminar"
#: src/components/systems-table/systems-table.tsx:204
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "Disco"
#: src/components/routes/system.tsx:481
#: src/components/routes/system.tsx:472
msgid "Disk I/O"
msgstr "E/S de Disco"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:474
#: src/components/charts/disk-chart.tsx:77
#: src/components/routes/system.tsx:465
#: src/components/charts/disk-chart.tsx:79
msgid "Disk Usage"
msgstr "Uso de Disco"
#: src/components/routes/system.tsx:603
#: src/components/routes/system.tsx:593
msgid "Disk usage of {extraFsName}"
msgstr "Uso de disco de {extraFsName}"
#: src/components/routes/system.tsx:445
#: src/components/routes/system.tsx:436
msgid "Docker CPU Usage"
msgstr "Uso de CPU de Docker"
#: src/components/routes/system.tsx:466
#: src/components/routes/system.tsx:457
msgid "Docker Memory Usage"
msgstr "Uso de Memoria de Docker"
#: src/components/routes/system.tsx:507
#: src/components/routes/system.tsx:498
msgid "Docker Network I/O"
msgstr "E/S de Red de Docker"
@@ -297,22 +300,22 @@ msgstr "Documentación"
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:142
#: src/components/routes/system.tsx:345
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:336
msgid "Down"
msgstr "Abajo"
#: src/components/add-system.tsx:126
#: src/components/systems-table/systems-table.tsx:653
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr "Editar"
#: src/components/login/forgot-pass-form.tsx:54
#: src/components/login/auth-form.tsx:176
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
msgid "Email"
msgstr "Correo electrónico"
#: src/components/routes/settings/notifications.tsx:93
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "Notificaciones por correo"
@@ -320,32 +323,32 @@ msgstr "Notificaciones por correo"
msgid "Enter email address to reset password"
msgstr "Ingrese la dirección de correo electrónico para restablecer la contraseña"
#: src/components/routes/settings/notifications.tsx:113
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Ingrese dirección de correo..."
#: src/components/routes/settings/notifications.tsx:189
#: src/components/routes/settings/config-yaml.tsx:29
#: src/components/login/auth-form.tsx:137
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "Error"
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: src/components/routes/home.tsx:113
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "Excede {0}{1} en el último {2, plural, one {# minuto} other {# minutos}}"
#: src/components/routes/settings/config-yaml.tsx:73
#: src/components/routes/settings/config-yaml.tsx:72
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "Los sistemas existentes no definidos en <0>config.yml</0> serán eliminados. Por favor, haga copias de seguridad regularmente."
#: src/components/routes/settings/config-yaml.tsx:94
#: src/components/routes/settings/config-yaml.tsx:93
msgid "Export configuration"
msgstr "Exportar configuración"
#: src/components/routes/settings/config-yaml.tsx:49
#: src/components/routes/settings/config-yaml.tsx:48
msgid "Export your current systems configuration."
msgstr "Exporte la configuración actual de sus sistemas."
@@ -353,60 +356,60 @@ msgstr "Exporte la configuración actual de sus sistemas."
msgid "Failed to authenticate"
msgstr "Error al autenticar"
#: src/components/routes/settings/notifications.tsx:64
#: src/components/routes/settings/layout.tsx:40
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
msgid "Failed to save settings"
msgstr "Error al guardar la configuración"
#: src/components/routes/settings/notifications.tsx:190
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Error al enviar la notificación de prueba"
#: src/components/alerts/alerts-system.tsx:26
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Error al actualizar la alerta"
#: src/components/systems-table/systems-table.tsx:354
#: src/components/routes/system.tsx:643
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:633
msgid "Filter..."
msgstr "Filtrar..."
#: src/components/alerts/alerts-system.tsx:285
#: src/components/alerts/alerts-system.tsx:230
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "Por <0>{min}</0> {min, plural, one {minuto} other {minutos}}"
#: src/components/login/auth-form.tsx:328
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "¿Olvidó su contraseña?"
#. Context: General settings
#: src/components/routes/settings/layout.tsx:52
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "General"
#: src/components/routes/system.tsx:546
#: src/components/routes/system.tsx:537
msgid "GPU Power Draw"
msgstr "Consumo de energía de la GPU"
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "Cuadrícula"
#: src/components/add-system.tsx:159
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "Host / IP"
#: src/components/login/forgot-pass-form.tsx:94
#: src/components/login/forgot-pass-form.tsx:93
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Si ha perdido la contraseña de su cuenta de administrador, puede restablecerla usando el siguiente comando."
#: src/components/login/auth-form.tsx:18
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Dirección de correo electrónico no válida."
#. Linux kernel
#: src/components/routes/system.tsx:271
#: src/components/routes/system.tsx:267
msgid "Kernel"
msgstr "Kernel"
@@ -414,12 +417,12 @@ msgstr "Kernel"
msgid "Language"
msgstr "Idioma"
#: src/components/systems-table/systems-table.tsx:367
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "Diseño"
#. Light theme
#: src/components/mode-toggle.tsx:17
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Claro"
@@ -431,8 +434,8 @@ msgstr "Cerrar Sesión"
msgid "Login"
msgstr "Iniciar sesión"
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "Intento de inicio de sesión fallido"
@@ -441,49 +444,49 @@ msgstr "Intento de inicio de sesión fallido"
msgid "Logs"
msgstr "Registros"
#: src/components/routes/settings/notifications.tsx:82
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "¿Busca dónde crear alertas? Haga clic en los iconos de campana <0/> en la tabla de sistemas."
#: src/components/routes/settings/layout.tsx:86
#: src/components/routes/settings/layout.tsx:85
msgid "Manage display and notification preferences."
msgstr "Administrar preferencias de visualización y notificaciones."
#: src/components/add-system.tsx:227
#: src/components/add-system.tsx:226
msgid "Manual setup instructions"
msgstr "Instrucciones manuales de configuración"
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:673
#: src/components/routes/system.tsx:663
msgid "Max 1 min"
msgstr "Máx 1 min"
#: src/components/systems-table/systems-table.tsx:195
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "Memoria"
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:456
#: src/components/routes/system.tsx:447
msgid "Memory Usage"
msgstr "Uso de Memoria"
#: src/components/routes/system.tsx:467
#: src/components/routes/system.tsx:458
msgid "Memory usage of docker containers"
msgstr "Uso de memoria de los contenedores de Docker"
#: src/components/add-system.tsx:155
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "Nombre"
#: src/components/systems-table/systems-table.tsx:223
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "Red"
#: src/components/routes/system.tsx:508
#: src/components/routes/system.tsx:499
msgid "Network traffic of docker containers"
msgstr "Tráfico de red de los contenedores de Docker"
#: src/components/routes/system.tsx:493
#: src/components/routes/system.tsx:484
msgid "Network traffic of public interfaces"
msgstr "Tráfico de red de interfaces públicas"
@@ -491,34 +494,34 @@ msgstr "Tráfico de red de interfaces públicas"
msgid "No results found."
msgstr "No se encontraron resultados."
#: src/components/systems-table/systems-table.tsx:472
#: src/components/systems-table/systems-table.tsx:495
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "No se encontraron sistemas."
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:76
#: src/components/routes/settings/layout.tsx:57
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
msgid "Notifications"
msgstr "Notificaciones"
#: src/components/login/auth-form.tsx:300
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "Soporte para OAuth 2 / OIDC"
#: src/components/routes/settings/config-yaml.tsx:62
#: src/components/routes/settings/config-yaml.tsx:61
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "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:639
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "Abrir menú"
#: src/components/login/auth-form.tsx:251
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "O continuar con"
#: src/components/alerts/alert-button.tsx:120
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "Sobrescribir alertas existentes"
@@ -530,41 +533,41 @@ msgstr "Página"
msgid "Pages / Settings"
msgstr "Páginas / Configuraciones"
#: src/components/login/auth-form.tsx:195
#: src/components/login/auth-form.tsx:200
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "Contraseña"
#: src/components/login/auth-form.tsx:21
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "La contraseña debe tener al menos 8 caracteres."
#: src/components/login/auth-form.tsx:22
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr "La contraseña debe ser menor de 72 bytes."
#: src/components/login/forgot-pass-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Solicitud de restablecimiento de contraseña recibida"
#: src/components/systems-table/systems-table.tsx:672
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "Pausar"
#: src/components/systems-table/systems-table.tsx:143
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr ""
#: src/components/routes/settings/notifications.tsx:97
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "Por favor, <0>configure un servidor SMTP</0> para asegurar que las alertas sean entregadas."
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Por favor, revise los registros para más detalles."
#: src/components/login/forgot-pass-form.tsx:17
#: src/components/login/auth-form.tsx:41
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "Por favor, verifique sus credenciales e intente de nuevo"
@@ -572,7 +575,7 @@ msgstr "Por favor, verifique sus credenciales e intente de nuevo"
msgid "Please create an admin account"
msgstr "Por favor, cree una cuenta de administrador"
#: src/components/login/auth-form.tsx:138
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Por favor, habilite las ventanas emergentes para este sitio"
@@ -580,7 +583,7 @@ msgstr "Por favor, habilite las ventanas emergentes para este sitio"
msgid "Please log in again"
msgstr "Por favor, inicie sesión de nuevo"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Por favor, consulte <0>la documentación</0> para obtener instrucciones."
@@ -588,12 +591,12 @@ msgstr "Por favor, consulte <0>la documentación</0> para obtener instrucciones.
msgid "Please sign in to your account"
msgstr "Por favor, inicie sesión en su cuenta"
#: src/components/add-system.tsx:171
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "Puerto"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:577
#: src/components/routes/system.tsx:448
#: src/components/routes/system.tsx:564
msgid "Precise utilization at the recorded time"
msgstr "Utilización precisa en el momento registrado"
@@ -602,39 +605,39 @@ msgid "Preferred Language"
msgstr "Idioma Preferido"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:182
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "Clave Pública"
#. Disk read
#: src/components/charts/area-chart.tsx:62
#: src/components/charts/area-chart.tsx:72
#: src/components/charts/area-chart.tsx:60
#: src/components/charts/area-chart.tsx:70
msgid "Read"
msgstr "Lectura"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx:67
#: src/components/charts/area-chart.tsx:65
msgid "Received"
msgstr "Recibido"
#: src/components/login/forgot-pass-form.tsx:77
#: src/components/login/forgot-pass-form.tsx:76
msgid "Reset Password"
msgstr "Restablecer Contraseña"
#: src/components/systems-table/systems-table.tsx:667
#: src/components/systems-table/systems-table.tsx:628
msgid "Resume"
msgstr "Reanudar"
#: src/components/routes/settings/notifications.tsx:119
#: src/components/routes/settings/notifications.tsx:118
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Guarde la dirección usando la tecla enter o coma. Deje en blanco para desactivar las notificaciones por correo."
#: src/components/routes/settings/notifications.tsx:169
#: src/components/routes/settings/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
msgid "Save Settings"
msgstr "Guardar Configuración"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr "Guardar Sistema"
@@ -646,12 +649,12 @@ msgstr "Buscar"
msgid "Search for systems or settings..."
msgstr "Buscar sistemas o configuraciones..."
#: src/components/alerts/alert-button.tsx:82
#: src/components/alerts/alert-button.tsx:71
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Consulte <0>configuración de notificaciones</0> para configurar cómo recibe alertas."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx:66
#: src/components/charts/area-chart.tsx:64
msgid "Sent"
msgstr "Enviado"
@@ -662,16 +665,16 @@ msgstr "Establece el rango de tiempo predeterminado para los gráficos cuando se
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:72
#: src/components/routes/settings/layout.tsx:83
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
msgstr "Configuración"
#: src/components/routes/settings/layout.tsx:34
#: src/components/routes/settings/layout.tsx:33
msgid "Settings saved"
msgstr "Configuración guardada"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "Iniciar sesión"
@@ -679,7 +682,7 @@ msgstr "Iniciar sesión"
msgid "SMTP settings"
msgstr "Configuración SMTP"
#: src/components/systems-table/systems-table.tsx:389
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "Ordenar por"
@@ -687,18 +690,21 @@ msgstr "Ordenar por"
msgid "Status"
msgstr "Estado"
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:514
msgid "Swap space used by the system"
msgstr "Espacio de swap utilizado por el sistema"
#: src/components/routes/system.tsx:522
#: src/components/routes/system.tsx:513
msgid "Swap Usage"
msgstr "Uso de Swap"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:27
#: src/components/systems-table/systems-table.tsx:152
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "Sistema"
@@ -706,70 +712,70 @@ msgstr "Sistema"
msgid "Systems"
msgstr "Sistemas"
#: src/components/routes/settings/config-yaml.tsx:56
#: src/components/routes/settings/config-yaml.tsx:55
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "Los sistemas pueden ser gestionados en un archivo <0>config.yml</0> dentro de su directorio de datos."
#: src/components/systems-table/systems-table.tsx:377
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "Tabla"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:244
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr "Temperatura"
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:534
#: src/components/routes/system.tsx:525
msgid "Temperature"
msgstr "Temperatura"
#: src/components/routes/system.tsx:535
#: src/components/routes/system.tsx:526
msgid "Temperatures of system sensors"
msgstr "Temperaturas de los sensores del sistema"
#: src/components/routes/settings/notifications.tsx:213
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Probar <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:184
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Notificación de prueba enviada"
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:146
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "El agente debe estar ejecutándose en el sistema para conectarse. Copie el comando de instalación para el agente a continuación."
#: src/components/add-system.tsx:138
#: src/components/add-system.tsx:137
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "El agente debe estar ejecutándose en el sistema para conectarse. Copie el <0>docker-compose.yml</0> para el agente a continuación."
#: src/components/login/forgot-pass-form.tsx:99
#: src/components/login/forgot-pass-form.tsx:98
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "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:699
#: src/components/systems-table/systems-table.tsx:660
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Esta acción no se puede deshacer. Esto eliminará permanentemente todos los registros actuales de {name} de la base de datos."
#: src/components/routes/system.tsx:615
#: src/components/routes/system.tsx:605
msgid "Throughput of {extraFsName}"
msgstr "Rendimiento de {extraFsName}"
#: src/components/routes/system.tsx:482
#: src/components/routes/system.tsx:473
msgid "Throughput of root filesystem"
msgstr "Rendimiento del sistema de archivos raíz"
#: src/components/routes/settings/notifications.tsx:108
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "A correo(s)"
#: src/components/routes/system.tsx:409
#: src/components/routes/system.tsx:422
#: src/components/routes/system.tsx:400
#: src/components/routes/system.tsx:413
msgid "Toggle grid"
msgstr "Alternar cuadrícula"
#: src/components/mode-toggle.tsx:34
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "Alternar tema"
@@ -798,32 +804,32 @@ msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Se activa cuando el uso de cualquier disco supera un umbral"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:343
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:334
msgid "Up"
msgstr "Activo"
#: src/components/systems-table/systems-table.tsx:350
#: src/components/systems-table/systems-table.tsx:337
msgid "Updated in real time. Click on a system to view information."
msgstr "Actualizado en tiempo real. Haga clic en un sistema para ver la información."
#: src/components/routes/system.tsx:270
#: src/components/routes/system.tsx:266
msgid "Uptime"
msgstr "Tiempo de actividad"
#: src/components/routes/system.tsx:568
#: src/components/routes/system.tsx:602
#: src/components/charts/area-chart.tsx:75
#: src/components/routes/system.tsx:555
#: src/components/routes/system.tsx:592
#: src/components/charts/area-chart.tsx:73
msgid "Usage"
msgstr "Uso"
#: src/components/routes/system.tsx:474
#: src/components/routes/system.tsx:465
msgid "Usage of root partition"
msgstr "Uso de la partición raíz"
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:63
#: src/components/charts/area-chart.tsx:75
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "Usado"
@@ -832,15 +838,15 @@ msgstr "Usado"
msgid "Users"
msgstr "Usuarios"
#: src/components/systems-table/systems-table.tsx:359
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "Vista"
#: src/components/systems-table/systems-table.tsx:424
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "Columnas visibles"
#: src/components/routes/system.tsx:707
#: src/components/routes/system.tsx:697
msgid "Waiting for enough records to display"
msgstr "Esperando suficientes registros para mostrar"
@@ -848,24 +854,25 @@ msgstr "Esperando suficientes registros para mostrar"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "¿Quieres ayudarnos a mejorar nuestras traducciones? Consulta <0>Crowdin</0> para más detalles."
#: src/components/routes/settings/notifications.tsx:126
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Notificaciones Webhook / Push"
#. Disk write
#: src/components/charts/area-chart.tsx:61
#: src/components/charts/area-chart.tsx:71
#: src/components/charts/area-chart.tsx:59
#: src/components/charts/area-chart.tsx:69
msgid "Write"
msgstr "Escritura"
#: src/components/routes/settings/layout.tsx:62
#: src/components/routes/settings/layout.tsx:61
msgid "YAML Config"
msgstr "Configuración YAML"
#: src/components/routes/settings/config-yaml.tsx:46
#: src/components/routes/settings/config-yaml.tsx:45
msgid "YAML Configuration"
msgstr "Configuración YAML"
#: src/components/routes/settings/layout.tsx:35
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "Su configuración de usuario ha sido actualizada."

View File

@@ -19,11 +19,11 @@ msgstr ""
"X-Crowdin-File-ID: 16\n"
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:259
#: src/components/routes/system.tsx:255
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# روز} other {# روز}}"
#: src/components/routes/system.tsx:257
#: src/components/routes/system.tsx:253
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# ساعت} other {# ساعت}}"
@@ -48,27 +48,30 @@ msgid "30 days"
msgstr "۳۰ روز"
#. Table column
#: src/components/systems-table/systems-table.tsx:304
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "عملیات"
#: src/components/routes/home.tsx:94
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr " هشدارهای فعال"
#: src/components/add-system.tsx:43
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "افزودن <0>سیستم</0>"
#: src/components/add-system.tsx:126
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "افزودن سیستم جدید"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Add system"
msgstr "افزودن سیستم"
#: src/components/routes/settings/notifications.tsx:158
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "افزودن آدرس اینترنتی"
@@ -84,21 +87,21 @@ msgstr "تنظیم گزینه‌های نمایش برای نمودارها."
msgid "Admin"
msgstr "مدیر"
#: src/components/systems-table/systems-table.tsx:270
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "عامل"
#: src/components/alerts/alert-button.tsx:33
#: src/components/alerts/alert-button.tsx:79
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "هشدارها"
#: src/components/systems-table/systems-table.tsx:347
#: src/components/alerts/alert-button.tsx:99
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
msgid "All Systems"
msgstr "همه سیستم‌ها"
#: src/components/systems-table/systems-table.tsx:696
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "آیا مطمئن هستید که می‌خواهید {name} را حذف کنید؟"
@@ -106,29 +109,29 @@ msgstr "آیا مطمئن هستید که می‌خواهید {name} را حذف
msgid "Automatic copy requires a secure context."
msgstr "کپی خودکار نیاز به یک زمینه امن دارد."
#: src/components/routes/system.tsx:670
#: src/components/routes/system.tsx:660
msgid "Average"
msgstr "میانگین"
#: src/components/routes/system.tsx:446
#: src/components/routes/system.tsx:437
msgid "Average CPU utilization of containers"
msgstr "میانگین استفاده از CPU کانتینرها"
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:253
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr ""
#: src/components/routes/system.tsx:547
#: src/components/routes/system.tsx:538
msgid "Average power consumption of GPUs"
msgstr "میانگین مصرف برق پردازنده‌های گرافیکی"
#: src/components/routes/system.tsx:435
#: src/components/routes/system.tsx:426
msgid "Average system-wide CPU utilization"
msgstr "میانگین استفاده از CPU در کل سیستم"
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:569
#: src/components/routes/system.tsx:556
msgid "Average utilization of {0}"
msgstr "میانگین استفاده از {0}"
@@ -138,31 +141,31 @@ msgid "Backups"
msgstr "پشتیبان‌گیری‌ها"
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:491
#: src/components/routes/system.tsx:482
msgid "Bandwidth"
msgstr "پهنای باند"
#: src/components/login/auth-form.tsx:305
#: src/components/login/auth-form.tsx:306
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "بِزل از OpenID Connect و بسیاری از ارائه‌دهندگان احراز هویت OAuth2 پشتیبانی می‌کند."
#: src/components/routes/settings/notifications.tsx:129
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "بِزل از <0>Shoutrrr</0> برای ادغام با سرویس‌های اطلاع‌رسانی محبوب استفاده می‌کند."
#: src/components/add-system.tsx:131
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "دودویی"
#: src/components/charts/mem-chart.tsx:87
#: src/components/charts/mem-chart.tsx:89
msgid "Cache / Buffers"
msgstr "حافظه پنهان / بافرها"
#: src/components/systems-table/systems-table.tsx:707
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "لغو"
#: src/components/routes/settings/config-yaml.tsx:69
#: src/components/routes/settings/config-yaml.tsx:68
msgid "Caution - potential data loss"
msgstr "احتیاط - احتمال از دست رفتن داده‌ها"
@@ -174,37 +177,37 @@ msgstr "تغییر گزینه‌های کلی برنامه."
msgid "Chart options"
msgstr "گزینه‌های نمودار"
#: src/components/login/forgot-pass-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:34
msgid "Check {email} for a reset link."
msgstr "ایمیل {email} خود را برای لینک بازنشانی بررسی کنید."
#: src/components/routes/settings/layout.tsx:41
#: src/components/routes/settings/layout.tsx:40
msgid "Check logs for more details."
msgstr "برای جزئیات بیشتر، لاگ‌ها را بررسی کنید."
#: src/components/routes/settings/notifications.tsx:185
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "سرویس اطلاع‌رسانی خود را بررسی کنید"
#: src/components/add-system.tsx:205
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "برای کپی کردن کلیک کنید"
#: src/components/login/forgot-pass-form.tsx:84
#: src/components/login/forgot-pass-form.tsx:90
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "دستورالعمل‌های خط فرمان"
#: src/components/routes/settings/notifications.tsx:79
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "نحوه دریافت هشدارهای اطلاع‌رسانی را پیکربندی کنید."
#: src/components/login/auth-form.tsx:213
#: src/components/login/auth-form.tsx:218
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "تأیید رمز عبور"
#: src/components/systems-table/systems-table.tsx:713
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "ادامه"
@@ -212,16 +215,16 @@ msgstr "ادامه"
msgid "Copied to clipboard"
msgstr "در کلیپ‌بورد کپی شد"
#: src/components/add-system.tsx:216
#: src/components/add-system.tsx:218
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "کپی"
#: src/components/systems-table/systems-table.tsx:678
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "کپی میزبان"
#: src/components/add-system.tsx:225
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "کپی دستور لینوکس"
@@ -229,27 +232,27 @@ msgstr "کپی دستور لینوکس"
msgid "Copy text"
msgstr "کپی متن"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "پردازنده"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:434
#: src/components/charts/area-chart.tsx:58
#: src/components/routes/system.tsx:425
#: src/components/charts/area-chart.tsx:56
msgid "CPU Usage"
msgstr "میزان استفاده از پردازنده"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "ایجاد حساب کاربری"
#. Dark theme
#: src/components/mode-toggle.tsx:22
#: src/components/mode-toggle.tsx:21
msgid "Dark"
msgstr "تیره"
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:36
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "داشبورد"
@@ -257,37 +260,37 @@ msgstr "داشبورد"
msgid "Default time period"
msgstr "بازه زمانی پیش‌فرض"
#: src/components/systems-table/systems-table.tsx:683
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "حذف"
#: src/components/systems-table/systems-table.tsx:204
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "دیسک"
#: src/components/routes/system.tsx:481
#: src/components/routes/system.tsx:472
msgid "Disk I/O"
msgstr "ورودی/خروجی دیسک"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:474
#: src/components/charts/disk-chart.tsx:77
#: src/components/routes/system.tsx:465
#: src/components/charts/disk-chart.tsx:79
msgid "Disk Usage"
msgstr "میزان استفاده از دیسک"
#: src/components/routes/system.tsx:603
#: src/components/routes/system.tsx:593
msgid "Disk usage of {extraFsName}"
msgstr "میزان استفاده از دیسک {extraFsName}"
#: src/components/routes/system.tsx:445
#: src/components/routes/system.tsx:436
msgid "Docker CPU Usage"
msgstr "میزان استفاده از CPU داکر"
#: src/components/routes/system.tsx:466
#: src/components/routes/system.tsx:457
msgid "Docker Memory Usage"
msgstr "میزان استفاده از حافظه داکر"
#: src/components/routes/system.tsx:507
#: src/components/routes/system.tsx:498
msgid "Docker Network I/O"
msgstr "ورودی/خروجی شبکه داکر"
@@ -297,22 +300,22 @@ msgstr "مستندات"
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:142
#: src/components/routes/system.tsx:345
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:336
msgid "Down"
msgstr ""
#: src/components/add-system.tsx:126
#: src/components/systems-table/systems-table.tsx:653
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr ""
#: src/components/login/forgot-pass-form.tsx:54
#: src/components/login/auth-form.tsx:176
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
msgid "Email"
msgstr "ایمیل"
#: src/components/routes/settings/notifications.tsx:93
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "اعلان‌های ایمیلی"
@@ -320,32 +323,32 @@ msgstr "اعلان‌های ایمیلی"
msgid "Enter email address to reset password"
msgstr "آدرس ایمیل را برای بازنشانی رمز عبور وارد کنید"
#: src/components/routes/settings/notifications.tsx:113
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "آدرس ایمیل را وارد کنید..."
#: src/components/routes/settings/notifications.tsx:189
#: src/components/routes/settings/config-yaml.tsx:29
#: src/components/login/auth-form.tsx:137
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "خطا"
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: src/components/routes/home.tsx:113
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "در {2, plural, one {# دقیقه} other {# دقیقه}} گذشته از {0}{1} بیشتر است"
#: src/components/routes/settings/config-yaml.tsx:73
#: src/components/routes/settings/config-yaml.tsx:72
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "سیستم‌های موجود که در <0>config.yml</0> تعریف نشده‌اند حذف خواهند شد. لطفاً به طور منظم پشتیبان‌گیری کنید."
#: src/components/routes/settings/config-yaml.tsx:94
#: src/components/routes/settings/config-yaml.tsx:93
msgid "Export configuration"
msgstr "خارج کردن پیکربندی"
#: src/components/routes/settings/config-yaml.tsx:49
#: src/components/routes/settings/config-yaml.tsx:48
msgid "Export your current systems configuration."
msgstr "پیکربندی سیستم‌های فعلی خود را خارج کنید."
@@ -353,60 +356,60 @@ msgstr "پیکربندی سیستم‌های فعلی خود را خارج کن
msgid "Failed to authenticate"
msgstr "احراز هویت ناموفق بود"
#: src/components/routes/settings/notifications.tsx:64
#: src/components/routes/settings/layout.tsx:40
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
msgid "Failed to save settings"
msgstr "ذخیره تنظیمات ناموفق بود"
#: src/components/routes/settings/notifications.tsx:190
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "ارسال اعلان آزمایشی ناموفق بود"
#: src/components/alerts/alerts-system.tsx:26
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "به‌روزرسانی هشدار ناموفق بود"
#: src/components/systems-table/systems-table.tsx:354
#: src/components/routes/system.tsx:643
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:633
msgid "Filter..."
msgstr "فیلتر..."
#: src/components/alerts/alerts-system.tsx:285
#: src/components/alerts/alerts-system.tsx:230
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "برای <0>{min}</0> {min, plural, one {دقیقه} other {دقیقه}}"
#: src/components/login/auth-form.tsx:328
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "رمز عبور را فراموش کرده‌اید؟"
#. Context: General settings
#: src/components/routes/settings/layout.tsx:52
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "عمومی"
#: src/components/routes/system.tsx:546
#: src/components/routes/system.tsx:537
msgid "GPU Power Draw"
msgstr "مصرف برق پردازنده گرافیکی"
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "جدول"
#: src/components/add-system.tsx:159
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "میزبان / IP"
#: src/components/login/forgot-pass-form.tsx:94
#: src/components/login/forgot-pass-form.tsx:93
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "اگر رمز عبور حساب مدیر خود را گم کرده‌اید، می‌توانید آن را با استفاده از دستور زیر بازنشانی کنید."
#: src/components/login/auth-form.tsx:18
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "آدرس ایمیل نامعتبر است."
#. Linux kernel
#: src/components/routes/system.tsx:271
#: src/components/routes/system.tsx:267
msgid "Kernel"
msgstr "هسته"
@@ -414,12 +417,12 @@ msgstr "هسته"
msgid "Language"
msgstr "زبان"
#: src/components/systems-table/systems-table.tsx:367
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "طرح‌بندی"
#. Light theme
#: src/components/mode-toggle.tsx:17
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "روشن"
@@ -431,8 +434,8 @@ msgstr "خروج"
msgid "Login"
msgstr "ورود"
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "تلاش برای ورود ناموفق بود"
@@ -441,49 +444,49 @@ msgstr "تلاش برای ورود ناموفق بود"
msgid "Logs"
msgstr "لاگ‌ها"
#: src/components/routes/settings/notifications.tsx:82
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "به دنبال جایی برای ایجاد هشدار هستید؟ روی آیکون‌های زنگ <0/> در جدول سیستم‌ها کلیک کنید."
#: src/components/routes/settings/layout.tsx:86
#: src/components/routes/settings/layout.tsx:85
msgid "Manage display and notification preferences."
msgstr "مدیریت تنظیمات نمایش و اعلان‌ها."
#: src/components/add-system.tsx:227
#: src/components/add-system.tsx:226
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:673
#: src/components/routes/system.tsx:663
msgid "Max 1 min"
msgstr "حداکثر ۱ دقیقه"
#: src/components/systems-table/systems-table.tsx:195
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "حافظه"
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:456
#: src/components/routes/system.tsx:447
msgid "Memory Usage"
msgstr "میزان استفاده از حافظه"
#: src/components/routes/system.tsx:467
#: src/components/routes/system.tsx:458
msgid "Memory usage of docker containers"
msgstr "میزان استفاده از حافظه کانتینرهای داکر"
#: src/components/add-system.tsx:155
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "نام"
#: src/components/systems-table/systems-table.tsx:223
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "شبکه"
#: src/components/routes/system.tsx:508
#: src/components/routes/system.tsx:499
msgid "Network traffic of docker containers"
msgstr "ترافیک شبکه کانتینرهای داکر"
#: src/components/routes/system.tsx:493
#: src/components/routes/system.tsx:484
msgid "Network traffic of public interfaces"
msgstr "ترافیک شبکه رابط‌های عمومی"
@@ -491,34 +494,34 @@ msgstr "ترافیک شبکه رابط‌های عمومی"
msgid "No results found."
msgstr "هیچ نتیجه‌ای یافت نشد."
#: src/components/systems-table/systems-table.tsx:472
#: src/components/systems-table/systems-table.tsx:495
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "هیچ سیستمی یافت نشد."
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:76
#: src/components/routes/settings/layout.tsx:57
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
msgid "Notifications"
msgstr "اعلان‌ها"
#: src/components/login/auth-form.tsx:300
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "پشتیبانی از OAuth 2 / OIDC"
#: src/components/routes/settings/config-yaml.tsx:62
#: src/components/routes/settings/config-yaml.tsx:61
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "در هر بار راه‌اندازی مجدد، سیستم‌های موجود در پایگاه داده با سیستم‌های تعریف شده در فایل مطابقت داده می‌شوند."
#: src/components/systems-table/systems-table.tsx:639
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "باز کردن منو"
#: src/components/login/auth-form.tsx:251
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "یا ادامه با"
#: src/components/alerts/alert-button.tsx:120
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "بازنویسی هشدارهای موجود"
@@ -530,41 +533,41 @@ msgstr "صفحه"
msgid "Pages / Settings"
msgstr "صفحات / تنظیمات"
#: src/components/login/auth-form.tsx:195
#: src/components/login/auth-form.tsx:200
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "رمز عبور"
#: src/components/login/auth-form.tsx:21
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "رمز عبور باید حداقل ۸ کاراکتر باشد."
#: src/components/login/auth-form.tsx:22
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr ""
#: src/components/login/forgot-pass-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "درخواست بازنشانی رمز عبور دریافت شد"
#: src/components/systems-table/systems-table.tsx:672
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "توقف"
#: src/components/systems-table/systems-table.tsx:143
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr ""
#: src/components/routes/settings/notifications.tsx:97
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "لطفاً برای اطمینان از تحویل هشدارها، یک <0>سرور SMTP پیکربندی کنید</0>."
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "لطفاً برای جزئیات بیشتر، لاگ‌ها را بررسی کنید."
#: src/components/login/forgot-pass-form.tsx:17
#: src/components/login/auth-form.tsx:41
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "لطفاً اعتبارنامه‌های خود را بررسی کرده و دوباره تلاش کنید."
@@ -572,7 +575,7 @@ msgstr "لطفاً اعتبارنامه‌های خود را بررسی کرده
msgid "Please create an admin account"
msgstr "لطفاً یک حساب مدیر ایجاد کنید"
#: src/components/login/auth-form.tsx:138
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "لطفاً پنجره‌های بازشو را برای این سایت فعال کنید"
@@ -580,7 +583,7 @@ msgstr "لطفاً پنجره‌های بازشو را برای این سایت
msgid "Please log in again"
msgstr "لطفاً دوباره وارد شوید"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "لطفاً برای دستورالعمل‌ها به <0>مستندات</0> مراجعه کنید."
@@ -588,12 +591,12 @@ msgstr "لطفاً برای دستورالعمل‌ها به <0>مستندات</
msgid "Please sign in to your account"
msgstr "لطفاً به حساب کاربری خود وارد شوید"
#: src/components/add-system.tsx:171
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "پورت"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:577
#: src/components/routes/system.tsx:448
#: src/components/routes/system.tsx:564
msgid "Precise utilization at the recorded time"
msgstr "میزان دقیق استفاده در زمان ثبت شده"
@@ -602,39 +605,39 @@ msgid "Preferred Language"
msgstr "زبان ترجیحی"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:182
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "کلید عمومی"
#. Disk read
#: src/components/charts/area-chart.tsx:62
#: src/components/charts/area-chart.tsx:72
#: src/components/charts/area-chart.tsx:60
#: src/components/charts/area-chart.tsx:70
msgid "Read"
msgstr "خواندن"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx:67
#: src/components/charts/area-chart.tsx:65
msgid "Received"
msgstr "دریافت شد"
#: src/components/login/forgot-pass-form.tsx:77
#: src/components/login/forgot-pass-form.tsx:76
msgid "Reset Password"
msgstr "بازنشانی رمز عبور"
#: src/components/systems-table/systems-table.tsx:667
#: src/components/systems-table/systems-table.tsx:628
msgid "Resume"
msgstr "ادامه"
#: src/components/routes/settings/notifications.tsx:119
#: src/components/routes/settings/notifications.tsx:118
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "آدرس را با استفاده از کلید Enter یا کاما ذخیره کنید. برای غیرفعال کردن اعلان‌های ایمیلی، خالی بگذارید."
#: src/components/routes/settings/notifications.tsx:169
#: src/components/routes/settings/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
msgid "Save Settings"
msgstr "ذخیره تنظیمات"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr ""
@@ -646,12 +649,12 @@ msgstr "جستجو"
msgid "Search for systems or settings..."
msgstr "جستجو برای سیستم‌ها یا تنظیمات..."
#: src/components/alerts/alert-button.tsx:82
#: src/components/alerts/alert-button.tsx:71
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "برای پیکربندی نحوه دریافت هشدارها، به <0>تنظیمات اعلان</0> مراجعه کنید."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx:66
#: src/components/charts/area-chart.tsx:64
msgid "Sent"
msgstr "ارسال شد"
@@ -662,16 +665,16 @@ msgstr "بازه زمانی پیش‌فرض برای نمودارها هنگام
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:72
#: src/components/routes/settings/layout.tsx:83
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
msgstr "تنظیمات"
#: src/components/routes/settings/layout.tsx:34
#: src/components/routes/settings/layout.tsx:33
msgid "Settings saved"
msgstr "تنظیمات ذخیره شد"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "ورود"
@@ -679,7 +682,7 @@ msgstr "ورود"
msgid "SMTP settings"
msgstr "تنظیمات SMTP"
#: src/components/systems-table/systems-table.tsx:389
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "مرتب‌سازی بر اساس"
@@ -687,18 +690,21 @@ msgstr "مرتب‌سازی بر اساس"
msgid "Status"
msgstr "وضعیت"
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:514
msgid "Swap space used by the system"
msgstr "فضای Swap استفاده شده توسط سیستم"
#: src/components/routes/system.tsx:522
#: src/components/routes/system.tsx:513
msgid "Swap Usage"
msgstr "میزان استفاده از Swap"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:27
#: src/components/systems-table/systems-table.tsx:152
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "سیستم"
@@ -706,70 +712,70 @@ msgstr "سیستم"
msgid "Systems"
msgstr "سیستم‌ها"
#: src/components/routes/settings/config-yaml.tsx:56
#: src/components/routes/settings/config-yaml.tsx:55
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "سیستم‌ها ممکن است در یک فایل <0>config.yml</0> درون دایرکتوری داده شما مدیریت شوند."
#: src/components/systems-table/systems-table.tsx:377
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "جدول"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:244
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr ""
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:534
#: src/components/routes/system.tsx:525
msgid "Temperature"
msgstr "دما"
#: src/components/routes/system.tsx:535
#: src/components/routes/system.tsx:526
msgid "Temperatures of system sensors"
msgstr "دمای حسگرهای سیستم"
#: src/components/routes/settings/notifications.tsx:213
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "تست <0>آدرس اینترنتی</0>"
#: src/components/routes/settings/notifications.tsx:184
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "اعلان آزمایشی ارسال شد"
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:146
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "برای اتصال، عامل باید روی سیستم در حال اجرا باشد. دستور نصب عامل را از زیر کپی کنید."
#: src/components/add-system.tsx:138
#: src/components/add-system.tsx:137
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "برای اتصال، عامل باید روی سیستم در حال اجرا باشد. <0>docker-compose.yml</0> مربوط به عامل را از زیر کپی کنید."
#: src/components/login/forgot-pass-form.tsx:99
#: src/components/login/forgot-pass-form.tsx:98
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "سپس وارد بخش پشتیبان شوید و رمز عبور حساب کاربری خود را در جدول کاربران بازنشانی کنید."
#: src/components/systems-table/systems-table.tsx:699
#: src/components/systems-table/systems-table.tsx:660
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "این عمل قابل برگشت نیست. این کار تمام رکوردهای فعلی {name} را برای همیشه از پایگاه داده حذف خواهد کرد."
#: src/components/routes/system.tsx:615
#: src/components/routes/system.tsx:605
msgid "Throughput of {extraFsName}"
msgstr "توان عملیاتی {extraFsName}"
#: src/components/routes/system.tsx:482
#: src/components/routes/system.tsx:473
msgid "Throughput of root filesystem"
msgstr "توان عملیاتی سیستم فایل ریشه"
#: src/components/routes/settings/notifications.tsx:108
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "به ایمیل(ها)"
#: src/components/routes/system.tsx:409
#: src/components/routes/system.tsx:422
#: src/components/routes/system.tsx:400
#: src/components/routes/system.tsx:413
msgid "Toggle grid"
msgstr "تغییر نمایش جدول"
#: src/components/mode-toggle.tsx:34
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "تغییر تم"
@@ -798,32 +804,32 @@ msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "هنگامی که استفاده از هر دیسکی از یک آستانه فراتر رود، فعال می‌شود"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:343
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:334
msgid "Up"
msgstr ""
#: src/components/systems-table/systems-table.tsx:350
#: src/components/systems-table/systems-table.tsx:337
msgid "Updated in real time. Click on a system to view information."
msgstr "به صورت لحظه‌ای به‌روزرسانی می‌شود. برای مشاهده اطلاعات، روی یک سیستم کلیک کنید."
#: src/components/routes/system.tsx:270
#: src/components/routes/system.tsx:266
msgid "Uptime"
msgstr "آپتایم"
#: src/components/routes/system.tsx:568
#: src/components/routes/system.tsx:602
#: src/components/charts/area-chart.tsx:75
#: src/components/routes/system.tsx:555
#: src/components/routes/system.tsx:592
#: src/components/charts/area-chart.tsx:73
msgid "Usage"
msgstr "میزان استفاده"
#: src/components/routes/system.tsx:474
#: src/components/routes/system.tsx:465
msgid "Usage of root partition"
msgstr "میزان استفاده از پارتیشن ریشه"
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:63
#: src/components/charts/area-chart.tsx:75
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "استفاده شده"
@@ -832,15 +838,15 @@ msgstr "استفاده شده"
msgid "Users"
msgstr "کاربران"
#: src/components/systems-table/systems-table.tsx:359
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "مشاهده"
#: src/components/systems-table/systems-table.tsx:424
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "فیلدهای قابل مشاهده"
#: src/components/routes/system.tsx:707
#: src/components/routes/system.tsx:697
msgid "Waiting for enough records to display"
msgstr "در انتظار رکوردهای کافی برای نمایش"
@@ -848,24 +854,25 @@ msgstr "در انتظار رکوردهای کافی برای نمایش"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "می‌خواهید به ما کمک کنید تا ترجمه‌های خود را بهتر کنیم؟ برای جزئیات بیشتر به <0>Crowdin</0> مراجعه کنید."
#: src/components/routes/settings/notifications.tsx:126
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "اعلان‌های Webhook / Push"
#. Disk write
#: src/components/charts/area-chart.tsx:61
#: src/components/charts/area-chart.tsx:71
#: src/components/charts/area-chart.tsx:59
#: src/components/charts/area-chart.tsx:69
msgid "Write"
msgstr "نوشتن"
#: src/components/routes/settings/layout.tsx:62
#: src/components/routes/settings/layout.tsx:61
msgid "YAML Config"
msgstr "پیکربندی YAML"
#: src/components/routes/settings/config-yaml.tsx:46
#: src/components/routes/settings/config-yaml.tsx:45
msgid "YAML Configuration"
msgstr "پیکربندی YAML"
#: src/components/routes/settings/layout.tsx:35
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "تنظیمات کاربری شما به‌روزرسانی شد."

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: fr\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-03-06 07:27\n"
"PO-Revision-Date: 2025-03-28 21:04\n"
"Last-Translator: \n"
"Language-Team: French\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
@@ -300,12 +300,12 @@ msgstr "Documentation"
#: src/components/systems-table/systems-table.tsx:142
#: src/components/routes/system.tsx:345
msgid "Down"
msgstr ""
msgstr "Injoignable"
#: src/components/add-system.tsx:126
#: src/components/systems-table/systems-table.tsx:653
msgid "Edit"
msgstr ""
msgstr "Éditer"
#: src/components/login/forgot-pass-form.tsx:54
#: src/components/login/auth-form.tsx:176
@@ -451,7 +451,7 @@ msgstr "Gérer les préférences d'affichage et de notification."
#: src/components/add-system.tsx:227
msgid "Manual setup instructions"
msgstr ""
msgstr "Guide pour une installation manuelle"
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:673
@@ -541,7 +541,7 @@ msgstr "Le mot de passe doit contenir au moins 8 caractères."
#: src/components/login/auth-form.tsx:22
msgid "Password must be less than 72 bytes."
msgstr ""
msgstr "Le mot de passe doit être inférieur à 72 Octets."
#: src/components/login/forgot-pass-form.tsx:34
msgid "Password reset request received"
@@ -553,7 +553,7 @@ msgstr "Pause"
#: src/components/systems-table/systems-table.tsx:143
msgid "Paused"
msgstr ""
msgstr "En pause"
#: src/components/routes/settings/notifications.tsx:97
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
@@ -636,7 +636,7 @@ msgstr "Enregistrer les paramètres"
#: src/components/add-system.tsx:232
msgid "Save system"
msgstr ""
msgstr "Sauvegarder le système"
#: src/components/navbar.tsx:134
msgid "Search"
@@ -717,7 +717,7 @@ msgstr "Tableau"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:244
msgid "Temp"
msgstr ""
msgstr "Temp."
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:534
@@ -791,7 +791,7 @@ msgstr "Déclenchement lorsque l'utilisation de la mémoire dépasse un seuil"
#: src/lib/utils.ts:314
msgid "Triggers when status switches between up and down"
msgstr "Déclenchement lorsque le statut passe d'opérationnel à indisponible"
msgstr "Se déclenche lorsque le statut passe de \"Joignable\" à \"Injoignable\""
#: src/lib/utils.ts:334
msgid "Triggers when usage of any disk exceeds a threshold"
@@ -801,7 +801,7 @@ msgstr "Déclenchement lorsque l'utilisation de tout disque dépasse un seuil"
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:343
msgid "Up"
msgstr ""
msgstr "Joignable"
#: src/components/systems-table/systems-table.tsx:350
msgid "Updated in real time. Click on a system to view information."
@@ -869,3 +869,4 @@ msgstr "Configuration YAML"
#: src/components/routes/settings/layout.tsx:35
msgid "Your user settings have been updated."
msgstr "Vos paramètres utilisateur ont été mis à jour."

View File

@@ -19,11 +19,11 @@ msgstr ""
"X-Crowdin-File-ID: 16\n"
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:259
#: src/components/routes/system.tsx:255
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# dan} other {# dani}}"
#: src/components/routes/system.tsx:257
#: src/components/routes/system.tsx:253
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# sat} other {# sati}}"
@@ -48,27 +48,30 @@ msgid "30 days"
msgstr "30 dana"
#. Table column
#: src/components/systems-table/systems-table.tsx:304
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "Akcije"
#: src/components/routes/home.tsx:94
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Aktivna upozorenja"
#: src/components/add-system.tsx:43
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Dodaj <0>Sistem</0>"
#: src/components/add-system.tsx:126
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "Dodaj Novi Sistem"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Add system"
msgstr "Dodaj sistem"
#: src/components/routes/settings/notifications.tsx:158
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Dodaj URL"
@@ -84,21 +87,21 @@ msgstr "Podesite opcije prikaza za grafikone."
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx:270
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "Agent"
#: src/components/alerts/alert-button.tsx:33
#: src/components/alerts/alert-button.tsx:79
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "Upozorenja"
#: src/components/systems-table/systems-table.tsx:347
#: src/components/alerts/alert-button.tsx:99
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
msgid "All Systems"
msgstr "Svi Sistemi"
#: src/components/systems-table/systems-table.tsx:696
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "Jeste li sigurni da želite izbrisati {name}?"
@@ -106,29 +109,29 @@ msgstr "Jeste li sigurni da želite izbrisati {name}?"
msgid "Automatic copy requires a secure context."
msgstr "Automatsko kopiranje zahtijeva siguran kontekst."
#: src/components/routes/system.tsx:670
#: src/components/routes/system.tsx:660
msgid "Average"
msgstr "Prosjek"
#: src/components/routes/system.tsx:446
#: src/components/routes/system.tsx:437
msgid "Average CPU utilization of containers"
msgstr "Prosječna iskorištenost procesora u spremnicima"
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:253
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Prosjek premašuje <0>{value}{0}</0>"
#: src/components/routes/system.tsx:547
#: src/components/routes/system.tsx:538
msgid "Average power consumption of GPUs"
msgstr ""
#: src/components/routes/system.tsx:435
#: src/components/routes/system.tsx:426
msgid "Average system-wide CPU utilization"
msgstr "Prosječna iskorištenost procesora na cijelom sustavu"
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:569
#: src/components/routes/system.tsx:556
msgid "Average utilization of {0}"
msgstr ""
@@ -138,31 +141,31 @@ msgid "Backups"
msgstr "Sigurnosne kopije"
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:491
#: src/components/routes/system.tsx:482
msgid "Bandwidth"
msgstr "Propusnost"
#: src/components/login/auth-form.tsx:305
#: src/components/login/auth-form.tsx:306
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel podržava OpenID Connect i mnoge druge OAuth2 davatalje autentifikacije."
#: src/components/routes/settings/notifications.tsx:129
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel koristi <0>Shoutrrr</0> za integraciju sa popularnim servisima za notifikacije."
#: src/components/add-system.tsx:131
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "Binarni"
#: src/components/charts/mem-chart.tsx:87
#: src/components/charts/mem-chart.tsx:89
msgid "Cache / Buffers"
msgstr "Predmemorija / Međuspremnici"
#: src/components/systems-table/systems-table.tsx:707
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "Otkaži"
#: src/components/routes/settings/config-yaml.tsx:69
#: src/components/routes/settings/config-yaml.tsx:68
msgid "Caution - potential data loss"
msgstr "Oprez - mogući gubitak podataka"
@@ -174,37 +177,37 @@ msgstr "Promijenite opće opcije aplikacije."
msgid "Chart options"
msgstr "Opcije grafikona"
#: src/components/login/forgot-pass-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:34
msgid "Check {email} for a reset link."
msgstr "Provjerite {email} za vezu za resetiranje."
#: src/components/routes/settings/layout.tsx:41
#: src/components/routes/settings/layout.tsx:40
msgid "Check logs for more details."
msgstr "Provjerite logove za više detalja."
#: src/components/routes/settings/notifications.tsx:185
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Provjerite Vaš servis notifikacija"
#: src/components/add-system.tsx:205
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "Pritisnite za kopiranje"
#: src/components/login/forgot-pass-form.tsx:84
#: src/components/login/forgot-pass-form.tsx:90
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Upute za naredbeni redak"
#: src/components/routes/settings/notifications.tsx:79
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Konfigurirajte način primanja obavijesti upozorenja."
#: src/components/login/auth-form.tsx:213
#: src/components/login/auth-form.tsx:218
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "Potvrdite lozinku"
#: src/components/systems-table/systems-table.tsx:713
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "Nastavite"
@@ -212,16 +215,16 @@ msgstr "Nastavite"
msgid "Copied to clipboard"
msgstr "Kopirano u međuspremnik"
#: src/components/add-system.tsx:216
#: src/components/add-system.tsx:218
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "Kopiraj"
#: src/components/systems-table/systems-table.tsx:678
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "Kopiraj hosta"
#: src/components/add-system.tsx:225
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "Kopiraj Linux komandu"
@@ -229,27 +232,27 @@ msgstr "Kopiraj Linux komandu"
msgid "Copy text"
msgstr "Kopiraj tekst"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "Procesor"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:434
#: src/components/charts/area-chart.tsx:58
#: src/components/routes/system.tsx:425
#: src/components/charts/area-chart.tsx:56
msgid "CPU Usage"
msgstr "Iskorištenost procesora"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "Napravite račun"
#. Dark theme
#: src/components/mode-toggle.tsx:22
#: src/components/mode-toggle.tsx:21
msgid "Dark"
msgstr "Tamno"
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:36
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Nadzorna ploča"
@@ -257,37 +260,37 @@ msgstr "Nadzorna ploča"
msgid "Default time period"
msgstr "Zadano vremensko razdoblje"
#: src/components/systems-table/systems-table.tsx:683
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "Izbriši"
#: src/components/systems-table/systems-table.tsx:204
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "Disk"
#: src/components/routes/system.tsx:481
#: src/components/routes/system.tsx:472
msgid "Disk I/O"
msgstr "Disk I/O"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:474
#: src/components/charts/disk-chart.tsx:77
#: src/components/routes/system.tsx:465
#: src/components/charts/disk-chart.tsx:79
msgid "Disk Usage"
msgstr "Iskorištenost Diska"
#: src/components/routes/system.tsx:603
#: src/components/routes/system.tsx:593
msgid "Disk usage of {extraFsName}"
msgstr "Iskorištenost diska od {extraFsName}"
#: src/components/routes/system.tsx:445
#: src/components/routes/system.tsx:436
msgid "Docker CPU Usage"
msgstr "Iskorištenost Docker Procesora"
#: src/components/routes/system.tsx:466
#: src/components/routes/system.tsx:457
msgid "Docker Memory Usage"
msgstr "Iskorištenost Docker Memorije"
#: src/components/routes/system.tsx:507
#: src/components/routes/system.tsx:498
msgid "Docker Network I/O"
msgstr "Docker Mrežni I/O"
@@ -297,22 +300,22 @@ msgstr "Dokumentacija"
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:142
#: src/components/routes/system.tsx:345
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:336
msgid "Down"
msgstr ""
#: src/components/add-system.tsx:126
#: src/components/systems-table/systems-table.tsx:653
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr ""
#: src/components/login/forgot-pass-form.tsx:54
#: src/components/login/auth-form.tsx:176
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
msgid "Email"
msgstr "Email"
#: src/components/routes/settings/notifications.tsx:93
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "Email notifikacije"
@@ -320,32 +323,32 @@ msgstr "Email notifikacije"
msgid "Enter email address to reset password"
msgstr "Unesite email adresu za resetiranje lozinke"
#: src/components/routes/settings/notifications.tsx:113
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Unesite email adresu..."
#: src/components/routes/settings/notifications.tsx:189
#: src/components/routes/settings/config-yaml.tsx:29
#: src/components/login/auth-form.tsx:137
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "Greška"
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: src/components/routes/home.tsx:113
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "Premašuje {0}{1} u posljednjih {2, plural, one {# minuta} other {# minute}}"
#: src/components/routes/settings/config-yaml.tsx:73
#: src/components/routes/settings/config-yaml.tsx:72
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "Postojeći sistemi koji nisu definirani u <0>config.yml</0> će biti izbrisani. Molimo Vas napravite redovite sigurnosne kopije."
#: src/components/routes/settings/config-yaml.tsx:94
#: src/components/routes/settings/config-yaml.tsx:93
msgid "Export configuration"
msgstr "Izvoz konfiguracije"
#: src/components/routes/settings/config-yaml.tsx:49
#: src/components/routes/settings/config-yaml.tsx:48
msgid "Export your current systems configuration."
msgstr "Izvoz trenutne sistemske konfiguracije."
@@ -353,60 +356,60 @@ msgstr "Izvoz trenutne sistemske konfiguracije."
msgid "Failed to authenticate"
msgstr "Provjera autentičnosti nije uspjela"
#: src/components/routes/settings/notifications.tsx:64
#: src/components/routes/settings/layout.tsx:40
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
msgid "Failed to save settings"
msgstr "Neuspješno snimanje postavki"
#: src/components/routes/settings/notifications.tsx:190
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Neuspješno slanje testne notifikacije"
#: src/components/alerts/alerts-system.tsx:26
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Ažuriranje upozorenja nije uspjelo"
#: src/components/systems-table/systems-table.tsx:354
#: src/components/routes/system.tsx:643
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:633
msgid "Filter..."
msgstr "Filter..."
#: src/components/alerts/alerts-system.tsx:285
#: src/components/alerts/alerts-system.tsx:230
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "Za <0>{min}</0> {min, plural, one {minutu} other {minute}}"
#: src/components/login/auth-form.tsx:328
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "Zaboravljena lozinka?"
#. Context: General settings
#: src/components/routes/settings/layout.tsx:52
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "Općenito"
#: src/components/routes/system.tsx:546
#: src/components/routes/system.tsx:537
msgid "GPU Power Draw"
msgstr ""
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "Mreža"
#: src/components/add-system.tsx:159
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "Host / IP"
#: src/components/login/forgot-pass-form.tsx:94
#: src/components/login/forgot-pass-form.tsx:93
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Ako ste izgubili lozinku za svoj administratorski račun, možete ju resetirati pomoću sljedeće naredbe."
#: src/components/login/auth-form.tsx:18
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Nevažeća adresa e-pošte."
#. Linux kernel
#: src/components/routes/system.tsx:271
#: src/components/routes/system.tsx:267
msgid "Kernel"
msgstr "Kernel"
@@ -414,12 +417,12 @@ msgstr "Kernel"
msgid "Language"
msgstr "Jezik"
#: src/components/systems-table/systems-table.tsx:367
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "Izgled"
#. Light theme
#: src/components/mode-toggle.tsx:17
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Svijetlo"
@@ -431,8 +434,8 @@ msgstr "Odjava"
msgid "Login"
msgstr "Prijava"
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "Pokušaj prijave nije uspio"
@@ -441,49 +444,49 @@ msgstr "Pokušaj prijave nije uspio"
msgid "Logs"
msgstr "Logovi"
#: src/components/routes/settings/notifications.tsx:82
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "Tražite gdje stvoriti upozorenja? Kliknite ikonu zvona <0/> u tablici sustava."
#: src/components/routes/settings/layout.tsx:86
#: src/components/routes/settings/layout.tsx:85
msgid "Manage display and notification preferences."
msgstr "Upravljajte postavkama prikaza i obavijesti."
#: src/components/add-system.tsx:227
#: src/components/add-system.tsx:226
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:673
#: src/components/routes/system.tsx:663
msgid "Max 1 min"
msgstr "Maksimalno 1 minuta"
#: src/components/systems-table/systems-table.tsx:195
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "Memorija"
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:456
#: src/components/routes/system.tsx:447
msgid "Memory Usage"
msgstr "Upotreba memorije"
#: src/components/routes/system.tsx:467
#: src/components/routes/system.tsx:458
msgid "Memory usage of docker containers"
msgstr "Upotreba memorije Docker spremnika"
#: src/components/add-system.tsx:155
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "Ime"
#: src/components/systems-table/systems-table.tsx:223
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "Mreža"
#: src/components/routes/system.tsx:508
#: src/components/routes/system.tsx:499
msgid "Network traffic of docker containers"
msgstr "Mrežni promet Docker spremnika"
#: src/components/routes/system.tsx:493
#: src/components/routes/system.tsx:484
msgid "Network traffic of public interfaces"
msgstr "Mrežni promet javnih sučelja"
@@ -491,34 +494,34 @@ msgstr "Mrežni promet javnih sučelja"
msgid "No results found."
msgstr "Nema rezultata."
#: src/components/systems-table/systems-table.tsx:472
#: src/components/systems-table/systems-table.tsx:495
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "Nije pronađen nijedan sustav."
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:76
#: src/components/routes/settings/layout.tsx:57
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
msgid "Notifications"
msgstr "Obavijesti"
#: src/components/login/auth-form.tsx:300
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "Podrška za OAuth 2 / OIDC"
#: src/components/routes/settings/config-yaml.tsx:62
#: src/components/routes/settings/config-yaml.tsx:61
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "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:639
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "Otvori menu"
#: src/components/login/auth-form.tsx:251
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "Ili nastavi sa"
#: src/components/alerts/alert-button.tsx:120
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "Prebrišite postojeća upozorenja"
@@ -530,41 +533,41 @@ msgstr "Stranica"
msgid "Pages / Settings"
msgstr "Stranice / Postavke"
#: src/components/login/auth-form.tsx:195
#: src/components/login/auth-form.tsx:200
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "Lozinka"
#: src/components/login/auth-form.tsx:21
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "Lozinka mora imati najmanje 8 znakova."
#: src/components/login/auth-form.tsx:22
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr ""
#: src/components/login/forgot-pass-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Zahtjev za ponovno postavljanje lozinke primljen"
#: src/components/systems-table/systems-table.tsx:672
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "Pauza"
#: src/components/systems-table/systems-table.tsx:143
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr ""
#: src/components/routes/settings/notifications.tsx:97
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "Molimo <0>konfigurirajte SMTP server</0> kako biste osigurali isporuku upozorenja."
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Za više detalja provjerite logove."
#: src/components/login/forgot-pass-form.tsx:17
#: src/components/login/auth-form.tsx:41
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "Provjerite svoje podatke i pokušajte ponovno"
@@ -572,7 +575,7 @@ msgstr "Provjerite svoje podatke i pokušajte ponovno"
msgid "Please create an admin account"
msgstr "Molimo kreirajte administratorski račun"
#: src/components/login/auth-form.tsx:138
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Omogućite skočne prozore za ovu stranicu"
@@ -580,7 +583,7 @@ msgstr "Omogućite skočne prozore za ovu stranicu"
msgid "Please log in again"
msgstr "Molimo prijavite se ponovno"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Molimo pogledajte <0>dokumentaciju</0> za instrukcije."
@@ -588,12 +591,12 @@ msgstr "Molimo pogledajte <0>dokumentaciju</0> za instrukcije."
msgid "Please sign in to your account"
msgstr "Molimo prijavite se u svoj račun"
#: src/components/add-system.tsx:171
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "Port"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:577
#: src/components/routes/system.tsx:448
#: src/components/routes/system.tsx:564
msgid "Precise utilization at the recorded time"
msgstr "Precizno iskorištenje u zabilježenom vremenu"
@@ -602,39 +605,39 @@ msgid "Preferred Language"
msgstr "Preferirani jezik"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:182
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "Javni Ključ"
#. Disk read
#: src/components/charts/area-chart.tsx:62
#: src/components/charts/area-chart.tsx:72
#: src/components/charts/area-chart.tsx:60
#: src/components/charts/area-chart.tsx:70
msgid "Read"
msgstr "Pročitaj"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx:67
#: src/components/charts/area-chart.tsx:65
msgid "Received"
msgstr "Primljeno"
#: src/components/login/forgot-pass-form.tsx:77
#: src/components/login/forgot-pass-form.tsx:76
msgid "Reset Password"
msgstr "Resetiraj Lozinku"
#: src/components/systems-table/systems-table.tsx:667
#: src/components/systems-table/systems-table.tsx:628
msgid "Resume"
msgstr "Nastavi"
#: src/components/routes/settings/notifications.tsx:119
#: src/components/routes/settings/notifications.tsx:118
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Spremite adresu pomoću tipke enter ili zareza. Ostavite prazno kako biste onemogućili obavijesti e-poštom."
#: src/components/routes/settings/notifications.tsx:169
#: src/components/routes/settings/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
msgid "Save Settings"
msgstr "Spremi Postavke"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr ""
@@ -646,12 +649,12 @@ msgstr "Pretraži"
msgid "Search for systems or settings..."
msgstr "Pretraži za sisteme ili postavke..."
#: src/components/alerts/alert-button.tsx:82
#: src/components/alerts/alert-button.tsx:71
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Pogledajte <0>postavke obavijesti</0> da biste konfigurirali način primanja upozorenja."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx:66
#: src/components/charts/area-chart.tsx:64
msgid "Sent"
msgstr "Poslano"
@@ -662,16 +665,16 @@ msgstr "Postavlja zadani vremenski raspon za grafikone kada se sustav gleda."
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:72
#: src/components/routes/settings/layout.tsx:83
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
msgstr "Postavke"
#: src/components/routes/settings/layout.tsx:34
#: src/components/routes/settings/layout.tsx:33
msgid "Settings saved"
msgstr "Postavke spremljene"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "Prijava"
@@ -679,7 +682,7 @@ msgstr "Prijava"
msgid "SMTP settings"
msgstr "SMTP postavke"
#: src/components/systems-table/systems-table.tsx:389
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "Sortiraj po"
@@ -687,18 +690,21 @@ msgstr "Sortiraj po"
msgid "Status"
msgstr "Status"
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:514
msgid "Swap space used by the system"
msgstr "Swap prostor uzet od strane sistema"
#: src/components/routes/system.tsx:522
#: src/components/routes/system.tsx:513
msgid "Swap Usage"
msgstr "Swap Iskorištenost"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:27
#: src/components/systems-table/systems-table.tsx:152
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "Sistem"
@@ -706,70 +712,70 @@ msgstr "Sistem"
msgid "Systems"
msgstr "Sistemi"
#: src/components/routes/settings/config-yaml.tsx:56
#: src/components/routes/settings/config-yaml.tsx:55
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "Sistemima se može upravljati u <0>config.yml</0> datoteci unutar data direktorija."
#: src/components/systems-table/systems-table.tsx:377
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "Tablica"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:244
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr ""
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:534
#: src/components/routes/system.tsx:525
msgid "Temperature"
msgstr "Temperatura"
#: src/components/routes/system.tsx:535
#: src/components/routes/system.tsx:526
msgid "Temperatures of system sensors"
msgstr "Temperature sistemskih senzora"
#: src/components/routes/settings/notifications.tsx:213
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Testni <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:184
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Testna obavijest poslana"
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:146
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "Agent mora biti pokrenut na sistemu da bi se spojio. Kopirajte instalacijske komande za agenta ispod."
#: src/components/add-system.tsx:138
#: src/components/add-system.tsx:137
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "Agent mora biti pokrenut na sistemu da bi se spojio. Kopirajte <0>docker-compose.yml</0> za agenta ispod."
#: src/components/login/forgot-pass-form.tsx:99
#: src/components/login/forgot-pass-form.tsx:98
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Zatim se prijavite u backend i resetirajte lozinku korisničkog računa u tablici korisnika."
#: src/components/systems-table/systems-table.tsx:699
#: src/components/systems-table/systems-table.tsx:660
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Ova radnja se ne može poništiti. Ovo će trajno izbrisati sve trenutne zapise za {name} iz baze podataka."
#: src/components/routes/system.tsx:615
#: src/components/routes/system.tsx:605
msgid "Throughput of {extraFsName}"
msgstr "Protok {extraFsName}"
#: src/components/routes/system.tsx:482
#: src/components/routes/system.tsx:473
msgid "Throughput of root filesystem"
msgstr "Protok root datotečnog sustava"
#: src/components/routes/settings/notifications.tsx:108
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "Primaoci e-pošte"
#: src/components/routes/system.tsx:409
#: src/components/routes/system.tsx:422
#: src/components/routes/system.tsx:400
#: src/components/routes/system.tsx:413
msgid "Toggle grid"
msgstr "Uključi/isključi rešetku"
#: src/components/mode-toggle.tsx:34
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "Uključi/isključi temu"
@@ -798,32 +804,32 @@ msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Pokreće se kada iskorištenost bilo kojeg diska premaši prag"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:343
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:334
msgid "Up"
msgstr ""
#: src/components/systems-table/systems-table.tsx:350
#: src/components/systems-table/systems-table.tsx:337
msgid "Updated in real time. Click on a system to view information."
msgstr "Ažurirano odmah. Kliknite na sistem za više informacija."
#: src/components/routes/system.tsx:270
#: src/components/routes/system.tsx:266
msgid "Uptime"
msgstr "Vrijeme rada"
#: src/components/routes/system.tsx:568
#: src/components/routes/system.tsx:602
#: src/components/charts/area-chart.tsx:75
#: src/components/routes/system.tsx:555
#: src/components/routes/system.tsx:592
#: src/components/charts/area-chart.tsx:73
msgid "Usage"
msgstr "Iskorištenost"
#: src/components/routes/system.tsx:474
#: src/components/routes/system.tsx:465
msgid "Usage of root partition"
msgstr "Iskorištenost root datotečnog sustava"
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:63
#: src/components/charts/area-chart.tsx:75
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "Iskorišteno"
@@ -832,15 +838,15 @@ msgstr "Iskorišteno"
msgid "Users"
msgstr "Korisnici"
#: src/components/systems-table/systems-table.tsx:359
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "Prikaz"
#: src/components/systems-table/systems-table.tsx:424
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "Vidljiva polja"
#: src/components/routes/system.tsx:707
#: src/components/routes/system.tsx:697
msgid "Waiting for enough records to display"
msgstr "Čeka se na više podataka prije prikaza"
@@ -848,24 +854,25 @@ msgstr "Čeka se na više podataka prije prikaza"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "Želite li nam pomoći da naše prijevode učinimo još boljim? Posjetite <0>Crowdin</0> za više detalja."
#: src/components/routes/settings/notifications.tsx:126
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / Push obavijest"
#. Disk write
#: src/components/charts/area-chart.tsx:61
#: src/components/charts/area-chart.tsx:71
#: src/components/charts/area-chart.tsx:59
#: src/components/charts/area-chart.tsx:69
msgid "Write"
msgstr "Piši"
#: src/components/routes/settings/layout.tsx:62
#: src/components/routes/settings/layout.tsx:61
msgid "YAML Config"
msgstr "YAML Config"
#: src/components/routes/settings/config-yaml.tsx:46
#: src/components/routes/settings/config-yaml.tsx:45
msgid "YAML Configuration"
msgstr "YAML Konfiguracija"
#: src/components/routes/settings/layout.tsx:35
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "Vaše korisničke postavke su ažurirane."

View File

@@ -19,11 +19,11 @@ msgstr ""
"X-Crowdin-File-ID: 16\n"
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:259
#: src/components/routes/system.tsx:255
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# nap} other {# nap}}"
#: src/components/routes/system.tsx:257
#: src/components/routes/system.tsx:253
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# óra} other {# óra}}"
@@ -48,27 +48,30 @@ msgid "30 days"
msgstr "30 nap"
#. Table column
#: src/components/systems-table/systems-table.tsx:304
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "Műveletek"
#: src/components/routes/home.tsx:94
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Aktív riasztások"
#: src/components/add-system.tsx:43
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Hozzáadás <0>System</0>"
#: src/components/add-system.tsx:126
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "Új rendszer hozzáadása"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Add system"
msgstr "Rendszer hozzáadása"
#: src/components/routes/settings/notifications.tsx:158
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "URL hozzáadása"
@@ -84,21 +87,21 @@ msgstr "Állítsa be a diagram megjelenítését."
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx:270
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "Ügynök"
#: src/components/alerts/alert-button.tsx:33
#: src/components/alerts/alert-button.tsx:79
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "Riasztások"
#: src/components/systems-table/systems-table.tsx:347
#: src/components/alerts/alert-button.tsx:99
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
msgid "All Systems"
msgstr "Minden rendszer"
#: src/components/systems-table/systems-table.tsx:696
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "Biztosan törölni szeretnéd {name}-t?"
@@ -106,29 +109,29 @@ msgstr "Biztosan törölni szeretnéd {name}-t?"
msgid "Automatic copy requires a secure context."
msgstr "Az automatikus másolás biztonságos környezetet igényel."
#: src/components/routes/system.tsx:670
#: src/components/routes/system.tsx:660
msgid "Average"
msgstr "Átlag"
#: src/components/routes/system.tsx:446
#: src/components/routes/system.tsx:437
msgid "Average CPU utilization of containers"
msgstr "Konténerek átlagos CPU kihasználtsága"
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:253
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Az átlag meghaladja a <0>{value}{0}</0> értéket"
#: src/components/routes/system.tsx:547
#: src/components/routes/system.tsx:538
msgid "Average power consumption of GPUs"
msgstr "GPU-k átlagos energiafogyasztása"
#: src/components/routes/system.tsx:435
#: src/components/routes/system.tsx:426
msgid "Average system-wide CPU utilization"
msgstr "Rendszerszintű CPU átlagos kihasználtság"
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:569
#: src/components/routes/system.tsx:556
msgid "Average utilization of {0}"
msgstr "{0} átlagos kihasználtsága"
@@ -138,31 +141,31 @@ msgid "Backups"
msgstr "Biztonsági mentések"
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:491
#: src/components/routes/system.tsx:482
msgid "Bandwidth"
msgstr "Sávszélesség"
#: src/components/login/auth-form.tsx:305
#: src/components/login/auth-form.tsx:306
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "A Beszel támogatja az OpenID Connect-et és számos OAuth2 hitelesítési szolgáltatót."
#: src/components/routes/settings/notifications.tsx:129
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "A Beszel a <0>Shoutrrr</0>-t használja a népszerű értesítési szolgáltatások integrálására."
#: src/components/add-system.tsx:131
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "Bináris"
#: src/components/charts/mem-chart.tsx:87
#: src/components/charts/mem-chart.tsx:89
msgid "Cache / Buffers"
msgstr "Gyorsítótár / Pufferelések"
#: src/components/systems-table/systems-table.tsx:707
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "Mégsem"
#: src/components/routes/settings/config-yaml.tsx:69
#: src/components/routes/settings/config-yaml.tsx:68
msgid "Caution - potential data loss"
msgstr "Figyelem - potenciális adatvesztés"
@@ -174,37 +177,37 @@ msgstr "Általános alkalmazásbeállítások módosítása."
msgid "Chart options"
msgstr "Diagram beállítások"
#: src/components/login/forgot-pass-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:34
msgid "Check {email} for a reset link."
msgstr "Ellenőrizd a {email} címet a visszaállító linkért."
#: src/components/routes/settings/layout.tsx:41
#: src/components/routes/settings/layout.tsx:40
msgid "Check logs for more details."
msgstr "Ellenőrizd a naplót a további részletekért."
#: src/components/routes/settings/notifications.tsx:185
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Ellenőrizd az értesítési szolgáltatásodat"
#: src/components/add-system.tsx:205
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "Kattints a másoláshoz"
#: src/components/login/forgot-pass-form.tsx:84
#: src/components/login/forgot-pass-form.tsx:90
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Parancssori utasítások"
#: src/components/routes/settings/notifications.tsx:79
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Konfiguráld, hogyan kapod az értesítéseket."
#: src/components/login/auth-form.tsx:213
#: src/components/login/auth-form.tsx:218
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "Jelszó megerősítése"
#: src/components/systems-table/systems-table.tsx:713
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "Tovább"
@@ -212,16 +215,16 @@ msgstr "Tovább"
msgid "Copied to clipboard"
msgstr "Vágólapra másolva"
#: src/components/add-system.tsx:216
#: src/components/add-system.tsx:218
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "Másolás"
#: src/components/systems-table/systems-table.tsx:678
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "Hoszt másolása"
#: src/components/add-system.tsx:225
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "Linux parancs másolása"
@@ -229,27 +232,27 @@ msgstr "Linux parancs másolása"
msgid "Copy text"
msgstr "Szöveg másolása"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "CPU"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:434
#: src/components/charts/area-chart.tsx:58
#: src/components/routes/system.tsx:425
#: src/components/charts/area-chart.tsx:56
msgid "CPU Usage"
msgstr "CPU használat"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "Fiók létrehozása"
#. Dark theme
#: src/components/mode-toggle.tsx:22
#: src/components/mode-toggle.tsx:21
msgid "Dark"
msgstr "Sötét"
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:36
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Áttekintés"
@@ -257,37 +260,37 @@ msgstr "Áttekintés"
msgid "Default time period"
msgstr "Alapértelmezett időszak"
#: src/components/systems-table/systems-table.tsx:683
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "Törlés"
#: src/components/systems-table/systems-table.tsx:204
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "Lemez"
#: src/components/routes/system.tsx:481
#: src/components/routes/system.tsx:472
msgid "Disk I/O"
msgstr "Lemez I/O"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:474
#: src/components/charts/disk-chart.tsx:77
#: src/components/routes/system.tsx:465
#: src/components/charts/disk-chart.tsx:79
msgid "Disk Usage"
msgstr "Lemezhasználat"
#: src/components/routes/system.tsx:603
#: src/components/routes/system.tsx:593
msgid "Disk usage of {extraFsName}"
msgstr "Lemezhasználat a {extraFsName}"
#: src/components/routes/system.tsx:445
#: src/components/routes/system.tsx:436
msgid "Docker CPU Usage"
msgstr "Docker CPU használat"
#: src/components/routes/system.tsx:466
#: src/components/routes/system.tsx:457
msgid "Docker Memory Usage"
msgstr "Docker memória használat"
#: src/components/routes/system.tsx:507
#: src/components/routes/system.tsx:498
msgid "Docker Network I/O"
msgstr "Docker hálózat I/O"
@@ -297,22 +300,22 @@ msgstr "Dokumentáció"
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:142
#: src/components/routes/system.tsx:345
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:336
msgid "Down"
msgstr ""
#: src/components/add-system.tsx:126
#: src/components/systems-table/systems-table.tsx:653
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr ""
#: src/components/login/forgot-pass-form.tsx:54
#: src/components/login/auth-form.tsx:176
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
msgid "Email"
msgstr "Email"
#: src/components/routes/settings/notifications.tsx:93
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "E-mail értesítések"
@@ -320,32 +323,32 @@ msgstr "E-mail értesítések"
msgid "Enter email address to reset password"
msgstr "E-mail cím megadása a jelszó visszaállításához"
#: src/components/routes/settings/notifications.tsx:113
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Adja meg az e-mail címet..."
#: src/components/routes/settings/notifications.tsx:189
#: src/components/routes/settings/config-yaml.tsx:29
#: src/components/login/auth-form.tsx:137
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "Hiba"
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: src/components/routes/home.tsx:113
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "Túllépi a {0}{1} értéket az elmúlt {2, plural, one {# percben} other {# percben}}"
#: src/components/routes/settings/config-yaml.tsx:73
#: src/components/routes/settings/config-yaml.tsx:72
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "A <0>config.yml</0> fájlban nem definiált meglévő rendszerek törlésre kerülnek. Kérjük, készítsen rendszeres biztonsági mentéseket."
#: src/components/routes/settings/config-yaml.tsx:94
#: src/components/routes/settings/config-yaml.tsx:93
msgid "Export configuration"
msgstr "Konfiguráció exportálása"
#: src/components/routes/settings/config-yaml.tsx:49
#: src/components/routes/settings/config-yaml.tsx:48
msgid "Export your current systems configuration."
msgstr "Exportálja a jelenlegi rendszerkonfigurációt."
@@ -353,60 +356,60 @@ msgstr "Exportálja a jelenlegi rendszerkonfigurációt."
msgid "Failed to authenticate"
msgstr "Hitelesítés sikertelen"
#: src/components/routes/settings/notifications.tsx:64
#: src/components/routes/settings/layout.tsx:40
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
msgid "Failed to save settings"
msgstr "Nem sikerült menteni a beállításokat"
#: src/components/routes/settings/notifications.tsx:190
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Teszt értesítés elküldése sikertelen"
#: src/components/alerts/alerts-system.tsx:26
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Nem sikerült frissíteni a riasztást"
#: src/components/systems-table/systems-table.tsx:354
#: src/components/routes/system.tsx:643
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:633
msgid "Filter..."
msgstr "Szűrő..."
#: src/components/alerts/alerts-system.tsx:285
#: src/components/alerts/alerts-system.tsx:230
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "A <0>{min}</0> {min, plural, one {perc} other {percek}}"
#: src/components/login/auth-form.tsx:328
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "Elfelejtette a jelszavát?"
#. Context: General settings
#: src/components/routes/settings/layout.tsx:52
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "Általános"
#: src/components/routes/system.tsx:546
#: src/components/routes/system.tsx:537
msgid "GPU Power Draw"
msgstr "GPU áramfelvétele"
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "Rács"
#: src/components/add-system.tsx:159
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "Állomás / IP"
#: src/components/login/forgot-pass-form.tsx:94
#: src/components/login/forgot-pass-form.tsx:93
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Ha elvesztette az admin fiók jelszavát, a következő paranccsal állíthatja vissza."
#: src/components/login/auth-form.tsx:18
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Érvénytelen e-mail cím."
#. Linux kernel
#: src/components/routes/system.tsx:271
#: src/components/routes/system.tsx:267
msgid "Kernel"
msgstr "Kernel"
@@ -414,12 +417,12 @@ msgstr "Kernel"
msgid "Language"
msgstr "Nyelv"
#: src/components/systems-table/systems-table.tsx:367
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "Elrendezés"
#. Light theme
#: src/components/mode-toggle.tsx:17
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Világos"
@@ -431,8 +434,8 @@ msgstr "Kijelentkezés"
msgid "Login"
msgstr "Bejelentkezés"
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "Bejelentkezés sikertelen"
@@ -441,49 +444,49 @@ msgstr "Bejelentkezés sikertelen"
msgid "Logs"
msgstr "Naplók"
#: src/components/routes/settings/notifications.tsx:82
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "Inkább azt keresi, hogy hol hozhat létre riasztásokat? Kattintson a csengő <0/> ikonokra a rendszerek táblázatában."
#: src/components/routes/settings/layout.tsx:86
#: src/components/routes/settings/layout.tsx:85
msgid "Manage display and notification preferences."
msgstr "A megjelenítési és értesítési beállítások kezelése."
#: src/components/add-system.tsx:227
#: src/components/add-system.tsx:226
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:673
#: src/components/routes/system.tsx:663
msgid "Max 1 min"
msgstr "Maximum 1 perc"
#: src/components/systems-table/systems-table.tsx:195
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "RAM"
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:456
#: src/components/routes/system.tsx:447
msgid "Memory Usage"
msgstr "Memóriahasználat"
#: src/components/routes/system.tsx:467
#: src/components/routes/system.tsx:458
msgid "Memory usage of docker containers"
msgstr "Docker konténerek memória használata"
#: src/components/add-system.tsx:155
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "Név"
#: src/components/systems-table/systems-table.tsx:223
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "Hálózat"
#: src/components/routes/system.tsx:508
#: src/components/routes/system.tsx:499
msgid "Network traffic of docker containers"
msgstr "Docker konténerek hálózati forgalma"
#: src/components/routes/system.tsx:493
#: src/components/routes/system.tsx:484
msgid "Network traffic of public interfaces"
msgstr "Nyilvános interfészek hálózati forgalma"
@@ -491,34 +494,34 @@ msgstr "Nyilvános interfészek hálózati forgalma"
msgid "No results found."
msgstr "Nincs találat."
#: src/components/systems-table/systems-table.tsx:472
#: src/components/systems-table/systems-table.tsx:495
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "Nem található rendszer."
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:76
#: src/components/routes/settings/layout.tsx:57
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
msgid "Notifications"
msgstr "Értesítések"
#: src/components/login/auth-form.tsx:300
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "OAuth 2 / OIDC támogatás"
#: src/components/routes/settings/config-yaml.tsx:62
#: src/components/routes/settings/config-yaml.tsx:61
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "Minden újraindításkor az adatbázisban lévő rendszerek frissítésre kerülnek, hogy megfeleljenek a fájlban meghatározott rendszereknek."
#: src/components/systems-table/systems-table.tsx:639
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "Menü megnyitása"
#: src/components/login/auth-form.tsx:251
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "Vagy folytasd ezzel"
#: src/components/alerts/alert-button.tsx:120
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "Felülírja a meglévő riasztásokat"
@@ -530,41 +533,41 @@ msgstr "Oldal"
msgid "Pages / Settings"
msgstr "Oldalak / Beállítások"
#: src/components/login/auth-form.tsx:195
#: src/components/login/auth-form.tsx:200
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "Jelszó"
#: src/components/login/auth-form.tsx:21
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "A jelszónak legalább 8 karakternek kell lennie."
#: src/components/login/auth-form.tsx:22
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr ""
#: src/components/login/forgot-pass-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Jelszó-visszaállítási kérelmet kaptunk"
#: src/components/systems-table/systems-table.tsx:672
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "Szüneteltetés"
#: src/components/systems-table/systems-table.tsx:143
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr ""
#: src/components/routes/settings/notifications.tsx:97
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "Kérjük, <0>konfigurálj egy SMTP szervert</0> az értesítések kézbesítésének biztosítása érdekében."
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Kérjük, ellenőrizd a naplókat a további részletekért."
#: src/components/login/forgot-pass-form.tsx:17
#: src/components/login/auth-form.tsx:41
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "Kérjük, ellenőrizze a hitelesítő adatait, és próbálja újra"
@@ -572,7 +575,7 @@ msgstr "Kérjük, ellenőrizze a hitelesítő adatait, és próbálja újra"
msgid "Please create an admin account"
msgstr "Kérjük, hozzon létre egy admin fiókot"
#: src/components/login/auth-form.tsx:138
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Kérjük, engedélyezze a felugró ablakokat ezen az oldalon"
@@ -580,7 +583,7 @@ msgstr "Kérjük, engedélyezze a felugró ablakokat ezen az oldalon"
msgid "Please log in again"
msgstr "Kérjük jelentkezz be újra"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Kérjük, nézze meg <0>a dokumentációt</0> az utasításokért."
@@ -588,12 +591,12 @@ msgstr "Kérjük, nézze meg <0>a dokumentációt</0> az utasításokért."
msgid "Please sign in to your account"
msgstr "Kérjük, jelentkezzen be a fiókjába"
#: src/components/add-system.tsx:171
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "Port"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:577
#: src/components/routes/system.tsx:448
#: src/components/routes/system.tsx:564
msgid "Precise utilization at the recorded time"
msgstr "Pontos kihasználás a rögzített időpontban"
@@ -602,39 +605,39 @@ msgid "Preferred Language"
msgstr "Preferált nyelv"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:182
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "Nyilvános kulcs"
#. Disk read
#: src/components/charts/area-chart.tsx:62
#: src/components/charts/area-chart.tsx:72
#: src/components/charts/area-chart.tsx:60
#: src/components/charts/area-chart.tsx:70
msgid "Read"
msgstr "Olvasás"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx:67
#: src/components/charts/area-chart.tsx:65
msgid "Received"
msgstr "Fogadott"
#: src/components/login/forgot-pass-form.tsx:77
#: src/components/login/forgot-pass-form.tsx:76
msgid "Reset Password"
msgstr "Jelszó visszaállítása"
#: src/components/systems-table/systems-table.tsx:667
#: src/components/systems-table/systems-table.tsx:628
msgid "Resume"
msgstr "Folytatás"
#: src/components/routes/settings/notifications.tsx:119
#: src/components/routes/settings/notifications.tsx:118
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Mentse el a címet az Enter billentyű vagy a vessző használatával. Hagyja üresen az e-mail értesítések letiltásához."
#: src/components/routes/settings/notifications.tsx:169
#: src/components/routes/settings/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
msgid "Save Settings"
msgstr "Beállítások mentése"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr ""
@@ -646,12 +649,12 @@ msgstr "Keresés"
msgid "Search for systems or settings..."
msgstr "Keresés rendszerek vagy beállítások után..."
#: src/components/alerts/alert-button.tsx:82
#: src/components/alerts/alert-button.tsx:71
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Lásd <0>az értesítési beállításokat</0>, hogy konfigurálja, hogyan kap értesítéseket."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx:66
#: src/components/charts/area-chart.tsx:64
msgid "Sent"
msgstr "Elküldve"
@@ -662,16 +665,16 @@ msgstr "Beállítja az alapértelmezett időtartamot a diagramokhoz, amikor egy
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:72
#: src/components/routes/settings/layout.tsx:83
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
msgstr "Beállítások"
#: src/components/routes/settings/layout.tsx:34
#: src/components/routes/settings/layout.tsx:33
msgid "Settings saved"
msgstr "Beállítások elmentve"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "Bejelentkezés"
@@ -679,7 +682,7 @@ msgstr "Bejelentkezés"
msgid "SMTP settings"
msgstr "SMTP beállítások"
#: src/components/systems-table/systems-table.tsx:389
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "Rendezés"
@@ -687,18 +690,21 @@ msgstr "Rendezés"
msgid "Status"
msgstr "Állapot"
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:514
msgid "Swap space used by the system"
msgstr "Rendszer által használt swap terület"
#: src/components/routes/system.tsx:522
#: src/components/routes/system.tsx:513
msgid "Swap Usage"
msgstr "Swap használat"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:27
#: src/components/systems-table/systems-table.tsx:152
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "Rendszer"
@@ -706,70 +712,70 @@ msgstr "Rendszer"
msgid "Systems"
msgstr "Rendszer"
#: src/components/routes/settings/config-yaml.tsx:56
#: src/components/routes/settings/config-yaml.tsx:55
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "A rendszereket egy <0>config.yml</0> fájlban lehet kezelni az adatkönyvtárban."
#: src/components/systems-table/systems-table.tsx:377
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "Tábla"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:244
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr ""
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:534
#: src/components/routes/system.tsx:525
msgid "Temperature"
msgstr "Hőmérséklet"
#: src/components/routes/system.tsx:535
#: src/components/routes/system.tsx:526
msgid "Temperatures of system sensors"
msgstr "A rendszer érzékelőinek hőmérséklete"
#: src/components/routes/settings/notifications.tsx:213
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Teszt <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:184
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Teszt értesítés elküldve"
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:146
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "A csatlakozáshoz az ügynöknek futnia kell a rendszerben. Másolja ki az alábbi telepítési parancsot az ügynök telepítéséhez."
#: src/components/add-system.tsx:138
#: src/components/add-system.tsx:137
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "A csatlakozáshoz az ügynöknek futnia kell a rendszerben. Másolja az<0>docker-compose.yml</0> fájlt az ügynök futtatásához."
#: src/components/login/forgot-pass-form.tsx:99
#: src/components/login/forgot-pass-form.tsx:98
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Ezután jelentkezzen be a backendbe, és állítsa vissza a felhasználói fiók jelszavát a felhasználók táblázatban."
#: src/components/systems-table/systems-table.tsx:699
#: src/components/systems-table/systems-table.tsx:660
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Ezt a műveletet nem lehet visszavonni! Véglegesen törli a {name} összes jelenlegi rekordját az adatbázisból!"
#: src/components/routes/system.tsx:615
#: src/components/routes/system.tsx:605
msgid "Throughput of {extraFsName}"
msgstr "A {extraFsName} átviteli teljesítménye"
#: src/components/routes/system.tsx:482
#: src/components/routes/system.tsx:473
msgid "Throughput of root filesystem"
msgstr "A gyökér fájlrendszer átviteli teljesítménye"
#: src/components/routes/settings/notifications.tsx:108
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "E-mailben"
#: src/components/routes/system.tsx:409
#: src/components/routes/system.tsx:422
#: src/components/routes/system.tsx:400
#: src/components/routes/system.tsx:413
msgid "Toggle grid"
msgstr "Rács ki- és bekapcsolása"
#: src/components/mode-toggle.tsx:34
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "Téma váltása"
@@ -798,32 +804,32 @@ msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Bekapcsol, ha a lemez érzékelő túllép egy küszöbértéket"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:343
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:334
msgid "Up"
msgstr ""
#: src/components/systems-table/systems-table.tsx:350
#: src/components/systems-table/systems-table.tsx:337
msgid "Updated in real time. Click on a system to view information."
msgstr "Valós időben frissítve. Kattintson egy rendszerre az információk megtekintéséhez."
#: src/components/routes/system.tsx:270
#: src/components/routes/system.tsx:266
msgid "Uptime"
msgstr "Üzemidő"
#: src/components/routes/system.tsx:568
#: src/components/routes/system.tsx:602
#: src/components/charts/area-chart.tsx:75
#: src/components/routes/system.tsx:555
#: src/components/routes/system.tsx:592
#: src/components/charts/area-chart.tsx:73
msgid "Usage"
msgstr "Használat"
#: src/components/routes/system.tsx:474
#: src/components/routes/system.tsx:465
msgid "Usage of root partition"
msgstr "Root partíció kihasználtsága"
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:63
#: src/components/charts/area-chart.tsx:75
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "Felhasznált"
@@ -832,15 +838,15 @@ msgstr "Felhasznált"
msgid "Users"
msgstr "Felhasználók"
#: src/components/systems-table/systems-table.tsx:359
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "Nézet"
#: src/components/systems-table/systems-table.tsx:424
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "Látható mezők"
#: src/components/routes/system.tsx:707
#: src/components/routes/system.tsx:697
msgid "Waiting for enough records to display"
msgstr "Elegendő rekordra várva a megjelenítéshez"
@@ -848,24 +854,25 @@ msgstr "Elegendő rekordra várva a megjelenítéshez"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "Szeretne segíteni nekünk abban, hogy fordításaink még jobbak legyenek? További részletekért nézze meg a <0>Crowdin</0> honlapot."
#: src/components/routes/settings/notifications.tsx:126
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / Push értesítések"
#. Disk write
#: src/components/charts/area-chart.tsx:61
#: src/components/charts/area-chart.tsx:71
#: src/components/charts/area-chart.tsx:59
#: src/components/charts/area-chart.tsx:69
msgid "Write"
msgstr "Írás"
#: src/components/routes/settings/layout.tsx:62
#: src/components/routes/settings/layout.tsx:61
msgid "YAML Config"
msgstr "YAML konfiguráció"
#: src/components/routes/settings/config-yaml.tsx:46
#: src/components/routes/settings/config-yaml.tsx:45
msgid "YAML Configuration"
msgstr "YAML konfiguráció"
#: src/components/routes/settings/layout.tsx:35
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "A felhasználói beállítások frissítésre kerültek."

View File

@@ -19,11 +19,11 @@ msgstr ""
"X-Crowdin-File-ID: 16\n"
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:259
#: src/components/routes/system.tsx:255
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# dagur} other {# dagar}}"
#: src/components/routes/system.tsx:257
#: src/components/routes/system.tsx:253
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# klukkustund} other {# klukkustundir}}"
@@ -48,27 +48,30 @@ msgid "30 days"
msgstr "30 dagar"
#. Table column
#: src/components/systems-table/systems-table.tsx:304
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "Aðgerðir"
#: src/components/routes/home.tsx:94
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Virkar tilkynningar"
#: src/components/add-system.tsx:43
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Bæta við <0>Kerfi</0>"
#: src/components/add-system.tsx:126
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "Bæta við nýju kerfi"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Add system"
msgstr "Bæta við kerfi"
#: src/components/routes/settings/notifications.tsx:158
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Bæta við léni"
@@ -84,21 +87,21 @@ msgstr ""
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx:270
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr ""
#: src/components/alerts/alert-button.tsx:33
#: src/components/alerts/alert-button.tsx:79
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "Tilkynningar"
#: src/components/systems-table/systems-table.tsx:347
#: src/components/alerts/alert-button.tsx:99
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
msgid "All Systems"
msgstr "Öll kerfi"
#: src/components/systems-table/systems-table.tsx:696
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "Ertu viss um að þú viljir eyða {name}?"
@@ -106,29 +109,29 @@ msgstr "Ertu viss um að þú viljir eyða {name}?"
msgid "Automatic copy requires a secure context."
msgstr "Sjálfvisk afritun krefst öruggs samhengis."
#: src/components/routes/system.tsx:670
#: src/components/routes/system.tsx:660
msgid "Average"
msgstr "Meðal"
#: src/components/routes/system.tsx:446
#: src/components/routes/system.tsx:437
msgid "Average CPU utilization of containers"
msgstr "Meðal örgjörva notkun container-a."
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:253
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Meðaltal er yfir <0>{value}{0}</0>"
#: src/components/routes/system.tsx:547
#: src/components/routes/system.tsx:538
msgid "Average power consumption of GPUs"
msgstr "Meðal orkunotkun skjákorta"
#: src/components/routes/system.tsx:435
#: src/components/routes/system.tsx:426
msgid "Average system-wide CPU utilization"
msgstr "Meðal nýting örgjörva yfir allt kerfið"
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:569
#: src/components/routes/system.tsx:556
msgid "Average utilization of {0}"
msgstr "Meðal notkun af {0}"
@@ -138,31 +141,31 @@ msgid "Backups"
msgstr "Öryggisafrit"
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:491
#: src/components/routes/system.tsx:482
msgid "Bandwidth"
msgstr "Gangnaflutningsgeta"
#: src/components/login/auth-form.tsx:305
#: src/components/login/auth-form.tsx:306
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel styður OpenID Connect og margar OAuth2 auðkenningarveitendur."
#: src/components/routes/settings/notifications.tsx:129
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel notar <0>Shoutrrr</0> til að tengjast vinsælum tilkynningaþjónustum."
#: src/components/add-system.tsx:131
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "Binary"
#: src/components/charts/mem-chart.tsx:87
#: src/components/charts/mem-chart.tsx:89
msgid "Cache / Buffers"
msgstr "Skyndiminni / Biðminni"
#: src/components/systems-table/systems-table.tsx:707
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "Hætta við"
#: src/components/routes/settings/config-yaml.tsx:69
#: src/components/routes/settings/config-yaml.tsx:68
msgid "Caution - potential data loss"
msgstr "Aðvörun - möguleiki á gagnatapi"
@@ -174,37 +177,37 @@ msgstr "Breyta almennum stillingum."
msgid "Chart options"
msgstr "Valkostir fyrir línurit"
#: src/components/login/forgot-pass-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:34
msgid "Check {email} for a reset link."
msgstr "Skoðaðu {email} fyrir endurstillingar lén."
#: src/components/routes/settings/layout.tsx:41
#: src/components/routes/settings/layout.tsx:40
msgid "Check logs for more details."
msgstr "Skoðaðu logga til að sjá meiri upplýsingar."
#: src/components/routes/settings/notifications.tsx:185
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Athugaðu tilkynningaþjónustuna þína"
#: src/components/add-system.tsx:205
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "Smelltu til að afrita"
#: src/components/login/forgot-pass-form.tsx:84
#: src/components/login/forgot-pass-form.tsx:90
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Skipanalínu leiðbeiningar"
#: src/components/routes/settings/notifications.tsx:79
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Stilltu hvernig þú vilt fá tilkynningar."
#: src/components/login/auth-form.tsx:213
#: src/components/login/auth-form.tsx:218
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "Staðfestu lykilorð"
#: src/components/systems-table/systems-table.tsx:713
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "Halda áfram"
@@ -212,16 +215,16 @@ msgstr "Halda áfram"
msgid "Copied to clipboard"
msgstr "Afritað í klippiborð"
#: src/components/add-system.tsx:216
#: src/components/add-system.tsx:218
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "Afrita"
#: src/components/systems-table/systems-table.tsx:678
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "Afrita host"
#: src/components/add-system.tsx:225
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "Afrita Linux aðgerð"
@@ -229,27 +232,27 @@ msgstr "Afrita Linux aðgerð"
msgid "Copy text"
msgstr "Afrita texta"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "Örgjörvi"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:434
#: src/components/charts/area-chart.tsx:58
#: src/components/routes/system.tsx:425
#: src/components/charts/area-chart.tsx:56
msgid "CPU Usage"
msgstr "Örgjörva notkun"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "Búa til aðgang"
#. Dark theme
#: src/components/mode-toggle.tsx:22
#: src/components/mode-toggle.tsx:21
msgid "Dark"
msgstr "Dökkt"
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:36
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Yfirlitssíða"
@@ -257,37 +260,37 @@ msgstr "Yfirlitssíða"
msgid "Default time period"
msgstr "Sjálfgefið tímabil"
#: src/components/systems-table/systems-table.tsx:683
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "Eyða"
#: src/components/systems-table/systems-table.tsx:204
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "Diskur"
#: src/components/routes/system.tsx:481
#: src/components/routes/system.tsx:472
msgid "Disk I/O"
msgstr ""
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:474
#: src/components/charts/disk-chart.tsx:77
#: src/components/routes/system.tsx:465
#: src/components/charts/disk-chart.tsx:79
msgid "Disk Usage"
msgstr "Diskanotkun"
#: src/components/routes/system.tsx:603
#: src/components/routes/system.tsx:593
msgid "Disk usage of {extraFsName}"
msgstr "Diska notkun af {extraFsName}"
#: src/components/routes/system.tsx:445
#: src/components/routes/system.tsx:436
msgid "Docker CPU Usage"
msgstr "Docker CPU notkun"
#: src/components/routes/system.tsx:466
#: src/components/routes/system.tsx:457
msgid "Docker Memory Usage"
msgstr "Minnisnotkun Docker"
#: src/components/routes/system.tsx:507
#: src/components/routes/system.tsx:498
msgid "Docker Network I/O"
msgstr ""
@@ -297,22 +300,22 @@ msgstr "Skjal"
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:142
#: src/components/routes/system.tsx:345
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:336
msgid "Down"
msgstr ""
#: src/components/add-system.tsx:126
#: src/components/systems-table/systems-table.tsx:653
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr ""
#: src/components/login/forgot-pass-form.tsx:54
#: src/components/login/auth-form.tsx:176
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
msgid "Email"
msgstr "Netfang"
#: src/components/routes/settings/notifications.tsx:93
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "Tilkynningar í tölvupósti"
@@ -320,32 +323,32 @@ msgstr "Tilkynningar í tölvupósti"
msgid "Enter email address to reset password"
msgstr "Settu netfang til að endursetja lykilorð"
#: src/components/routes/settings/notifications.tsx:113
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Settu inn Netfang..."
#: src/components/routes/settings/notifications.tsx:189
#: src/components/routes/settings/config-yaml.tsx:29
#: src/components/login/auth-form.tsx:137
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "Villa"
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: src/components/routes/home.tsx:113
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "Fór yfir {0}{1} á síðustu {2, plural, one {# mínútu} other {# mínútum}}"
#: src/components/routes/settings/config-yaml.tsx:73
#: src/components/routes/settings/config-yaml.tsx:72
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr ""
#: src/components/routes/settings/config-yaml.tsx:94
#: src/components/routes/settings/config-yaml.tsx:93
msgid "Export configuration"
msgstr ""
#: src/components/routes/settings/config-yaml.tsx:49
#: src/components/routes/settings/config-yaml.tsx:48
msgid "Export your current systems configuration."
msgstr ""
@@ -353,60 +356,60 @@ msgstr ""
msgid "Failed to authenticate"
msgstr "Villa í auðkenningu"
#: src/components/routes/settings/notifications.tsx:64
#: src/components/routes/settings/layout.tsx:40
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
msgid "Failed to save settings"
msgstr "Villa við að vista stillingar"
#: src/components/routes/settings/notifications.tsx:190
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Villa í sendingu prufu skilaboða"
#: src/components/alerts/alerts-system.tsx:26
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Mistókst að uppfæra tilkynningu"
#: src/components/systems-table/systems-table.tsx:354
#: src/components/routes/system.tsx:643
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:633
msgid "Filter..."
msgstr "Sía..."
#: src/components/alerts/alerts-system.tsx:285
#: src/components/alerts/alerts-system.tsx:230
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr ""
#: src/components/login/auth-form.tsx:328
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "Gleymt lykilorð?"
#. Context: General settings
#: src/components/routes/settings/layout.tsx:52
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "Almennt"
#: src/components/routes/system.tsx:546
#: src/components/routes/system.tsx:537
msgid "GPU Power Draw"
msgstr "Skjákorts rafmagnsnotkun"
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr ""
#: src/components/add-system.tsx:159
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "Host / IP"
#: src/components/login/forgot-pass-form.tsx:94
#: src/components/login/forgot-pass-form.tsx:93
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr ""
#: src/components/login/auth-form.tsx:18
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Ógilt netfang."
#. Linux kernel
#: src/components/routes/system.tsx:271
#: src/components/routes/system.tsx:267
msgid "Kernel"
msgstr ""
@@ -414,12 +417,12 @@ msgstr ""
msgid "Language"
msgstr "Tungumál"
#: src/components/systems-table/systems-table.tsx:367
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr ""
#. Light theme
#: src/components/mode-toggle.tsx:17
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Ljóst"
@@ -431,8 +434,8 @@ msgstr "Útskrá"
msgid "Login"
msgstr "Innskrá"
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "Innskránings tilraun misheppnaðist"
@@ -441,49 +444,49 @@ msgstr "Innskránings tilraun misheppnaðist"
msgid "Logs"
msgstr "Loggar"
#: src/components/routes/settings/notifications.tsx:82
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr ""
#: src/components/routes/settings/layout.tsx:86
#: src/components/routes/settings/layout.tsx:85
msgid "Manage display and notification preferences."
msgstr ""
#: src/components/add-system.tsx:227
#: src/components/add-system.tsx:226
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:673
#: src/components/routes/system.tsx:663
msgid "Max 1 min"
msgstr "Mest 1 mínúta"
#: src/components/systems-table/systems-table.tsx:195
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "Minni"
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:456
#: src/components/routes/system.tsx:447
msgid "Memory Usage"
msgstr "Minnisnotkun"
#: src/components/routes/system.tsx:467
#: src/components/routes/system.tsx:458
msgid "Memory usage of docker containers"
msgstr "Minnisnotkun docker kerfa"
#: src/components/add-system.tsx:155
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "Nafn"
#: src/components/systems-table/systems-table.tsx:223
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "Net"
#: src/components/routes/system.tsx:508
#: src/components/routes/system.tsx:499
msgid "Network traffic of docker containers"
msgstr "Net traffík docker kerfa"
#: src/components/routes/system.tsx:493
#: src/components/routes/system.tsx:484
msgid "Network traffic of public interfaces"
msgstr ""
@@ -491,34 +494,34 @@ msgstr ""
msgid "No results found."
msgstr "Engar niðurstöður fundust."
#: src/components/systems-table/systems-table.tsx:472
#: src/components/systems-table/systems-table.tsx:495
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "Engin kerfi fundust."
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:76
#: src/components/routes/settings/layout.tsx:57
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
msgid "Notifications"
msgstr "Tilkynningar"
#: src/components/login/auth-form.tsx:300
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "OAuth 2 / OIDC stuðningur"
#: src/components/routes/settings/config-yaml.tsx:62
#: src/components/routes/settings/config-yaml.tsx:61
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr ""
#: src/components/systems-table/systems-table.tsx:639
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "Opna valmynd"
#: src/components/login/auth-form.tsx:251
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "Eða halda áfram með"
#: src/components/alerts/alert-button.tsx:120
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "Yfirskrifa núverandi tilkynningu"
@@ -530,41 +533,41 @@ msgstr "Síða"
msgid "Pages / Settings"
msgstr "Síða / Stillingar"
#: src/components/login/auth-form.tsx:195
#: src/components/login/auth-form.tsx:200
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "Lykilorð"
#: src/components/login/auth-form.tsx:21
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "Lykilorðið verður að vera minnst 8 stafir."
#: src/components/login/auth-form.tsx:22
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr ""
#: src/components/login/forgot-pass-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Beiðni um að endurstilla lykilorð móttekin"
#: src/components/systems-table/systems-table.tsx:672
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "Pása"
#: src/components/systems-table/systems-table.tsx:143
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr ""
#: src/components/routes/settings/notifications.tsx:97
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr ""
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Skoðaðu logga til að sjá meiri upplýsingar."
#: src/components/login/forgot-pass-form.tsx:17
#: src/components/login/auth-form.tsx:41
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "Vinsamlegast farðu yfir upplýsingarnar þínar og reyndu aftur"
@@ -572,7 +575,7 @@ msgstr "Vinsamlegast farðu yfir upplýsingarnar þínar og reyndu aftur"
msgid "Please create an admin account"
msgstr "Vinsamlegast búðu til admin aðgang"
#: src/components/login/auth-form.tsx:138
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr ""
@@ -580,7 +583,7 @@ msgstr ""
msgid "Please log in again"
msgstr "Vinsamlegast skráðu þið inn aftur"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Vinsamlegast skoðaðu <0>skjölin</0> fyrir leiðbeiningar."
@@ -588,12 +591,12 @@ msgstr "Vinsamlegast skoðaðu <0>skjölin</0> fyrir leiðbeiningar."
msgid "Please sign in to your account"
msgstr "Vinsamlegast skráðu þig inn á aðganginn þinn"
#: src/components/add-system.tsx:171
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "Port"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:577
#: src/components/routes/system.tsx:448
#: src/components/routes/system.tsx:564
msgid "Precise utilization at the recorded time"
msgstr ""
@@ -602,39 +605,39 @@ msgid "Preferred Language"
msgstr "Valið tungumál"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:182
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "Dreifilykill"
#. Disk read
#: src/components/charts/area-chart.tsx:62
#: src/components/charts/area-chart.tsx:72
#: src/components/charts/area-chart.tsx:60
#: src/components/charts/area-chart.tsx:70
msgid "Read"
msgstr "Lesa"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx:67
#: src/components/charts/area-chart.tsx:65
msgid "Received"
msgstr "Móttekið"
#: src/components/login/forgot-pass-form.tsx:77
#: src/components/login/forgot-pass-form.tsx:76
msgid "Reset Password"
msgstr "Endurstilla lykilorð"
#: src/components/systems-table/systems-table.tsx:667
#: src/components/systems-table/systems-table.tsx:628
msgid "Resume"
msgstr "Halda áfram"
#: src/components/routes/settings/notifications.tsx:119
#: src/components/routes/settings/notifications.tsx:118
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr ""
#: src/components/routes/settings/notifications.tsx:169
#: src/components/routes/settings/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
msgid "Save Settings"
msgstr "Vista stillingar"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr ""
@@ -646,12 +649,12 @@ msgstr "Leita"
msgid "Search for systems or settings..."
msgstr "Leita að kerfum eða stillingum..."
#: src/components/alerts/alert-button.tsx:82
#: src/components/alerts/alert-button.tsx:71
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr ""
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx:66
#: src/components/charts/area-chart.tsx:64
msgid "Sent"
msgstr "Sent"
@@ -662,16 +665,16 @@ msgstr ""
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:72
#: src/components/routes/settings/layout.tsx:83
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
msgstr "Stillingar"
#: src/components/routes/settings/layout.tsx:34
#: src/components/routes/settings/layout.tsx:33
msgid "Settings saved"
msgstr "Stillingar vistaðar"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "Innskrá"
@@ -679,7 +682,7 @@ msgstr "Innskrá"
msgid "SMTP settings"
msgstr "SMTP stillingar"
#: src/components/systems-table/systems-table.tsx:389
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "Raða eftir"
@@ -687,18 +690,21 @@ msgstr "Raða eftir"
msgid "Status"
msgstr "Staða"
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:514
msgid "Swap space used by the system"
msgstr ""
#: src/components/routes/system.tsx:522
#: src/components/routes/system.tsx:513
msgid "Swap Usage"
msgstr "Skipti minni"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:27
#: src/components/systems-table/systems-table.tsx:152
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "Kerfi"
@@ -706,70 +712,70 @@ msgstr "Kerfi"
msgid "Systems"
msgstr "Kerfi"
#: src/components/routes/settings/config-yaml.tsx:56
#: src/components/routes/settings/config-yaml.tsx:55
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr ""
#: src/components/systems-table/systems-table.tsx:377
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "Tafla"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:244
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr ""
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:534
#: src/components/routes/system.tsx:525
msgid "Temperature"
msgstr "Hitastig"
#: src/components/routes/system.tsx:535
#: src/components/routes/system.tsx:526
msgid "Temperatures of system sensors"
msgstr "Hitastig kerfa skynjara"
#: src/components/routes/settings/notifications.tsx:213
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Prufa <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:184
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Prufu tilkynning send"
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:146
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr ""
#: src/components/add-system.tsx:138
#: src/components/add-system.tsx:137
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr ""
#: src/components/login/forgot-pass-form.tsx:99
#: src/components/login/forgot-pass-form.tsx:98
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Skráðu þig þá inní bakendann og endurstilltu lykilorðið þitt inni í notenda töflunni."
#: src/components/systems-table/systems-table.tsx:699
#: src/components/systems-table/systems-table.tsx:660
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Þessi aðgerð er óafturkvæmanleg. Þetta mun eyða gögnum fyrir {name} varanlega úr gagnagrunninum."
#: src/components/routes/system.tsx:615
#: src/components/routes/system.tsx:605
msgid "Throughput of {extraFsName}"
msgstr ""
#: src/components/routes/system.tsx:482
#: src/components/routes/system.tsx:473
msgid "Throughput of root filesystem"
msgstr ""
#: src/components/routes/settings/notifications.tsx:108
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "Til tölvupósta"
#: src/components/routes/system.tsx:409
#: src/components/routes/system.tsx:422
#: src/components/routes/system.tsx:400
#: src/components/routes/system.tsx:413
msgid "Toggle grid"
msgstr ""
#: src/components/mode-toggle.tsx:34
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "Velja þema"
@@ -798,32 +804,32 @@ msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Virkjast þegar diska notkun fer yfir þröskuld"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:343
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:334
msgid "Up"
msgstr ""
#: src/components/systems-table/systems-table.tsx:350
#: src/components/systems-table/systems-table.tsx:337
msgid "Updated in real time. Click on a system to view information."
msgstr "Uppfærist í rauntíma. Veldu kerfi til að skoða upplýsingar."
#: src/components/routes/system.tsx:270
#: src/components/routes/system.tsx:266
msgid "Uptime"
msgstr ""
#: src/components/routes/system.tsx:568
#: src/components/routes/system.tsx:602
#: src/components/charts/area-chart.tsx:75
#: src/components/routes/system.tsx:555
#: src/components/routes/system.tsx:592
#: src/components/charts/area-chart.tsx:73
msgid "Usage"
msgstr ""
#: src/components/routes/system.tsx:474
#: src/components/routes/system.tsx:465
msgid "Usage of root partition"
msgstr ""
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:63
#: src/components/charts/area-chart.tsx:75
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "Notað"
@@ -832,15 +838,15 @@ msgstr "Notað"
msgid "Users"
msgstr "Notendur"
#: src/components/systems-table/systems-table.tsx:359
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "Skoða"
#: src/components/systems-table/systems-table.tsx:424
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "Sjáanlegir reitir"
#: src/components/routes/system.tsx:707
#: src/components/routes/system.tsx:697
msgid "Waiting for enough records to display"
msgstr "Bíður eftir nægum upplýsingum til að sýna"
@@ -848,24 +854,25 @@ msgstr "Bíður eftir nægum upplýsingum til að sýna"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr ""
#: src/components/routes/settings/notifications.tsx:126
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / Tilkynningar"
#. Disk write
#: src/components/charts/area-chart.tsx:61
#: src/components/charts/area-chart.tsx:71
#: src/components/charts/area-chart.tsx:59
#: src/components/charts/area-chart.tsx:69
msgid "Write"
msgstr "Skrifa"
#: src/components/routes/settings/layout.tsx:62
#: src/components/routes/settings/layout.tsx:61
msgid "YAML Config"
msgstr ""
#: src/components/routes/settings/config-yaml.tsx:46
#: src/components/routes/settings/config-yaml.tsx:45
msgid "YAML Configuration"
msgstr ""
#: src/components/routes/settings/layout.tsx:35
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "Notenda stillingar vistaðar."

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: it\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-03-06 07:27\n"
"PO-Revision-Date: 2025-03-22 15:29\n"
"Last-Translator: \n"
"Language-Team: Italian\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -300,12 +300,12 @@ msgstr "Documentazione"
#: src/components/systems-table/systems-table.tsx:142
#: src/components/routes/system.tsx:345
msgid "Down"
msgstr ""
msgstr "Offline"
#: src/components/add-system.tsx:126
#: src/components/systems-table/systems-table.tsx:653
msgid "Edit"
msgstr ""
msgstr "Modifica"
#: src/components/login/forgot-pass-form.tsx:54
#: src/components/login/auth-form.tsx:176
@@ -451,7 +451,7 @@ msgstr "Gestisci le preferenze di visualizzazione e notifica."
#: src/components/add-system.tsx:227
msgid "Manual setup instructions"
msgstr ""
msgstr "Istruzioni di configurazione manuale"
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:673
@@ -541,7 +541,7 @@ msgstr "La password deve contenere almeno 8 caratteri."
#: src/components/login/auth-form.tsx:22
msgid "Password must be less than 72 bytes."
msgstr ""
msgstr "La password deve essere inferiore a 72 byte."
#: src/components/login/forgot-pass-form.tsx:34
msgid "Password reset request received"
@@ -553,7 +553,7 @@ msgstr "Pausa"
#: src/components/systems-table/systems-table.tsx:143
msgid "Paused"
msgstr ""
msgstr "In pausa"
#: src/components/routes/settings/notifications.tsx:97
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
@@ -636,7 +636,7 @@ msgstr "Salva Impostazioni"
#: src/components/add-system.tsx:232
msgid "Save system"
msgstr ""
msgstr "Salva sistema"
#: src/components/navbar.tsx:134
msgid "Search"
@@ -717,7 +717,7 @@ msgstr "Tabella"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:244
msgid "Temp"
msgstr ""
msgstr "Temperatura"
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:534
@@ -801,7 +801,7 @@ msgstr "Attiva quando l'utilizzo di un disco supera una soglia"
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:343
msgid "Up"
msgstr ""
msgstr "Attivo"
#: src/components/systems-table/systems-table.tsx:350
msgid "Updated in real time. Click on a system to view information."
@@ -869,3 +869,4 @@ msgstr "Configurazione YAML"
#: src/components/routes/settings/layout.tsx:35
msgid "Your user settings have been updated."
msgstr "Le impostazioni utente sono state aggiornate."

View File

@@ -19,11 +19,11 @@ msgstr ""
"X-Crowdin-File-ID: 16\n"
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:259
#: src/components/routes/system.tsx:258
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# 日} other {# 日}}"
#: src/components/routes/system.tsx:257
#: src/components/routes/system.tsx:256
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# 時間} other {# 時間}}"
@@ -48,27 +48,30 @@ msgid "30 days"
msgstr "30日間"
#. Table column
#: src/components/systems-table/systems-table.tsx:304
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "アクション"
#: src/components/routes/home.tsx:94
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "アクティブなアラート"
#: src/components/add-system.tsx:43
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "<0>システム</0>を追加"
#: src/components/add-system.tsx:126
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "新しいシステムを追加"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Add system"
msgstr "システムを追加"
#: src/components/routes/settings/notifications.tsx:158
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "URLを追加"
@@ -84,21 +87,21 @@ msgstr "チャートの表示オプションを調整します。"
msgid "Admin"
msgstr "管理者"
#: src/components/systems-table/systems-table.tsx:270
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "エージェント"
#: src/components/alerts/alert-button.tsx:33
#: src/components/alerts/alert-button.tsx:79
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "アラート"
#: src/components/systems-table/systems-table.tsx:347
#: src/components/alerts/alert-button.tsx:99
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
msgid "All Systems"
msgstr "すべてのシステム"
#: src/components/systems-table/systems-table.tsx:696
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "{name}を削除してもよろしいですか?"
@@ -106,29 +109,29 @@ msgstr "{name}を削除してもよろしいですか?"
msgid "Automatic copy requires a secure context."
msgstr "自動コピーには安全なコンテキストが必要です。"
#: src/components/routes/system.tsx:670
#: src/components/routes/system.tsx:668
msgid "Average"
msgstr "平均"
#: src/components/routes/system.tsx:446
#: src/components/routes/system.tsx:445
msgid "Average CPU utilization of containers"
msgstr "コンテナの平均CPU使用率"
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:253
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "平均が<0>{value}{0}</0>を超えています"
#: src/components/routes/system.tsx:547
#: src/components/routes/system.tsx:546
msgid "Average power consumption of GPUs"
msgstr "GPUの平均消費電力"
#: src/components/routes/system.tsx:435
#: src/components/routes/system.tsx:434
msgid "Average system-wide CPU utilization"
msgstr "システム全体の平均CPU使用率"
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:569
#: src/components/routes/system.tsx:564
msgid "Average utilization of {0}"
msgstr "{0}の平均使用率"
@@ -138,31 +141,31 @@ msgid "Backups"
msgstr "バックアップ"
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:491
#: src/components/routes/system.tsx:490
msgid "Bandwidth"
msgstr "帯域幅"
#: src/components/login/auth-form.tsx:305
#: src/components/login/auth-form.tsx:306
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "BeszelはOpenID Connectと多くのOAuth2認証プロバイダーをサポートしています。"
#: src/components/routes/settings/notifications.tsx:129
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszelは<0>Shoutrrr</0>を使用して、人気のある通知サービスと統合します。"
#: src/components/add-system.tsx:131
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "バイナリ"
#: src/components/charts/mem-chart.tsx:87
#: src/components/charts/mem-chart.tsx:89
msgid "Cache / Buffers"
msgstr "キャッシュ / バッファ"
#: src/components/systems-table/systems-table.tsx:707
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "キャンセル"
#: src/components/routes/settings/config-yaml.tsx:69
#: src/components/routes/settings/config-yaml.tsx:68
msgid "Caution - potential data loss"
msgstr "注意 - データ損失の可能性"
@@ -174,37 +177,37 @@ msgstr "一般的なアプリケーションオプションを変更します。
msgid "Chart options"
msgstr "チャートオプション"
#: src/components/login/forgot-pass-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:34
msgid "Check {email} for a reset link."
msgstr "{email}を確認してリセットリンクを探してください。"
#: src/components/routes/settings/layout.tsx:41
#: src/components/routes/settings/layout.tsx:40
msgid "Check logs for more details."
msgstr "詳細についてはログを確認してください。"
#: src/components/routes/settings/notifications.tsx:185
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "通知サービスを確認してください"
#: src/components/add-system.tsx:205
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "クリックしてコピー"
#: src/components/login/forgot-pass-form.tsx:84
#: src/components/login/forgot-pass-form.tsx:90
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "コマンドラインの指示"
#: src/components/routes/settings/notifications.tsx:79
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "アラート通知の受信方法を設定します。"
#: src/components/login/auth-form.tsx:213
#: src/components/login/auth-form.tsx:218
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "パスワードを確認"
#: src/components/systems-table/systems-table.tsx:713
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "続行"
@@ -212,16 +215,16 @@ msgstr "続行"
msgid "Copied to clipboard"
msgstr "クリップボードにコピーされました"
#: src/components/add-system.tsx:216
#: src/components/add-system.tsx:218
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "コピー"
#: src/components/systems-table/systems-table.tsx:678
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "ホストをコピー"
#: src/components/add-system.tsx:225
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "Linuxコマンドをコピー"
@@ -229,27 +232,27 @@ msgstr "Linuxコマンドをコピー"
msgid "Copy text"
msgstr "テキストをコピー"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "CPU"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:434
#: src/components/charts/area-chart.tsx:58
#: src/components/routes/system.tsx:433
#: src/components/charts/area-chart.tsx:56
msgid "CPU Usage"
msgstr "CPU使用率"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "アカウントを作成"
#. Dark theme
#: src/components/mode-toggle.tsx:22
#: src/components/mode-toggle.tsx:21
msgid "Dark"
msgstr "ダーク"
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:36
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "ダッシュボード"
@@ -257,37 +260,37 @@ msgstr "ダッシュボード"
msgid "Default time period"
msgstr "デフォルトの期間"
#: src/components/systems-table/systems-table.tsx:683
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "削除"
#: src/components/systems-table/systems-table.tsx:204
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "ディスク"
#: src/components/routes/system.tsx:481
#: src/components/routes/system.tsx:480
msgid "Disk I/O"
msgstr "ディスクI/O"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:474
#: src/components/charts/disk-chart.tsx:77
#: src/components/routes/system.tsx:473
#: src/components/charts/disk-chart.tsx:79
msgid "Disk Usage"
msgstr "ディスク使用率"
#: src/components/routes/system.tsx:603
#: src/components/routes/system.tsx:601
msgid "Disk usage of {extraFsName}"
msgstr "{extraFsName}のディスク使用率"
#: src/components/routes/system.tsx:445
#: src/components/routes/system.tsx:444
msgid "Docker CPU Usage"
msgstr "Docker CPU使用率"
#: src/components/routes/system.tsx:466
#: src/components/routes/system.tsx:465
msgid "Docker Memory Usage"
msgstr "Dockerメモリ使用率"
#: src/components/routes/system.tsx:507
#: src/components/routes/system.tsx:506
msgid "Docker Network I/O"
msgstr "DockerネットワークI/O"
@@ -297,22 +300,22 @@ msgstr "ドキュメント"
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:142
#: src/components/routes/system.tsx:345
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:344
msgid "Down"
msgstr "停止"
#: src/components/add-system.tsx:126
#: src/components/systems-table/systems-table.tsx:653
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr "編集"
#: src/components/login/forgot-pass-form.tsx:54
#: src/components/login/auth-form.tsx:176
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
msgid "Email"
msgstr "メール"
#: src/components/routes/settings/notifications.tsx:93
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "メール通知"
@@ -320,32 +323,32 @@ msgstr "メール通知"
msgid "Enter email address to reset password"
msgstr "パスワードをリセットするためにメールアドレスを入力してください"
#: src/components/routes/settings/notifications.tsx:113
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "メールアドレスを入力..."
#: src/components/routes/settings/notifications.tsx:189
#: src/components/routes/settings/config-yaml.tsx:29
#: src/components/login/auth-form.tsx:137
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "エラー"
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: src/components/routes/home.tsx:113
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "過去{2, plural, one {# 分} other {# 分}}で{0}{1}を超えています"
#: src/components/routes/settings/config-yaml.tsx:73
#: src/components/routes/settings/config-yaml.tsx:72
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "<0>config.yml</0>に定義されていない既存のシステムは削除されます。定期的にバックアップを作成してください。"
#: src/components/routes/settings/config-yaml.tsx:94
#: src/components/routes/settings/config-yaml.tsx:93
msgid "Export configuration"
msgstr "設定をエクスポート"
#: src/components/routes/settings/config-yaml.tsx:49
#: src/components/routes/settings/config-yaml.tsx:48
msgid "Export your current systems configuration."
msgstr "現在のシステム設定をエクスポートします。"
@@ -353,60 +356,60 @@ msgstr "現在のシステム設定をエクスポートします。"
msgid "Failed to authenticate"
msgstr "認証に失敗しました"
#: src/components/routes/settings/notifications.tsx:64
#: src/components/routes/settings/layout.tsx:40
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
msgid "Failed to save settings"
msgstr "設定の保存に失敗しました"
#: src/components/routes/settings/notifications.tsx:190
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "テスト通知の送信に失敗しました"
#: src/components/alerts/alerts-system.tsx:26
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "アラートの更新に失敗しました"
#: src/components/systems-table/systems-table.tsx:354
#: src/components/routes/system.tsx:643
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:641
msgid "Filter..."
msgstr "フィルター..."
#: src/components/alerts/alerts-system.tsx:285
#: src/components/alerts/alerts-system.tsx:230
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "<0>{min}</0> {min, plural, one {分} other {分}}の間"
#: src/components/login/auth-form.tsx:328
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "パスワードをお忘れですか?"
#. Context: General settings
#: src/components/routes/settings/layout.tsx:52
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "一般"
#: src/components/routes/system.tsx:546
#: src/components/routes/system.tsx:545
msgid "GPU Power Draw"
msgstr "GPUの消費電力"
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "グリッド"
#: src/components/add-system.tsx:159
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "ホスト / IP"
#: src/components/login/forgot-pass-form.tsx:94
#: src/components/login/forgot-pass-form.tsx:93
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "管理者アカウントのパスワードを忘れた場合は、次のコマンドを使用してリセットできます。"
#: src/components/login/auth-form.tsx:18
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "無効なメールアドレスです。"
#. Linux kernel
#: src/components/routes/system.tsx:271
#: src/components/routes/system.tsx:270
msgid "Kernel"
msgstr "カーネル"
@@ -414,12 +417,12 @@ msgstr "カーネル"
msgid "Language"
msgstr "言語"
#: src/components/systems-table/systems-table.tsx:367
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "レイアウト"
#. Light theme
#: src/components/mode-toggle.tsx:17
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "ライト"
@@ -431,8 +434,8 @@ msgstr "ログアウト"
msgid "Login"
msgstr "ログイン"
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "ログイン試行に失敗しました"
@@ -441,49 +444,49 @@ msgstr "ログイン試行に失敗しました"
msgid "Logs"
msgstr "ログ"
#: src/components/routes/settings/notifications.tsx:82
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "アラートを作成する場所を探していますか?システムテーブルのベル<0/>アイコンをクリックしてください。"
#: src/components/routes/settings/layout.tsx:86
#: src/components/routes/settings/layout.tsx:85
msgid "Manage display and notification preferences."
msgstr "表示と通知の設定を管理します。"
#: src/components/add-system.tsx:227
#: src/components/add-system.tsx:226
msgid "Manual setup instructions"
msgstr "手動セットアップの手順"
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:673
#: src/components/routes/system.tsx:671
msgid "Max 1 min"
msgstr "最大1分"
#: src/components/systems-table/systems-table.tsx:195
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "メモリ"
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:456
#: src/components/routes/system.tsx:455
msgid "Memory Usage"
msgstr "メモリ使用率"
#: src/components/routes/system.tsx:467
#: src/components/routes/system.tsx:466
msgid "Memory usage of docker containers"
msgstr "Dockerコンテナのメモリ使用率"
#: src/components/add-system.tsx:155
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "名前"
#: src/components/systems-table/systems-table.tsx:223
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "帯域"
#: src/components/routes/system.tsx:508
#: src/components/routes/system.tsx:507
msgid "Network traffic of docker containers"
msgstr "Dockerコンテナのネットワークトラフィック"
#: src/components/routes/system.tsx:493
#: src/components/routes/system.tsx:492
msgid "Network traffic of public interfaces"
msgstr "パブリックインターフェースのネットワークトラフィック"
@@ -491,34 +494,34 @@ msgstr "パブリックインターフェースのネットワークトラフィ
msgid "No results found."
msgstr "結果が見つかりませんでした。"
#: src/components/systems-table/systems-table.tsx:472
#: src/components/systems-table/systems-table.tsx:495
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "システムが見つかりませんでした。"
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:76
#: src/components/routes/settings/layout.tsx:57
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
msgid "Notifications"
msgstr "通知"
#: src/components/login/auth-form.tsx:300
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "OAuth 2 / OIDCサポート"
#: src/components/routes/settings/config-yaml.tsx:62
#: src/components/routes/settings/config-yaml.tsx:61
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "再起動のたびに、データベース内のシステムはファイルに定義されたシステムに一致するように更新されます。"
#: src/components/systems-table/systems-table.tsx:639
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "メニューを開く"
#: src/components/login/auth-form.tsx:251
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "または、以下の方法でログイン"
#: src/components/alerts/alert-button.tsx:120
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "既存のアラートを上書き"
@@ -530,41 +533,41 @@ msgstr "ページ"
msgid "Pages / Settings"
msgstr "ページ / 設定"
#: src/components/login/auth-form.tsx:195
#: src/components/login/auth-form.tsx:200
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "パスワード"
#: src/components/login/auth-form.tsx:21
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "パスワードは8文字以上である必要があります。"
#: src/components/login/auth-form.tsx:22
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr "パスワードは72バイト未満でなければなりません。"
#: src/components/login/forgot-pass-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "パスワードリセットのリクエストを受け取りました"
#: src/components/systems-table/systems-table.tsx:672
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "一時停止"
#: src/components/systems-table/systems-table.tsx:143
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr "一時停止中"
#: src/components/routes/settings/notifications.tsx:97
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "アラートが配信されるように<0>SMTPサーバーを設定</0>してください。"
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "詳細についてはログを確認してください。"
#: src/components/login/forgot-pass-form.tsx:17
#: src/components/login/auth-form.tsx:41
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "資格情報を確認して再試行してください"
@@ -572,7 +575,7 @@ msgstr "資格情報を確認して再試行してください"
msgid "Please create an admin account"
msgstr "管理者アカウントを作成してください"
#: src/components/login/auth-form.tsx:138
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "このサイトのポップアップを有効にしてください"
@@ -580,7 +583,7 @@ msgstr "このサイトのポップアップを有効にしてください"
msgid "Please log in again"
msgstr "再度ログインしてください"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "手順については<0>ドキュメント</0>を参照してください。"
@@ -588,12 +591,12 @@ msgstr "手順については<0>ドキュメント</0>を参照してくださ
msgid "Please sign in to your account"
msgstr "アカウントにサインインしてください"
#: src/components/add-system.tsx:171
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "ポート"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:577
#: src/components/routes/system.tsx:456
#: src/components/routes/system.tsx:572
msgid "Precise utilization at the recorded time"
msgstr "記録された時点での正確な利用"
@@ -602,39 +605,39 @@ msgid "Preferred Language"
msgstr "優先言語"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:182
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "公開鍵"
#. Disk read
#: src/components/charts/area-chart.tsx:62
#: src/components/charts/area-chart.tsx:72
#: src/components/charts/area-chart.tsx:60
#: src/components/charts/area-chart.tsx:70
msgid "Read"
msgstr "読み取り"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx:67
#: src/components/charts/area-chart.tsx:65
msgid "Received"
msgstr "受信"
#: src/components/login/forgot-pass-form.tsx:77
#: src/components/login/forgot-pass-form.tsx:76
msgid "Reset Password"
msgstr "パスワードをリセット"
#: src/components/systems-table/systems-table.tsx:667
#: src/components/systems-table/systems-table.tsx:628
msgid "Resume"
msgstr "再開"
#: src/components/routes/settings/notifications.tsx:119
#: src/components/routes/settings/notifications.tsx:118
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Enterキーまたはカンマを使用してアドレスを保存します。空白のままにするとメール通知が無効になります。"
#: src/components/routes/settings/notifications.tsx:169
#: src/components/routes/settings/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
msgid "Save Settings"
msgstr "設定を保存"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr "システムを保存"
@@ -646,12 +649,12 @@ msgstr "検索"
msgid "Search for systems or settings..."
msgstr "システムまたは設定を検索..."
#: src/components/alerts/alert-button.tsx:82
#: src/components/alerts/alert-button.tsx:71
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "アラートの受信方法を設定するには<0>通知設定</0>を参照してください。"
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx:66
#: src/components/charts/area-chart.tsx:64
msgid "Sent"
msgstr "送信"
@@ -662,16 +665,16 @@ msgstr "システムを表示する際のチャートのデフォルトの時間
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:72
#: src/components/routes/settings/layout.tsx:83
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
msgstr "設定"
#: src/components/routes/settings/layout.tsx:34
#: src/components/routes/settings/layout.tsx:33
msgid "Settings saved"
msgstr "設定が保存されました"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "サインイン"
@@ -679,7 +682,7 @@ msgstr "サインイン"
msgid "SMTP settings"
msgstr "SMTP設定"
#: src/components/systems-table/systems-table.tsx:389
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "並び替え基準"
@@ -687,18 +690,21 @@ msgstr "並び替え基準"
msgid "Status"
msgstr "ステータス"
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:522
msgid "Swap space used by the system"
msgstr "システムが使用するスワップ領域"
#: src/components/routes/system.tsx:522
#: src/components/routes/system.tsx:521
msgid "Swap Usage"
msgstr "スワップ使用量"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:27
#: src/components/systems-table/systems-table.tsx:152
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "システム"
@@ -706,70 +712,70 @@ msgstr "システム"
msgid "Systems"
msgstr "システム"
#: src/components/routes/settings/config-yaml.tsx:56
#: src/components/routes/settings/config-yaml.tsx:55
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "システムはデータディレクトリ内の<0>config.yml</0>ファイルで管理できます。"
#: src/components/systems-table/systems-table.tsx:377
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "テーブル"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:244
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr "温度"
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:534
#: src/components/routes/system.tsx:533
msgid "Temperature"
msgstr "温度"
#: src/components/routes/system.tsx:535
#: src/components/routes/system.tsx:534
msgid "Temperatures of system sensors"
msgstr "システムセンサーの温度"
#: src/components/routes/settings/notifications.tsx:213
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "テスト<0>URL</0>"
#: src/components/routes/settings/notifications.tsx:184
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "テスト通知が送信されました"
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:146
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "接続するにはエージェントがシステム上で実行されている必要があります。以下のエージェントのインストールコマンドをコピーしてください。"
#: src/components/add-system.tsx:138
#: src/components/add-system.tsx:137
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "接続するにはエージェントがシステム上で実行されている必要があります。以下のエージェント用<0>docker-compose.yml</0>をコピーしてください。"
#: src/components/login/forgot-pass-form.tsx:99
#: src/components/login/forgot-pass-form.tsx:98
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "その後、バックエンドにログインして、ユーザーテーブルでユーザーアカウントのパスワードをリセットしてください。"
#: src/components/systems-table/systems-table.tsx:699
#: src/components/systems-table/systems-table.tsx:660
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "この操作は元に戻せません。これにより、データベースから{name}のすべての現在のレコードが永久に削除されます。"
#: src/components/routes/system.tsx:615
#: src/components/routes/system.tsx:613
msgid "Throughput of {extraFsName}"
msgstr "{extraFsName}のスループット"
#: src/components/routes/system.tsx:482
#: src/components/routes/system.tsx:481
msgid "Throughput of root filesystem"
msgstr "ルートファイルシステムのスループット"
#: src/components/routes/settings/notifications.tsx:108
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "宛先メールアドレス"
#: src/components/routes/system.tsx:409
#: src/components/routes/system.tsx:422
#: src/components/routes/system.tsx:408
#: src/components/routes/system.tsx:421
msgid "Toggle grid"
msgstr "グリッドを切り替え"
#: src/components/mode-toggle.tsx:34
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "テーマを切り替え"
@@ -798,32 +804,32 @@ msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "ディスクの使用量がしきい値を超えたときにトリガーされます"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:343
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:342
msgid "Up"
msgstr "正常"
#: src/components/systems-table/systems-table.tsx:350
#: src/components/systems-table/systems-table.tsx:337
msgid "Updated in real time. Click on a system to view information."
msgstr "リアルタイムで更新されます。システムをクリックして情報を表示します。"
#: src/components/routes/system.tsx:270
#: src/components/routes/system.tsx:269
msgid "Uptime"
msgstr "稼働時間"
#: src/components/routes/system.tsx:568
#: src/components/routes/system.tsx:602
#: src/components/charts/area-chart.tsx:75
#: src/components/routes/system.tsx:563
#: src/components/routes/system.tsx:600
#: src/components/charts/area-chart.tsx:73
msgid "Usage"
msgstr "使用量"
#: src/components/routes/system.tsx:474
#: src/components/routes/system.tsx:473
msgid "Usage of root partition"
msgstr "ルートパーティションの使用量"
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:63
#: src/components/charts/area-chart.tsx:75
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "使用中"
@@ -832,15 +838,15 @@ msgstr "使用中"
msgid "Users"
msgstr "ユーザー"
#: src/components/systems-table/systems-table.tsx:359
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "表示"
#: src/components/systems-table/systems-table.tsx:424
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "表示列"
#: src/components/routes/system.tsx:707
#: src/components/routes/system.tsx:705
msgid "Waiting for enough records to display"
msgstr "表示するのに十分なレコードを待っています"
@@ -848,24 +854,25 @@ msgstr "表示するのに十分なレコードを待っています"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "翻訳をさらに良くするためにご協力いただけますか?詳細については<0>Crowdin</0>をご覧ください。"
#: src/components/routes/settings/notifications.tsx:126
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / プッシュ通知"
#. Disk write
#: src/components/charts/area-chart.tsx:61
#: src/components/charts/area-chart.tsx:71
#: src/components/charts/area-chart.tsx:59
#: src/components/charts/area-chart.tsx:69
msgid "Write"
msgstr "書き込み"
#: src/components/routes/settings/layout.tsx:62
#: src/components/routes/settings/layout.tsx:61
msgid "YAML Config"
msgstr "YAML設定"
#: src/components/routes/settings/config-yaml.tsx:46
#: src/components/routes/settings/config-yaml.tsx:45
msgid "YAML Configuration"
msgstr "YAML設定"
#: src/components/routes/settings/layout.tsx:35
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "ユーザー設定が更新されました。"

View File

@@ -19,11 +19,11 @@ msgstr ""
"X-Crowdin-File-ID: 16\n"
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:259
#: src/components/routes/system.tsx:258
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# 일} other {# 일}}"
#: src/components/routes/system.tsx:257
#: src/components/routes/system.tsx:256
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# 시간} other {# 시간}}"
@@ -48,27 +48,30 @@ msgid "30 days"
msgstr "30일"
#. Table column
#: src/components/systems-table/systems-table.tsx:304
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "작업"
#: src/components/routes/home.tsx:94
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "활성화된 알림들"
#: src/components/add-system.tsx:43
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "<0>시스템</0> 추가"
#: src/components/add-system.tsx:126
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "새 시스템 추가"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Add system"
msgstr "시스템 추가"
#: src/components/routes/settings/notifications.tsx:158
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "URL 추가"
@@ -84,21 +87,21 @@ msgstr "차트 표시 옵션 변경."
msgid "Admin"
msgstr "관리자"
#: src/components/systems-table/systems-table.tsx:270
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "에이전트"
#: src/components/alerts/alert-button.tsx:33
#: src/components/alerts/alert-button.tsx:79
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "알림"
#: src/components/systems-table/systems-table.tsx:347
#: src/components/alerts/alert-button.tsx:99
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
msgid "All Systems"
msgstr "모든 시스템"
#: src/components/systems-table/systems-table.tsx:696
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "{name}을(를) 삭제하시겠습니까?"
@@ -106,29 +109,29 @@ msgstr "{name}을(를) 삭제하시겠습니까?"
msgid "Automatic copy requires a secure context."
msgstr "자동 복사는 안전한 컨텍스트가 필요합니다."
#: src/components/routes/system.tsx:670
#: src/components/routes/system.tsx:668
msgid "Average"
msgstr "평균"
#: src/components/routes/system.tsx:446
#: src/components/routes/system.tsx:445
msgid "Average CPU utilization of containers"
msgstr "컨테이너의 평균 CPU 사용량"
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:253
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "평균이 <0>{value}{0}</0>을(를) 초과합니다"
#: src/components/routes/system.tsx:547
#: src/components/routes/system.tsx:546
msgid "Average power consumption of GPUs"
msgstr "GPU들의 평균 전원 사용량"
#: src/components/routes/system.tsx:435
#: src/components/routes/system.tsx:434
msgid "Average system-wide CPU utilization"
msgstr "시스템 전체의 평균 CPU 사용량"
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:569
#: src/components/routes/system.tsx:564
msgid "Average utilization of {0}"
msgstr "평균 {0} 사용량"
@@ -138,31 +141,31 @@ msgid "Backups"
msgstr "백업"
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:491
#: src/components/routes/system.tsx:490
msgid "Bandwidth"
msgstr "대역폭"
#: src/components/login/auth-form.tsx:305
#: src/components/login/auth-form.tsx:306
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel은 OpenID Connect 및 많은 OAuth2 인증 제공자를 지원합니다."
#: src/components/routes/settings/notifications.tsx:129
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel은 여러 인기 있는 알림 서비스와 연동하기 위해 <0>Shoutrrr</0>을 이용합니다."
#: src/components/add-system.tsx:131
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "실행 파일"
#: src/components/charts/mem-chart.tsx:87
#: src/components/charts/mem-chart.tsx:89
msgid "Cache / Buffers"
msgstr "캐시 / 버퍼"
#: src/components/systems-table/systems-table.tsx:707
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "취소"
#: src/components/routes/settings/config-yaml.tsx:69
#: src/components/routes/settings/config-yaml.tsx:68
msgid "Caution - potential data loss"
msgstr "주의 - 데이터 손실 가능성"
@@ -174,37 +177,37 @@ msgstr "일반 애플리케이션 옵션 변경."
msgid "Chart options"
msgstr "차트 옵션"
#: src/components/login/forgot-pass-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:34
msgid "Check {email} for a reset link."
msgstr "{email}에서 재설정 링크를 확인하세요."
#: src/components/routes/settings/layout.tsx:41
#: src/components/routes/settings/layout.tsx:40
msgid "Check logs for more details."
msgstr "자세한 내용은 로그를 확인하세요."
#: src/components/routes/settings/notifications.tsx:185
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "알림 서비스를 확인하세요."
#: src/components/add-system.tsx:205
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "클릭하여 복사"
#: src/components/login/forgot-pass-form.tsx:84
#: src/components/login/forgot-pass-form.tsx:90
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "명령어 사용 지침"
#: src/components/routes/settings/notifications.tsx:79
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "알림을 수신할 방법을 설정하세요."
#: src/components/login/auth-form.tsx:213
#: src/components/login/auth-form.tsx:218
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "비밀번호 확인"
#: src/components/systems-table/systems-table.tsx:713
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "계속"
@@ -212,16 +215,16 @@ msgstr "계속"
msgid "Copied to clipboard"
msgstr "클립보드에 복사됨"
#: src/components/add-system.tsx:216
#: src/components/add-system.tsx:218
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "복사"
#: src/components/systems-table/systems-table.tsx:678
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "호스트 복사"
#: src/components/add-system.tsx:225
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "리눅스 명령어 복사"
@@ -229,27 +232,27 @@ msgstr "리눅스 명령어 복사"
msgid "Copy text"
msgstr "텍스트 복사"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "CPU"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:434
#: src/components/charts/area-chart.tsx:58
#: src/components/routes/system.tsx:433
#: src/components/charts/area-chart.tsx:56
msgid "CPU Usage"
msgstr "CPU 사용량"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "계정 생성"
#. Dark theme
#: src/components/mode-toggle.tsx:22
#: src/components/mode-toggle.tsx:21
msgid "Dark"
msgstr "어둡게"
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:36
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "대시보드"
@@ -257,37 +260,37 @@ msgstr "대시보드"
msgid "Default time period"
msgstr "기본 기간"
#: src/components/systems-table/systems-table.tsx:683
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "삭제"
#: src/components/systems-table/systems-table.tsx:204
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "디스크"
#: src/components/routes/system.tsx:481
#: src/components/routes/system.tsx:480
msgid "Disk I/O"
msgstr "디스크 I/O"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:474
#: src/components/charts/disk-chart.tsx:77
#: src/components/routes/system.tsx:473
#: src/components/charts/disk-chart.tsx:79
msgid "Disk Usage"
msgstr "디스크 사용량"
#: src/components/routes/system.tsx:603
#: src/components/routes/system.tsx:601
msgid "Disk usage of {extraFsName}"
msgstr "{extraFsName}의 디스크 사용량"
#: src/components/routes/system.tsx:445
#: src/components/routes/system.tsx:444
msgid "Docker CPU Usage"
msgstr "Docker CPU 사용량"
#: src/components/routes/system.tsx:466
#: src/components/routes/system.tsx:465
msgid "Docker Memory Usage"
msgstr "Docker 메모리 사용량"
#: src/components/routes/system.tsx:507
#: src/components/routes/system.tsx:506
msgid "Docker Network I/O"
msgstr "Docker 네트워크 I/O"
@@ -297,22 +300,22 @@ msgstr "문서"
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:142
#: src/components/routes/system.tsx:345
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:344
msgid "Down"
msgstr "오프라인"
#: src/components/add-system.tsx:126
#: src/components/systems-table/systems-table.tsx:653
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr "수정"
#: src/components/login/forgot-pass-form.tsx:54
#: src/components/login/auth-form.tsx:176
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
msgid "Email"
msgstr "이메일"
#: src/components/routes/settings/notifications.tsx:93
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "이메일 알림"
@@ -320,32 +323,32 @@ msgstr "이메일 알림"
msgid "Enter email address to reset password"
msgstr "비밀번호를 재설정하려면 이메일 주소를 입력하세요"
#: src/components/routes/settings/notifications.tsx:113
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "이메일 주소 입력..."
#: src/components/routes/settings/notifications.tsx:189
#: src/components/routes/settings/config-yaml.tsx:29
#: src/components/login/auth-form.tsx:137
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "오류"
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: src/components/routes/home.tsx:113
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "마지막 {2, plural, one {# 분} other {# 분}} 동안 {0}{1} 초과"
#: src/components/routes/settings/config-yaml.tsx:73
#: src/components/routes/settings/config-yaml.tsx:72
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "<0>config.yml</0>에 정의되지 않은 기존 시스템은 삭제됩니다. 정기적으로 백업을 하세요."
#: src/components/routes/settings/config-yaml.tsx:94
#: src/components/routes/settings/config-yaml.tsx:93
msgid "Export configuration"
msgstr "구성 내보내기"
#: src/components/routes/settings/config-yaml.tsx:49
#: src/components/routes/settings/config-yaml.tsx:48
msgid "Export your current systems configuration."
msgstr "현재 시스템 구성 내보내기"
@@ -353,60 +356,60 @@ msgstr "현재 시스템 구성 내보내기"
msgid "Failed to authenticate"
msgstr "인증 실패"
#: src/components/routes/settings/notifications.tsx:64
#: src/components/routes/settings/layout.tsx:40
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
msgid "Failed to save settings"
msgstr "설정 저장 실패"
#: src/components/routes/settings/notifications.tsx:190
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "테스트 알림 전송 실패"
#: src/components/alerts/alerts-system.tsx:26
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "알림 수정 실패"
#: src/components/systems-table/systems-table.tsx:354
#: src/components/routes/system.tsx:643
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:641
msgid "Filter..."
msgstr "필터..."
#: src/components/alerts/alerts-system.tsx:285
#: src/components/alerts/alerts-system.tsx:230
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "<0>{min}</0> {min, plural, one {분} other {분}} 동안"
#: src/components/login/auth-form.tsx:328
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "비밀번호를 잊으셨나요?"
#. Context: General settings
#: src/components/routes/settings/layout.tsx:52
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "일반"
#: src/components/routes/system.tsx:546
#: src/components/routes/system.tsx:545
msgid "GPU Power Draw"
msgstr "GPU 전원 사용량"
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "그리드"
#: src/components/add-system.tsx:159
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "호스트 / IP"
#: src/components/login/forgot-pass-form.tsx:94
#: src/components/login/forgot-pass-form.tsx:93
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "관리자 계정의 비밀번호를 잃어버린 경우, 다음 명령어를 사용하여 재설정할 수 있습니다."
#: src/components/login/auth-form.tsx:18
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "잘못된 이메일 주소입니다."
#. Linux kernel
#: src/components/routes/system.tsx:271
#: src/components/routes/system.tsx:270
msgid "Kernel"
msgstr "커널"
@@ -414,12 +417,12 @@ msgstr "커널"
msgid "Language"
msgstr "언어"
#: src/components/systems-table/systems-table.tsx:367
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "레이아웃"
#. Light theme
#: src/components/mode-toggle.tsx:17
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "밝게"
@@ -431,8 +434,8 @@ msgstr "로그아웃"
msgid "Login"
msgstr "로그인"
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "로그인 실패"
@@ -441,49 +444,49 @@ msgstr "로그인 실패"
msgid "Logs"
msgstr "로그"
#: src/components/routes/settings/notifications.tsx:82
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "알림을 생성하려 하시나요? 시스템 테이블의 종 <0/> 아이콘을 클릭하세요."
#: src/components/routes/settings/layout.tsx:86
#: src/components/routes/settings/layout.tsx:85
msgid "Manage display and notification preferences."
msgstr "디스플레이 및 알림 설정"
#: src/components/add-system.tsx:227
#: src/components/add-system.tsx:226
msgid "Manual setup instructions"
msgstr "수동 설정 방법"
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:673
#: src/components/routes/system.tsx:671
msgid "Max 1 min"
msgstr "1분간 최댓값"
#: src/components/systems-table/systems-table.tsx:195
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "메모리"
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:456
#: src/components/routes/system.tsx:455
msgid "Memory Usage"
msgstr "메모리 사용량"
#: src/components/routes/system.tsx:467
#: src/components/routes/system.tsx:466
msgid "Memory usage of docker containers"
msgstr "Docker 컨테이너의 메모리 사용량"
#: src/components/add-system.tsx:155
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "이름"
#: src/components/systems-table/systems-table.tsx:223
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "네트워크"
#: src/components/routes/system.tsx:508
#: src/components/routes/system.tsx:507
msgid "Network traffic of docker containers"
msgstr "Docker 컨테이너의 네트워크 트래픽"
#: src/components/routes/system.tsx:493
#: src/components/routes/system.tsx:492
msgid "Network traffic of public interfaces"
msgstr "공용 인터페이스의 네트워크 트래픽"
@@ -491,34 +494,34 @@ msgstr "공용 인터페이스의 네트워크 트래픽"
msgid "No results found."
msgstr "결과가 없습니다."
#: src/components/systems-table/systems-table.tsx:472
#: src/components/systems-table/systems-table.tsx:495
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "시스템을 찾을 수 없습니다."
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:76
#: src/components/routes/settings/layout.tsx:57
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
msgid "Notifications"
msgstr "알림"
#: src/components/login/auth-form.tsx:300
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "OAuth 2 / OIDC 지원"
#: src/components/routes/settings/config-yaml.tsx:62
#: src/components/routes/settings/config-yaml.tsx:61
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "매 시작 시, 데이터베이스가 파일에 정의된 시스템과 일치하도록 업데이트됩니다."
#: src/components/systems-table/systems-table.tsx:639
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "메뉴 열기"
#: src/components/login/auth-form.tsx:251
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "또는 아래 항목으로 진행하기"
#: src/components/alerts/alert-button.tsx:120
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "기존 알림 덮어쓰기"
@@ -530,41 +533,41 @@ msgstr "페이지"
msgid "Pages / Settings"
msgstr "페이지 / 설정"
#: src/components/login/auth-form.tsx:195
#: src/components/login/auth-form.tsx:200
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "비밀번호"
#: src/components/login/auth-form.tsx:21
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "비밀번호는 최소 8자 이상이어야 합니다."
#: src/components/login/auth-form.tsx:22
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr "비밀번호는 72 바이트 이하여야 합니다."
#: src/components/login/forgot-pass-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "비밀번호 재설정 요청이 접수되었습니다"
#: src/components/systems-table/systems-table.tsx:672
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "일시 중지"
#: src/components/systems-table/systems-table.tsx:143
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr "일시 정지됨"
#: src/components/routes/settings/notifications.tsx:97
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "알림이 전달되도록 <0>SMTP 서버를 구성</0>하세요."
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "자세한 내용은 로그를 확인하세요."
#: src/components/login/forgot-pass-form.tsx:17
#: src/components/login/auth-form.tsx:41
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "자격 증명을 확인하고 다시 시도하세요."
@@ -572,7 +575,7 @@ msgstr "자격 증명을 확인하고 다시 시도하세요."
msgid "Please create an admin account"
msgstr "관리자 계정을 생성하세요."
#: src/components/login/auth-form.tsx:138
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "이 사이트에 대해 팝업을 활성화하세요."
@@ -580,7 +583,7 @@ msgstr "이 사이트에 대해 팝업을 활성화하세요."
msgid "Please log in again"
msgstr "다시 로그인하세요."
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "사용법은 <0>문서</0>를 참조하세요."
@@ -588,12 +591,12 @@ msgstr "사용법은 <0>문서</0>를 참조하세요."
msgid "Please sign in to your account"
msgstr "계정에 로그인하세요."
#: src/components/add-system.tsx:171
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "포트"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:577
#: src/components/routes/system.tsx:456
#: src/components/routes/system.tsx:572
msgid "Precise utilization at the recorded time"
msgstr "기록된 시간의 정확한 사용량"
@@ -602,39 +605,39 @@ msgid "Preferred Language"
msgstr "선호 언어"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:182
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "공개 키"
#. Disk read
#: src/components/charts/area-chart.tsx:62
#: src/components/charts/area-chart.tsx:72
#: src/components/charts/area-chart.tsx:60
#: src/components/charts/area-chart.tsx:70
msgid "Read"
msgstr "읽기"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx:67
#: src/components/charts/area-chart.tsx:65
msgid "Received"
msgstr "수신됨"
#: src/components/login/forgot-pass-form.tsx:77
#: src/components/login/forgot-pass-form.tsx:76
msgid "Reset Password"
msgstr "비밀번호 재설정"
#: src/components/systems-table/systems-table.tsx:667
#: src/components/systems-table/systems-table.tsx:628
msgid "Resume"
msgstr "재개"
#: src/components/routes/settings/notifications.tsx:119
#: src/components/routes/settings/notifications.tsx:118
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Enter 키 또는 쉼표를 사용하여 주소를 저장하세요. 이메일 알림을 비활성화하려면 비워 두세요."
#: src/components/routes/settings/notifications.tsx:169
#: src/components/routes/settings/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
msgid "Save Settings"
msgstr "설정 저장"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr "시스템 저장"
@@ -646,12 +649,12 @@ msgstr "검색"
msgid "Search for systems or settings..."
msgstr "시스템 또는 설정 검색..."
#: src/components/alerts/alert-button.tsx:82
#: src/components/alerts/alert-button.tsx:71
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "알림을 받는 방법을 구성하려면 <0>알림 설정</0>을 참조하세요."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx:66
#: src/components/charts/area-chart.tsx:64
msgid "Sent"
msgstr "보냄"
@@ -662,16 +665,16 @@ msgstr "시스템을 볼 때 차트의 기본 시간 범위를 설정합니다."
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:72
#: src/components/routes/settings/layout.tsx:83
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
msgstr "설정"
#: src/components/routes/settings/layout.tsx:34
#: src/components/routes/settings/layout.tsx:33
msgid "Settings saved"
msgstr "설정이 저장되었습니다."
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "로그인"
@@ -679,7 +682,7 @@ msgstr "로그인"
msgid "SMTP settings"
msgstr "SMTP 설정"
#: src/components/systems-table/systems-table.tsx:389
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "정렬 기준"
@@ -687,18 +690,21 @@ msgstr "정렬 기준"
msgid "Status"
msgstr "상태"
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:522
msgid "Swap space used by the system"
msgstr "시스템에서 사용된 스왑 공간"
#: src/components/routes/system.tsx:522
#: src/components/routes/system.tsx:521
msgid "Swap Usage"
msgstr "스왑 사용량"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:27
#: src/components/systems-table/systems-table.tsx:152
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "시스템"
@@ -706,70 +712,70 @@ msgstr "시스템"
msgid "Systems"
msgstr "시스템"
#: src/components/routes/settings/config-yaml.tsx:56
#: src/components/routes/settings/config-yaml.tsx:55
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "시스템은 데이터 디렉토리 내의 <0>config.yml</0> 파일에서 관리할 수 있습니다."
#: src/components/systems-table/systems-table.tsx:377
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "표"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:244
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr "온도"
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:534
#: src/components/routes/system.tsx:533
msgid "Temperature"
msgstr "온도"
#: src/components/routes/system.tsx:535
#: src/components/routes/system.tsx:534
msgid "Temperatures of system sensors"
msgstr "시스템 센서의 온도"
#: src/components/routes/settings/notifications.tsx:213
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "테스트 <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:184
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "테스트 알림이 전송되었습니다."
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:146
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "에이전트가 시스템에서 실행 중이어야 연결할 수 있습니다. 아래의 에이전트 설치 명령을 복사하세요."
#: src/components/add-system.tsx:138
#: src/components/add-system.tsx:137
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "에이전트가 시스템에서 실행 중이어야 연결할 수 있습니다. 아래의 <0>docker-compose.yml</0>을 복사하세요."
#: src/components/login/forgot-pass-form.tsx:99
#: src/components/login/forgot-pass-form.tsx:98
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "그런 다음 백엔드에 로그인하여 사용자 테이블에서 사용자 계정 비밀번호를 재설정하세요."
#: src/components/systems-table/systems-table.tsx:699
#: src/components/systems-table/systems-table.tsx:660
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "이 작업은 되돌릴 수 없습니다. 데이터베이스에서 {name}에 대한 모든 현재 기록이 영구적으로 삭제됩니다."
#: src/components/routes/system.tsx:615
#: src/components/routes/system.tsx:613
msgid "Throughput of {extraFsName}"
msgstr "{extraFsName}의 처리량"
#: src/components/routes/system.tsx:482
#: src/components/routes/system.tsx:481
msgid "Throughput of root filesystem"
msgstr "루트 파일 시스템의 처리량"
#: src/components/routes/settings/notifications.tsx:108
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "받는사람(들)"
#: src/components/routes/system.tsx:409
#: src/components/routes/system.tsx:422
#: src/components/routes/system.tsx:408
#: src/components/routes/system.tsx:421
msgid "Toggle grid"
msgstr "그리드 전환"
#: src/components/mode-toggle.tsx:34
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "테마 전환"
@@ -798,32 +804,32 @@ msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "디스크 사용량이 임계값을 초과할 때 트리거됩니다."
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:343
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:342
msgid "Up"
msgstr "온라인"
#: src/components/systems-table/systems-table.tsx:350
#: src/components/systems-table/systems-table.tsx:337
msgid "Updated in real time. Click on a system to view information."
msgstr "실시간으로 업데이트됩니다. 시스템을 클릭하여 정보를 확인하세요."
#: src/components/routes/system.tsx:270
#: src/components/routes/system.tsx:269
msgid "Uptime"
msgstr "가동 시간"
#: src/components/routes/system.tsx:568
#: src/components/routes/system.tsx:602
#: src/components/charts/area-chart.tsx:75
#: src/components/routes/system.tsx:563
#: src/components/routes/system.tsx:600
#: src/components/charts/area-chart.tsx:73
msgid "Usage"
msgstr "사용량"
#: src/components/routes/system.tsx:474
#: src/components/routes/system.tsx:473
msgid "Usage of root partition"
msgstr "루트 파티션의 사용량"
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:63
#: src/components/charts/area-chart.tsx:75
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "사용됨"
@@ -832,15 +838,15 @@ msgstr "사용됨"
msgid "Users"
msgstr "사용자"
#: src/components/systems-table/systems-table.tsx:359
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "보기"
#: src/components/systems-table/systems-table.tsx:424
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "표시할 열"
#: src/components/routes/system.tsx:707
#: src/components/routes/system.tsx:705
msgid "Waiting for enough records to display"
msgstr "표시할 충분한 기록을 기다리는 중"
@@ -848,24 +854,25 @@ msgstr "표시할 충분한 기록을 기다리는 중"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "번역을 더 좋게 만드는 데 도움을 주시겠습니까? 자세한 내용은 <0>Crowdin</0>을 확인하세요."
#: src/components/routes/settings/notifications.tsx:126
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / 푸시 알림"
#. Disk write
#: src/components/charts/area-chart.tsx:61
#: src/components/charts/area-chart.tsx:71
#: src/components/charts/area-chart.tsx:59
#: src/components/charts/area-chart.tsx:69
msgid "Write"
msgstr "쓰기"
#: src/components/routes/settings/layout.tsx:62
#: src/components/routes/settings/layout.tsx:61
msgid "YAML Config"
msgstr "YAML 구성"
#: src/components/routes/settings/config-yaml.tsx:46
#: src/components/routes/settings/config-yaml.tsx:45
msgid "YAML Configuration"
msgstr "YAML 구성"
#: src/components/routes/settings/layout.tsx:35
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "사용자 설정이 업데이트되었습니다."

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: nl\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-03-06 07:27\n"
"PO-Revision-Date: 2025-04-14 13:04\n"
"Last-Translator: \n"
"Language-Team: Dutch\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -300,12 +300,12 @@ msgstr "Documentatie"
#: src/components/systems-table/systems-table.tsx:142
#: src/components/routes/system.tsx:345
msgid "Down"
msgstr ""
msgstr "Offline"
#: src/components/add-system.tsx:126
#: src/components/systems-table/systems-table.tsx:653
msgid "Edit"
msgstr ""
msgstr "Bewerken"
#: src/components/login/forgot-pass-form.tsx:54
#: src/components/login/auth-form.tsx:176
@@ -451,7 +451,7 @@ msgstr "Weergave- en notificatievoorkeuren beheren."
#: src/components/add-system.tsx:227
msgid "Manual setup instructions"
msgstr ""
msgstr "Handmatige installatie-instructies"
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:673
@@ -541,7 +541,7 @@ msgstr "Het wachtwoord moet minimaal 8 tekens bevatten."
#: src/components/login/auth-form.tsx:22
msgid "Password must be less than 72 bytes."
msgstr ""
msgstr "Het wachtwoord moet minder zijn dat 72 bytes."
#: src/components/login/forgot-pass-form.tsx:34
msgid "Password reset request received"
@@ -553,7 +553,7 @@ msgstr "Pauze"
#: src/components/systems-table/systems-table.tsx:143
msgid "Paused"
msgstr ""
msgstr "Gepauzeerd"
#: src/components/routes/settings/notifications.tsx:97
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
@@ -636,7 +636,7 @@ msgstr "Instellingen opslaan"
#: src/components/add-system.tsx:232
msgid "Save system"
msgstr ""
msgstr "Systeem bewaren"
#: src/components/navbar.tsx:134
msgid "Search"
@@ -717,7 +717,7 @@ msgstr "Tabel"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:244
msgid "Temp"
msgstr ""
msgstr "Temperatuur"
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:534
@@ -801,7 +801,7 @@ msgstr "Triggert wanneer het gebruik van een schijf een drempelwaarde overschrij
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:343
msgid "Up"
msgstr ""
msgstr "Online"
#: src/components/systems-table/systems-table.tsx:350
msgid "Updated in real time. Click on a system to view information."
@@ -869,3 +869,4 @@ msgstr "YAML Configuratie"
#: src/components/routes/settings/layout.tsx:35
msgid "Your user settings have been updated."
msgstr "Je gebruikersinstellingen zijn bijgewerkt."

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: no\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-03-06 07:27\n"
"PO-Revision-Date: 2025-03-17 13:40\n"
"Last-Translator: \n"
"Language-Team: Norwegian\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -553,7 +553,7 @@ msgstr "Pause"
#: src/components/systems-table/systems-table.tsx:143
msgid "Paused"
msgstr ""
msgstr "Satt på Pause"
#: src/components/routes/settings/notifications.tsx:97
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
@@ -869,3 +869,4 @@ msgstr "YAML Konfigurasjon"
#: src/components/routes/settings/layout.tsx:35
msgid "Your user settings have been updated."
msgstr "Dine brukerinnstillinger har blitt oppdatert."

View File

@@ -19,11 +19,11 @@ msgstr ""
"X-Crowdin-File-ID: 16\n"
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:259
#: src/components/routes/system.tsx:255
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# dzień} few {# dni} many {# dni} other {# dni}}"
#: src/components/routes/system.tsx:257
#: src/components/routes/system.tsx:253
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {godzinę} few {# godziny} many {# godzin} other {# godziny}}"
@@ -48,27 +48,30 @@ msgid "30 days"
msgstr "30 dni"
#. Table column
#: src/components/systems-table/systems-table.tsx:304
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "Akcje"
#: src/components/routes/home.tsx:94
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Aktywne alerty"
#: src/components/add-system.tsx:43
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Dodaj <0>system</0>"
#: src/components/add-system.tsx:126
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "Dodaj nowy system"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Add system"
msgstr "Dodaj system"
#: src/components/routes/settings/notifications.tsx:158
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Dodaj URL"
@@ -84,21 +87,21 @@ msgstr "Dostosuj opcje wyświetlania wykresów."
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx:270
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "Agent"
#: src/components/alerts/alert-button.tsx:33
#: src/components/alerts/alert-button.tsx:79
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "Alerty"
#: src/components/systems-table/systems-table.tsx:347
#: src/components/alerts/alert-button.tsx:99
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
msgid "All Systems"
msgstr "Wszystkie systemy"
#: src/components/systems-table/systems-table.tsx:696
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "Czy na pewno chcesz usunąć {name}?"
@@ -106,29 +109,29 @@ msgstr "Czy na pewno chcesz usunąć {name}?"
msgid "Automatic copy requires a secure context."
msgstr "Automatyczne kopiowanie wymaga bezpiecznego kontekstu."
#: src/components/routes/system.tsx:670
#: src/components/routes/system.tsx:660
msgid "Average"
msgstr "Średnia"
#: src/components/routes/system.tsx:446
#: src/components/routes/system.tsx:437
msgid "Average CPU utilization of containers"
msgstr "Średnie wykorzystanie procesora przez kontenery"
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:253
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Średnia przekracza <0>{value}{0}</0>"
#: src/components/routes/system.tsx:547
#: src/components/routes/system.tsx:538
msgid "Average power consumption of GPUs"
msgstr "Średnie zużycie energii przez GPU"
#: src/components/routes/system.tsx:435
#: src/components/routes/system.tsx:426
msgid "Average system-wide CPU utilization"
msgstr "Średnie wykorzystanie procesora w całym systemie"
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:569
#: src/components/routes/system.tsx:556
msgid "Average utilization of {0}"
msgstr "Średnie użycie {0}"
@@ -138,31 +141,31 @@ msgid "Backups"
msgstr "Kopie"
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:491
#: src/components/routes/system.tsx:482
msgid "Bandwidth"
msgstr "Przepustowość"
#: src/components/login/auth-form.tsx:305
#: src/components/login/auth-form.tsx:306
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel obsługuje OpenID Connect i wielu dostawców uwierzytelniania OAuth2."
#: src/components/routes/settings/notifications.tsx:129
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel używa <0>Shoutrrr</0> do integracji z popularnych serwisami powiadomień."
#: src/components/add-system.tsx:131
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "Plik binarny"
#: src/components/charts/mem-chart.tsx:87
#: src/components/charts/mem-chart.tsx:89
msgid "Cache / Buffers"
msgstr "Pamięć podręczna / Bufory"
#: src/components/systems-table/systems-table.tsx:707
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "Anuluj"
#: src/components/routes/settings/config-yaml.tsx:69
#: src/components/routes/settings/config-yaml.tsx:68
msgid "Caution - potential data loss"
msgstr "Uwaga- potencjalna utrata danych."
@@ -174,37 +177,37 @@ msgstr "Zmiana ogólnych ustawień aplikacji."
msgid "Chart options"
msgstr "Opcje wykresu"
#: src/components/login/forgot-pass-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:34
msgid "Check {email} for a reset link."
msgstr "Sprawdź {email}, aby uzyskać link do resetowania."
#: src/components/routes/settings/layout.tsx:41
#: src/components/routes/settings/layout.tsx:40
msgid "Check logs for more details."
msgstr "Sprawdź logi, aby uzyskać więcej informacji."
#: src/components/routes/settings/notifications.tsx:185
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Sprawdź swój serwis powiadomień"
#: src/components/add-system.tsx:205
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "Kliknij, aby skopiować"
#: src/components/login/forgot-pass-form.tsx:84
#: src/components/login/forgot-pass-form.tsx:90
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Instrukcje wiersza poleceń"
#: src/components/routes/settings/notifications.tsx:79
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Skonfiguruj sposób otrzymywania powiadomień."
#: src/components/login/auth-form.tsx:213
#: src/components/login/auth-form.tsx:218
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "Potwierdź hasło"
#: src/components/systems-table/systems-table.tsx:713
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "Kontynuuj"
@@ -212,16 +215,16 @@ msgstr "Kontynuuj"
msgid "Copied to clipboard"
msgstr "Skopiowano do schowka"
#: src/components/add-system.tsx:216
#: src/components/add-system.tsx:218
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "Kopiuj"
#: src/components/systems-table/systems-table.tsx:678
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "Kopiuj host"
#: src/components/add-system.tsx:225
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "Kopiuj polecenie Linux"
@@ -229,27 +232,27 @@ msgstr "Kopiuj polecenie Linux"
msgid "Copy text"
msgstr "Kopiuj tekst"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "Procesor"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:434
#: src/components/charts/area-chart.tsx:58
#: src/components/routes/system.tsx:425
#: src/components/charts/area-chart.tsx:56
msgid "CPU Usage"
msgstr "Użycie procesora"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "Utwórz konto"
#. Dark theme
#: src/components/mode-toggle.tsx:22
#: src/components/mode-toggle.tsx:21
msgid "Dark"
msgstr "Ciemny"
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:36
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Panel kontrolny"
@@ -257,37 +260,37 @@ msgstr "Panel kontrolny"
msgid "Default time period"
msgstr "Domyślny przedział czasu"
#: src/components/systems-table/systems-table.tsx:683
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "Usuń"
#: src/components/systems-table/systems-table.tsx:204
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "Dysk"
#: src/components/routes/system.tsx:481
#: src/components/routes/system.tsx:472
msgid "Disk I/O"
msgstr "Dysk I/O"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:474
#: src/components/charts/disk-chart.tsx:77
#: src/components/routes/system.tsx:465
#: src/components/charts/disk-chart.tsx:79
msgid "Disk Usage"
msgstr "Użycie dysku"
#: src/components/routes/system.tsx:603
#: src/components/routes/system.tsx:593
msgid "Disk usage of {extraFsName}"
msgstr "Wykorzystanie dysku {extraFsName}"
#: src/components/routes/system.tsx:445
#: src/components/routes/system.tsx:436
msgid "Docker CPU Usage"
msgstr "Wykorzystanie procesora przez Docker"
#: src/components/routes/system.tsx:466
#: src/components/routes/system.tsx:457
msgid "Docker Memory Usage"
msgstr "Wykorzystanie pamięci przez Docker"
#: src/components/routes/system.tsx:507
#: src/components/routes/system.tsx:498
msgid "Docker Network I/O"
msgstr "Sieć Docker I/O"
@@ -297,22 +300,22 @@ msgstr "Dokumentacja"
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:142
#: src/components/routes/system.tsx:345
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:336
msgid "Down"
msgstr ""
#: src/components/add-system.tsx:126
#: src/components/systems-table/systems-table.tsx:653
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr ""
#: src/components/login/forgot-pass-form.tsx:54
#: src/components/login/auth-form.tsx:176
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
msgid "Email"
msgstr "E-mail"
#: src/components/routes/settings/notifications.tsx:93
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "Powiadomienia e-mail"
@@ -320,32 +323,32 @@ msgstr "Powiadomienia e-mail"
msgid "Enter email address to reset password"
msgstr "Wprowadź adres e-mail, aby zresetować hasło"
#: src/components/routes/settings/notifications.tsx:113
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Wprowadź adres e-mail..."
#: src/components/routes/settings/notifications.tsx:189
#: src/components/routes/settings/config-yaml.tsx:29
#: src/components/login/auth-form.tsx:137
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "Błąd"
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: src/components/routes/home.tsx:113
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "Przekracza {0}{1} w ciągu ostatnich {2, plural, one {# minuty} other {# minut}}"
#: src/components/routes/settings/config-yaml.tsx:73
#: src/components/routes/settings/config-yaml.tsx:72
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "Istniejące systemy, które nie są zdefiniowane w <0>config.yml</0>, zostaną usunięte. Proszę regularnie tworzyć kopie zapasowe."
#: src/components/routes/settings/config-yaml.tsx:94
#: src/components/routes/settings/config-yaml.tsx:93
msgid "Export configuration"
msgstr "Eksportuj konfigurację"
#: src/components/routes/settings/config-yaml.tsx:49
#: src/components/routes/settings/config-yaml.tsx:48
msgid "Export your current systems configuration."
msgstr "Eksportuj aktualną konfigurację systemów."
@@ -353,60 +356,60 @@ msgstr "Eksportuj aktualną konfigurację systemów."
msgid "Failed to authenticate"
msgstr "Błąd autoryzacji"
#: src/components/routes/settings/notifications.tsx:64
#: src/components/routes/settings/layout.tsx:40
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
msgid "Failed to save settings"
msgstr "Nie udało się zapisać ustawień"
#: src/components/routes/settings/notifications.tsx:190
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Nie udało się wysłać testowego powiadomienia"
#: src/components/alerts/alerts-system.tsx:26
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Nie udało się zaktualizować powiadomienia"
#: src/components/systems-table/systems-table.tsx:354
#: src/components/routes/system.tsx:643
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:633
msgid "Filter..."
msgstr "Filtruj..."
#: src/components/alerts/alerts-system.tsx:285
#: src/components/alerts/alerts-system.tsx:230
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "Na <0>{min}</0> {min, plural, one {minutę} other {minut}}"
#: src/components/login/auth-form.tsx:328
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "Zapomniałeś hasła?"
#. Context: General settings
#: src/components/routes/settings/layout.tsx:52
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "Ogólne"
#: src/components/routes/system.tsx:546
#: src/components/routes/system.tsx:537
msgid "GPU Power Draw"
msgstr "Moc GPU"
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "Siatka"
#: src/components/add-system.tsx:159
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "Host / adres IP"
#: src/components/login/forgot-pass-form.tsx:94
#: src/components/login/forgot-pass-form.tsx:93
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Jeśli utraciłeś hasło do swojego konta administratora, możesz je zresetować, używając następującego polecenia."
#: src/components/login/auth-form.tsx:18
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Nieprawidłowy adres e-mail."
#. Linux kernel
#: src/components/routes/system.tsx:271
#: src/components/routes/system.tsx:267
msgid "Kernel"
msgstr "Jądro"
@@ -414,12 +417,12 @@ msgstr "Jądro"
msgid "Language"
msgstr "Język"
#: src/components/systems-table/systems-table.tsx:367
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "Układ"
#. Light theme
#: src/components/mode-toggle.tsx:17
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Jasny"
@@ -431,8 +434,8 @@ msgstr "Wyloguj"
msgid "Login"
msgstr "Logowanie"
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "Próba logowania nie powiodła się"
@@ -441,49 +444,49 @@ msgstr "Próba logowania nie powiodła się"
msgid "Logs"
msgstr "Logi"
#: src/components/routes/settings/notifications.tsx:82
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "Szukasz, gdzie utworzyć powiadomienia? Kliknij ikonę dzwonka <0/> w tabeli systemów."
#: src/components/routes/settings/layout.tsx:86
#: src/components/routes/settings/layout.tsx:85
msgid "Manage display and notification preferences."
msgstr "Zarządzaj preferencjami wyświetlania i powiadomień."
#: src/components/add-system.tsx:227
#: src/components/add-system.tsx:226
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:673
#: src/components/routes/system.tsx:663
msgid "Max 1 min"
msgstr "Maks. 1 min"
#: src/components/systems-table/systems-table.tsx:195
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "Pamięć"
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:456
#: src/components/routes/system.tsx:447
msgid "Memory Usage"
msgstr "Wykorzystanie pamięci"
#: src/components/routes/system.tsx:467
#: src/components/routes/system.tsx:458
msgid "Memory usage of docker containers"
msgstr "Użycie pamięci przez kontenery Docker."
#: src/components/add-system.tsx:155
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "Nazwa"
#: src/components/systems-table/systems-table.tsx:223
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "Sieć"
#: src/components/routes/system.tsx:508
#: src/components/routes/system.tsx:499
msgid "Network traffic of docker containers"
msgstr "Ruch sieciowy kontenerów Docker."
#: src/components/routes/system.tsx:493
#: src/components/routes/system.tsx:484
msgid "Network traffic of public interfaces"
msgstr "Ruch sieciowy interfejsów publicznych"
@@ -491,34 +494,34 @@ msgstr "Ruch sieciowy interfejsów publicznych"
msgid "No results found."
msgstr "Brak wyników."
#: src/components/systems-table/systems-table.tsx:472
#: src/components/systems-table/systems-table.tsx:495
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "Nie znaleziono systemów."
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:76
#: src/components/routes/settings/layout.tsx:57
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
msgid "Notifications"
msgstr "Powiadomienia"
#: src/components/login/auth-form.tsx:300
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "Wsparcie OAuth 2 / OIDC"
#: src/components/routes/settings/config-yaml.tsx:62
#: src/components/routes/settings/config-yaml.tsx:61
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "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:639
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "Otwórz menu"
#: src/components/login/auth-form.tsx:251
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "Lub kontynuuj z"
#: src/components/alerts/alert-button.tsx:120
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "Nadpisz istniejące alerty"
@@ -530,41 +533,41 @@ msgstr "Strona"
msgid "Pages / Settings"
msgstr "Strony / Ustawienia"
#: src/components/login/auth-form.tsx:195
#: src/components/login/auth-form.tsx:200
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "Hasło"
#: src/components/login/auth-form.tsx:21
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "Hasło musi mieć co najmniej 8 znaków."
#: src/components/login/auth-form.tsx:22
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr ""
#: src/components/login/forgot-pass-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Otrzymane żądanie resetowania hasła"
#: src/components/systems-table/systems-table.tsx:672
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "Pauza"
#: src/components/systems-table/systems-table.tsx:143
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr ""
#: src/components/routes/settings/notifications.tsx:97
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "Proszę <0>skonfigurować serwer SMTP</0>, aby zapewnić dostarczanie powiadomień."
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Sprawdź logi, aby uzyskać więcej informacji."
#: src/components/login/forgot-pass-form.tsx:17
#: src/components/login/auth-form.tsx:41
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "Sprawdź swoje poświadczenia i spróbuj ponownie"
@@ -572,7 +575,7 @@ msgstr "Sprawdź swoje poświadczenia i spróbuj ponownie"
msgid "Please create an admin account"
msgstr "Utwórz konto administratora"
#: src/components/login/auth-form.tsx:138
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Włącz wyskakujące okna dla tej strony"
@@ -580,7 +583,7 @@ msgstr "Włącz wyskakujące okna dla tej strony"
msgid "Please log in again"
msgstr "Zaloguj się ponownie"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Proszę zapoznać się z <0>dokumentacją</0>."
@@ -588,12 +591,12 @@ msgstr "Proszę zapoznać się z <0>dokumentacją</0>."
msgid "Please sign in to your account"
msgstr "Zaloguj się na swoje konto"
#: src/components/add-system.tsx:171
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "Port"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:577
#: src/components/routes/system.tsx:448
#: src/components/routes/system.tsx:564
msgid "Precise utilization at the recorded time"
msgstr "Dokładne wykorzystanie w zarejestrowanym czasie"
@@ -602,39 +605,39 @@ msgid "Preferred Language"
msgstr "Preferowany język"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:182
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "Klucz publiczny"
#. Disk read
#: src/components/charts/area-chart.tsx:62
#: src/components/charts/area-chart.tsx:72
#: src/components/charts/area-chart.tsx:60
#: src/components/charts/area-chart.tsx:70
msgid "Read"
msgstr "Czytaj"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx:67
#: src/components/charts/area-chart.tsx:65
msgid "Received"
msgstr "Otrzymane"
#: src/components/login/forgot-pass-form.tsx:77
#: src/components/login/forgot-pass-form.tsx:76
msgid "Reset Password"
msgstr "Resetuj hasło"
#: src/components/systems-table/systems-table.tsx:667
#: src/components/systems-table/systems-table.tsx:628
msgid "Resume"
msgstr "Wznów"
#: src/components/routes/settings/notifications.tsx:119
#: src/components/routes/settings/notifications.tsx:118
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Zapisz adres, używając klawisza enter lub przecinka. Pozostaw puste, aby wyłączyć powiadomienia e-mail."
#: src/components/routes/settings/notifications.tsx:169
#: src/components/routes/settings/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
msgid "Save Settings"
msgstr "Zapisz ustawienia"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr ""
@@ -646,12 +649,12 @@ msgstr "Szukaj"
msgid "Search for systems or settings..."
msgstr "Szukaj systemów lub ustawień..."
#: src/components/alerts/alert-button.tsx:82
#: src/components/alerts/alert-button.tsx:71
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Zobacz <0>ustawienia powiadomień</0>, aby skonfigurować sposób, w jaki otrzymujesz powiadomienia."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx:66
#: src/components/charts/area-chart.tsx:64
msgid "Sent"
msgstr "Wysłane"
@@ -662,16 +665,16 @@ msgstr "Ustawia domyślny zakres czasowy dla wykresów, gdy system jest wyświet
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:72
#: src/components/routes/settings/layout.tsx:83
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
msgstr "Ustawienia"
#: src/components/routes/settings/layout.tsx:34
#: src/components/routes/settings/layout.tsx:33
msgid "Settings saved"
msgstr "Ustawienia zapisane"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "Zaloguj się"
@@ -679,7 +682,7 @@ msgstr "Zaloguj się"
msgid "SMTP settings"
msgstr "Ustawienia SMTP"
#: src/components/systems-table/systems-table.tsx:389
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "Sortuj według"
@@ -687,18 +690,21 @@ msgstr "Sortuj według"
msgid "Status"
msgstr "Status"
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:514
msgid "Swap space used by the system"
msgstr "Pamięć wymiany używana przez system"
#: src/components/routes/system.tsx:522
#: src/components/routes/system.tsx:513
msgid "Swap Usage"
msgstr "Użycie pamięci wymiany"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:27
#: src/components/systems-table/systems-table.tsx:152
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "System"
@@ -706,70 +712,70 @@ msgstr "System"
msgid "Systems"
msgstr "Systemy"
#: src/components/routes/settings/config-yaml.tsx:56
#: src/components/routes/settings/config-yaml.tsx:55
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "Systemy mogą być zarządzane w pliku <0>config.yml</0> znajdującym się w Twoim katalogu danych."
#: src/components/systems-table/systems-table.tsx:377
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "Tabela"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:244
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr ""
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:534
#: src/components/routes/system.tsx:525
msgid "Temperature"
msgstr "Temperatura"
#: src/components/routes/system.tsx:535
#: src/components/routes/system.tsx:526
msgid "Temperatures of system sensors"
msgstr "Temperatury czujników systemowych."
#: src/components/routes/settings/notifications.tsx:213
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Test <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:184
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Testowe powiadomienie wysłane."
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:146
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "Agent musi być uruchomiony na systemie, aby nawiązać połączenie. Skopiuj poniżej polecenie instalacji agenta."
#: src/components/add-system.tsx:138
#: src/components/add-system.tsx:137
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "Agent musi być uruchomiony na systemie, aby nawiązać połączenie. Skopiuj poniżej plik <0>docker-compose.yml</0> dla agenta."
#: src/components/login/forgot-pass-form.tsx:99
#: src/components/login/forgot-pass-form.tsx:98
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "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:699
#: src/components/systems-table/systems-table.tsx:660
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Tej akcji nie można cofnąć. Spowoduje to trwałe usunięcie wszystkich bieżących rekordów dla {name} z bazy danych."
#: src/components/routes/system.tsx:615
#: src/components/routes/system.tsx:605
msgid "Throughput of {extraFsName}"
msgstr "Przepustowość {extraFsName}"
#: src/components/routes/system.tsx:482
#: src/components/routes/system.tsx:473
msgid "Throughput of root filesystem"
msgstr "Przepustowość głównego systemu plików"
#: src/components/routes/settings/notifications.tsx:108
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "Do e-mail(ów)"
#: src/components/routes/system.tsx:409
#: src/components/routes/system.tsx:422
#: src/components/routes/system.tsx:400
#: src/components/routes/system.tsx:413
msgid "Toggle grid"
msgstr "Przełącz siatkę"
#: src/components/mode-toggle.tsx:34
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "Zmień motyw"
@@ -798,32 +804,32 @@ msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Wyzwalane, gdy wykorzystanie któregokolwiek dysku przekroczy ustalony próg"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:343
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:334
msgid "Up"
msgstr ""
#: src/components/systems-table/systems-table.tsx:350
#: src/components/systems-table/systems-table.tsx:337
msgid "Updated in real time. Click on a system to view information."
msgstr "Aktualizowane w czasie rzeczywistym. Kliknij system, aby zobaczyć informacje."
#: src/components/routes/system.tsx:270
#: src/components/routes/system.tsx:266
msgid "Uptime"
msgstr "Czas pracy"
#: src/components/routes/system.tsx:568
#: src/components/routes/system.tsx:602
#: src/components/charts/area-chart.tsx:75
#: src/components/routes/system.tsx:555
#: src/components/routes/system.tsx:592
#: src/components/charts/area-chart.tsx:73
msgid "Usage"
msgstr "Wykorzystanie"
#: src/components/routes/system.tsx:474
#: src/components/routes/system.tsx:465
msgid "Usage of root partition"
msgstr "Użycie partycji głównej"
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:63
#: src/components/charts/area-chart.tsx:75
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "Używane"
@@ -832,15 +838,15 @@ msgstr "Używane"
msgid "Users"
msgstr "Użytkownicy"
#: src/components/systems-table/systems-table.tsx:359
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "Widok"
#: src/components/systems-table/systems-table.tsx:424
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "Widoczne kolumny"
#: src/components/routes/system.tsx:707
#: src/components/routes/system.tsx:697
msgid "Waiting for enough records to display"
msgstr "Oczekiwanie na wystarczającą liczbę rekordów do wyświetlenia"
@@ -848,24 +854,25 @@ msgstr "Oczekiwanie na wystarczającą liczbę rekordów do wyświetlenia"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "Chcesz pomóc nam uczynić nasze tłumaczenia jeszcze lepszymi? Sprawdź <0>Crowdin</0> po więcej szczegółów."
#: src/components/routes/settings/notifications.tsx:126
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / Powiadomienia push"
#. Disk write
#: src/components/charts/area-chart.tsx:61
#: src/components/charts/area-chart.tsx:71
#: src/components/charts/area-chart.tsx:59
#: src/components/charts/area-chart.tsx:69
msgid "Write"
msgstr "Napisz"
#: src/components/routes/settings/layout.tsx:62
#: src/components/routes/settings/layout.tsx:61
msgid "YAML Config"
msgstr "Konf. YAML"
#: src/components/routes/settings/config-yaml.tsx:46
#: src/components/routes/settings/config-yaml.tsx:45
msgid "YAML Configuration"
msgstr "Konfiguracja YAML"
#: src/components/routes/settings/layout.tsx:35
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "Twoje ustawienia użytkownika zostały zaktualizowane."

View File

@@ -19,11 +19,11 @@ msgstr ""
"X-Crowdin-File-ID: 16\n"
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:259
#: src/components/routes/system.tsx:255
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# dia} other {# dias}}"
#: src/components/routes/system.tsx:257
#: src/components/routes/system.tsx:253
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# hora} other {# horas}}"
@@ -48,27 +48,30 @@ msgid "30 days"
msgstr "30 dias"
#. Table column
#: src/components/systems-table/systems-table.tsx:304
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "Ações"
#: src/components/routes/home.tsx:94
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Alertas Ativos"
#: src/components/add-system.tsx:43
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Adicionar <0>Sistema</0>"
#: src/components/add-system.tsx:126
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "Adicionar Novo Sistema"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Add system"
msgstr "Adicionar sistema"
#: src/components/routes/settings/notifications.tsx:158
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Adicionar URL"
@@ -84,21 +87,21 @@ msgstr "Ajustar opções de exibição para gráficos."
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx:270
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "Agente"
#: src/components/alerts/alert-button.tsx:33
#: src/components/alerts/alert-button.tsx:79
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "Alertas"
#: src/components/systems-table/systems-table.tsx:347
#: src/components/alerts/alert-button.tsx:99
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
msgid "All Systems"
msgstr "Todos os Sistemas"
#: src/components/systems-table/systems-table.tsx:696
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "Tem certeza de que deseja excluir {name}?"
@@ -106,29 +109,29 @@ msgstr "Tem certeza de que deseja excluir {name}?"
msgid "Automatic copy requires a secure context."
msgstr "A cópia automática requer um contexto seguro."
#: src/components/routes/system.tsx:670
#: src/components/routes/system.tsx:660
msgid "Average"
msgstr "Média"
#: src/components/routes/system.tsx:446
#: src/components/routes/system.tsx:437
msgid "Average CPU utilization of containers"
msgstr "Utilização média de CPU dos contêineres"
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:253
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "A média excede <0>{value}{0}</0>"
#: src/components/routes/system.tsx:547
#: src/components/routes/system.tsx:538
msgid "Average power consumption of GPUs"
msgstr "Consumo médio de energia pelas GPU's"
#: src/components/routes/system.tsx:435
#: src/components/routes/system.tsx:426
msgid "Average system-wide CPU utilization"
msgstr "Utilização média de CPU em todo o sistema"
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:569
#: src/components/routes/system.tsx:556
msgid "Average utilization of {0}"
msgstr "Utilização média de {0}"
@@ -138,31 +141,31 @@ msgid "Backups"
msgstr "Backups"
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:491
#: src/components/routes/system.tsx:482
msgid "Bandwidth"
msgstr "Largura de Banda"
#: src/components/login/auth-form.tsx:305
#: src/components/login/auth-form.tsx:306
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel suporta OpenID Connect e muitos provedores de autenticação OAuth2."
#: src/components/routes/settings/notifications.tsx:129
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel usa <0>Shoutrrr</0> para integrar com serviços de notificação populares."
#: src/components/add-system.tsx:131
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "Binário"
#: src/components/charts/mem-chart.tsx:87
#: src/components/charts/mem-chart.tsx:89
msgid "Cache / Buffers"
msgstr "Cache / Buffers"
#: src/components/systems-table/systems-table.tsx:707
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "Cancelar"
#: src/components/routes/settings/config-yaml.tsx:69
#: src/components/routes/settings/config-yaml.tsx:68
msgid "Caution - potential data loss"
msgstr "Cuidado - possível perda de dados"
@@ -174,37 +177,37 @@ msgstr "Alterar opções gerais do aplicativo."
msgid "Chart options"
msgstr "Opções de gráfico"
#: src/components/login/forgot-pass-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:34
msgid "Check {email} for a reset link."
msgstr "Verifique {email} para um link de redefinição."
#: src/components/routes/settings/layout.tsx:41
#: src/components/routes/settings/layout.tsx:40
msgid "Check logs for more details."
msgstr "Verifique os logs para mais detalhes."
#: src/components/routes/settings/notifications.tsx:185
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Verifique seu serviço de notificação"
#: src/components/add-system.tsx:205
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "Clique para copiar"
#: src/components/login/forgot-pass-form.tsx:84
#: src/components/login/forgot-pass-form.tsx:90
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Instruções de linha de comando"
#: src/components/routes/settings/notifications.tsx:79
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Configure como você recebe notificações de alerta."
#: src/components/login/auth-form.tsx:213
#: src/components/login/auth-form.tsx:218
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "Confirmar senha"
#: src/components/systems-table/systems-table.tsx:713
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "Continuar"
@@ -212,16 +215,16 @@ msgstr "Continuar"
msgid "Copied to clipboard"
msgstr "Copiado para a área de transferência"
#: src/components/add-system.tsx:216
#: src/components/add-system.tsx:218
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "Copiar"
#: src/components/systems-table/systems-table.tsx:678
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "Copiar host"
#: src/components/add-system.tsx:225
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "Copiar comando Linux"
@@ -229,27 +232,27 @@ msgstr "Copiar comando Linux"
msgid "Copy text"
msgstr "Copiar texto"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "CPU"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:434
#: src/components/charts/area-chart.tsx:58
#: src/components/routes/system.tsx:425
#: src/components/charts/area-chart.tsx:56
msgid "CPU Usage"
msgstr "Uso de CPU"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "Criar conta"
#. Dark theme
#: src/components/mode-toggle.tsx:22
#: src/components/mode-toggle.tsx:21
msgid "Dark"
msgstr "Escuro"
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:36
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Painel"
@@ -257,37 +260,37 @@ msgstr "Painel"
msgid "Default time period"
msgstr "Período de tempo padrão"
#: src/components/systems-table/systems-table.tsx:683
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "Excluir"
#: src/components/systems-table/systems-table.tsx:204
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "Disco"
#: src/components/routes/system.tsx:481
#: src/components/routes/system.tsx:472
msgid "Disk I/O"
msgstr "E/S de Disco"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:474
#: src/components/charts/disk-chart.tsx:77
#: src/components/routes/system.tsx:465
#: src/components/charts/disk-chart.tsx:79
msgid "Disk Usage"
msgstr "Uso de Disco"
#: src/components/routes/system.tsx:603
#: src/components/routes/system.tsx:593
msgid "Disk usage of {extraFsName}"
msgstr "Uso de disco de {extraFsName}"
#: src/components/routes/system.tsx:445
#: src/components/routes/system.tsx:436
msgid "Docker CPU Usage"
msgstr "Uso de CPU do Docker"
#: src/components/routes/system.tsx:466
#: src/components/routes/system.tsx:457
msgid "Docker Memory Usage"
msgstr "Uso de Memória do Docker"
#: src/components/routes/system.tsx:507
#: src/components/routes/system.tsx:498
msgid "Docker Network I/O"
msgstr "E/S de Rede do Docker"
@@ -297,22 +300,22 @@ msgstr "Documentação"
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:142
#: src/components/routes/system.tsx:345
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:336
msgid "Down"
msgstr ""
#: src/components/add-system.tsx:126
#: src/components/systems-table/systems-table.tsx:653
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr "Editar"
#: src/components/login/forgot-pass-form.tsx:54
#: src/components/login/auth-form.tsx:176
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
msgid "Email"
msgstr "Email"
#: src/components/routes/settings/notifications.tsx:93
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "Notificações por email"
@@ -320,32 +323,32 @@ msgstr "Notificações por email"
msgid "Enter email address to reset password"
msgstr "Digite o endereço de email para redefinir a senha"
#: src/components/routes/settings/notifications.tsx:113
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Digite o endereço de email..."
#: src/components/routes/settings/notifications.tsx:189
#: src/components/routes/settings/config-yaml.tsx:29
#: src/components/login/auth-form.tsx:137
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "Erro"
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: src/components/routes/home.tsx:113
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "Excede {0}{1} no último {2, plural, one {# minuto} other {# minutos}}"
#: src/components/routes/settings/config-yaml.tsx:73
#: src/components/routes/settings/config-yaml.tsx:72
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "Sistemas existentes não definidos em <0>config.yml</0> serão excluídos. Faça backups regulares."
#: src/components/routes/settings/config-yaml.tsx:94
#: src/components/routes/settings/config-yaml.tsx:93
msgid "Export configuration"
msgstr "Exportar configuração"
#: src/components/routes/settings/config-yaml.tsx:49
#: src/components/routes/settings/config-yaml.tsx:48
msgid "Export your current systems configuration."
msgstr "Exporte a configuração atual dos seus sistemas."
@@ -353,60 +356,60 @@ msgstr "Exporte a configuração atual dos seus sistemas."
msgid "Failed to authenticate"
msgstr "Falha na autenticação"
#: src/components/routes/settings/notifications.tsx:64
#: src/components/routes/settings/layout.tsx:40
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
msgid "Failed to save settings"
msgstr "Falha ao guardar as definições"
#: src/components/routes/settings/notifications.tsx:190
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Falha ao enviar notificação de teste"
#: src/components/alerts/alerts-system.tsx:26
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Falha ao atualizar alerta"
#: src/components/systems-table/systems-table.tsx:354
#: src/components/routes/system.tsx:643
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:633
msgid "Filter..."
msgstr "Filtrar..."
#: src/components/alerts/alerts-system.tsx:285
#: src/components/alerts/alerts-system.tsx:230
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "Por <0>{min}</0> {min, plural, one {minuto} other {minutos}}"
#: src/components/login/auth-form.tsx:328
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "Esqueceu a senha?"
#. Context: General settings
#: src/components/routes/settings/layout.tsx:52
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "Geral"
#: src/components/routes/system.tsx:546
#: src/components/routes/system.tsx:537
msgid "GPU Power Draw"
msgstr "Consumo de Energia da GPU"
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "Grade"
#: src/components/add-system.tsx:159
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "Host / IP"
#: src/components/login/forgot-pass-form.tsx:94
#: src/components/login/forgot-pass-form.tsx:93
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Se você perdeu a senha da sua conta de administrador, pode redefini-la usando o seguinte comando."
#: src/components/login/auth-form.tsx:18
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Endereço de email inválido."
#. Linux kernel
#: src/components/routes/system.tsx:271
#: src/components/routes/system.tsx:267
msgid "Kernel"
msgstr "Kernel"
@@ -414,12 +417,12 @@ msgstr "Kernel"
msgid "Language"
msgstr "Idioma"
#: src/components/systems-table/systems-table.tsx:367
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "Aspeto"
#. Light theme
#: src/components/mode-toggle.tsx:17
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Claro"
@@ -431,8 +434,8 @@ msgstr "Sair"
msgid "Login"
msgstr "Entrar"
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "Tentativa de login falhou"
@@ -441,49 +444,49 @@ msgstr "Tentativa de login falhou"
msgid "Logs"
msgstr "Logs"
#: src/components/routes/settings/notifications.tsx:82
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "Procurando onde criar alertas? Clique nos ícones de sino <0/> na tabela de sistemas."
#: src/components/routes/settings/layout.tsx:86
#: src/components/routes/settings/layout.tsx:85
msgid "Manage display and notification preferences."
msgstr "Gerenciar preferências de exibição e notificação."
#: src/components/add-system.tsx:227
#: src/components/add-system.tsx:226
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:673
#: src/components/routes/system.tsx:663
msgid "Max 1 min"
msgstr "Máx 1 min"
#: src/components/systems-table/systems-table.tsx:195
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "Memória"
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:456
#: src/components/routes/system.tsx:447
msgid "Memory Usage"
msgstr "Uso de Memória"
#: src/components/routes/system.tsx:467
#: src/components/routes/system.tsx:458
msgid "Memory usage of docker containers"
msgstr "Uso de memória dos contêineres Docker"
#: src/components/add-system.tsx:155
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "Nome"
#: src/components/systems-table/systems-table.tsx:223
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "Rede"
#: src/components/routes/system.tsx:508
#: src/components/routes/system.tsx:499
msgid "Network traffic of docker containers"
msgstr "Tráfego de rede dos contêineres Docker"
#: src/components/routes/system.tsx:493
#: src/components/routes/system.tsx:484
msgid "Network traffic of public interfaces"
msgstr "Tráfego de rede das interfaces públicas"
@@ -491,34 +494,34 @@ msgstr "Tráfego de rede das interfaces públicas"
msgid "No results found."
msgstr "Nenhum resultado encontrado."
#: src/components/systems-table/systems-table.tsx:472
#: src/components/systems-table/systems-table.tsx:495
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "Nenhum sistema encontrado."
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:76
#: src/components/routes/settings/layout.tsx:57
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
msgid "Notifications"
msgstr "Notificações"
#: src/components/login/auth-form.tsx:300
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "Suporte a OAuth 2 / OIDC"
#: src/components/routes/settings/config-yaml.tsx:62
#: src/components/routes/settings/config-yaml.tsx:61
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "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:639
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "Abrir menu"
#: src/components/login/auth-form.tsx:251
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "Ou continue com"
#: src/components/alerts/alert-button.tsx:120
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "Sobrescrever alertas existentes"
@@ -530,41 +533,41 @@ msgstr "Página"
msgid "Pages / Settings"
msgstr "Páginas / Configurações"
#: src/components/login/auth-form.tsx:195
#: src/components/login/auth-form.tsx:200
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "Senha"
#: src/components/login/auth-form.tsx:21
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "A senha deve ter pelo menos 8 caracteres."
#: src/components/login/auth-form.tsx:22
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr "A password tem que ter menos de 72 bytes."
#: src/components/login/forgot-pass-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Solicitação de redefinição de senha recebida"
#: src/components/systems-table/systems-table.tsx:672
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "Pausar"
#: src/components/systems-table/systems-table.tsx:143
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr ""
#: src/components/routes/settings/notifications.tsx:97
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "Por favor, <0>configure um servidor SMTP</0> para garantir que os alertas sejam entregues."
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Por favor, verifique os logs para mais detalhes."
#: src/components/login/forgot-pass-form.tsx:17
#: src/components/login/auth-form.tsx:41
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "Por favor, verifique suas credenciais e tente novamente"
@@ -572,7 +575,7 @@ msgstr "Por favor, verifique suas credenciais e tente novamente"
msgid "Please create an admin account"
msgstr "Por favor, crie uma conta de administrador"
#: src/components/login/auth-form.tsx:138
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Por favor, habilite pop-ups para este site"
@@ -580,7 +583,7 @@ msgstr "Por favor, habilite pop-ups para este site"
msgid "Please log in again"
msgstr "Por favor, faça login novamente"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Por favor, veja <0>a documentação</0> para instruções."
@@ -588,12 +591,12 @@ msgstr "Por favor, veja <0>a documentação</0> para instruções."
msgid "Please sign in to your account"
msgstr "Por favor, entre na sua conta"
#: src/components/add-system.tsx:171
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "Porta"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:577
#: src/components/routes/system.tsx:448
#: src/components/routes/system.tsx:564
msgid "Precise utilization at the recorded time"
msgstr "Utilização precisa no momento registrado"
@@ -602,39 +605,39 @@ msgid "Preferred Language"
msgstr "Idioma Preferido"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:182
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "Chave Pública"
#. Disk read
#: src/components/charts/area-chart.tsx:62
#: src/components/charts/area-chart.tsx:72
#: src/components/charts/area-chart.tsx:60
#: src/components/charts/area-chart.tsx:70
msgid "Read"
msgstr "Ler"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx:67
#: src/components/charts/area-chart.tsx:65
msgid "Received"
msgstr "Recebido"
#: src/components/login/forgot-pass-form.tsx:77
#: src/components/login/forgot-pass-form.tsx:76
msgid "Reset Password"
msgstr "Redefinir Senha"
#: src/components/systems-table/systems-table.tsx:667
#: src/components/systems-table/systems-table.tsx:628
msgid "Resume"
msgstr "Retomar"
#: src/components/routes/settings/notifications.tsx:119
#: src/components/routes/settings/notifications.tsx:118
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Salve o endereço usando a tecla enter ou vírgula. Deixe em branco para desativar notificações por email."
#: src/components/routes/settings/notifications.tsx:169
#: src/components/routes/settings/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
msgid "Save Settings"
msgstr "Guardar Definições"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr "Guardar Sistema"
@@ -646,12 +649,12 @@ msgstr "Pesquisar"
msgid "Search for systems or settings..."
msgstr "Pesquisar por sistemas ou configurações..."
#: src/components/alerts/alert-button.tsx:82
#: src/components/alerts/alert-button.tsx:71
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Veja <0>configurações de notificação</0> para configurar como você recebe alertas."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx:66
#: src/components/charts/area-chart.tsx:64
msgid "Sent"
msgstr "Enviado"
@@ -662,16 +665,16 @@ msgstr "Define o intervalo de tempo padrão para gráficos quando um sistema é
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:72
#: src/components/routes/settings/layout.tsx:83
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
msgstr "Configurações"
#: src/components/routes/settings/layout.tsx:34
#: src/components/routes/settings/layout.tsx:33
msgid "Settings saved"
msgstr "Definições guardadas"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "Entrar"
@@ -679,7 +682,7 @@ msgstr "Entrar"
msgid "SMTP settings"
msgstr "Configurações SMTP"
#: src/components/systems-table/systems-table.tsx:389
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "Ordenar Por"
@@ -687,18 +690,21 @@ msgstr "Ordenar Por"
msgid "Status"
msgstr "Status"
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:514
msgid "Swap space used by the system"
msgstr "Espaço de swap usado pelo sistema"
#: src/components/routes/system.tsx:522
#: src/components/routes/system.tsx:513
msgid "Swap Usage"
msgstr "Uso de Swap"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:27
#: src/components/systems-table/systems-table.tsx:152
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "Sistema"
@@ -706,70 +712,70 @@ msgstr "Sistema"
msgid "Systems"
msgstr "Sistemas"
#: src/components/routes/settings/config-yaml.tsx:56
#: src/components/routes/settings/config-yaml.tsx:55
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "Os sistemas podem ser gerenciados em um arquivo <0>config.yml</0> dentro do seu diretório de dados."
#: src/components/systems-table/systems-table.tsx:377
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "Tabela"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:244
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr "Temp"
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:534
#: src/components/routes/system.tsx:525
msgid "Temperature"
msgstr "Temperatura"
#: src/components/routes/system.tsx:535
#: src/components/routes/system.tsx:526
msgid "Temperatures of system sensors"
msgstr "Temperaturas dos sensores do sistema"
#: src/components/routes/settings/notifications.tsx:213
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Testar <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:184
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Notificação de teste enviada"
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:146
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "O agente deve estar em execução no sistema para conectar. Copie o comando de instalação para o agente abaixo."
#: src/components/add-system.tsx:138
#: src/components/add-system.tsx:137
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "O agente deve estar em execução no sistema para conectar. Copie o <0>docker-compose.yml</0> para o agente abaixo."
#: src/components/login/forgot-pass-form.tsx:99
#: src/components/login/forgot-pass-form.tsx:98
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "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:699
#: src/components/systems-table/systems-table.tsx:660
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Esta ação não pode ser desfeita. Isso excluirá permanentemente todos os registros atuais de {name} do banco de dados."
#: src/components/routes/system.tsx:615
#: src/components/routes/system.tsx:605
msgid "Throughput of {extraFsName}"
msgstr "Taxa de transferência de {extraFsName}"
#: src/components/routes/system.tsx:482
#: src/components/routes/system.tsx:473
msgid "Throughput of root filesystem"
msgstr "Taxa de transferência do sistema de arquivos raiz"
#: src/components/routes/settings/notifications.tsx:108
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "Para email(s)"
#: src/components/routes/system.tsx:409
#: src/components/routes/system.tsx:422
#: src/components/routes/system.tsx:400
#: src/components/routes/system.tsx:413
msgid "Toggle grid"
msgstr "Alternar grade"
#: src/components/mode-toggle.tsx:34
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "Alternar tema"
@@ -798,32 +804,32 @@ msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Dispara quando o uso de qualquer disco excede um limite"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:343
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:334
msgid "Up"
msgstr ""
#: src/components/systems-table/systems-table.tsx:350
#: src/components/systems-table/systems-table.tsx:337
msgid "Updated in real time. Click on a system to view information."
msgstr "Atualizado em tempo real. Clique em um sistema para ver informações."
#: src/components/routes/system.tsx:270
#: src/components/routes/system.tsx:266
msgid "Uptime"
msgstr "Tempo de Atividade"
#: src/components/routes/system.tsx:568
#: src/components/routes/system.tsx:602
#: src/components/charts/area-chart.tsx:75
#: src/components/routes/system.tsx:555
#: src/components/routes/system.tsx:592
#: src/components/charts/area-chart.tsx:73
msgid "Usage"
msgstr "Uso"
#: src/components/routes/system.tsx:474
#: src/components/routes/system.tsx:465
msgid "Usage of root partition"
msgstr "Uso da partição raiz"
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:63
#: src/components/charts/area-chart.tsx:75
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "Usado"
@@ -832,15 +838,15 @@ msgstr "Usado"
msgid "Users"
msgstr "Usuários"
#: src/components/systems-table/systems-table.tsx:359
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "Visual"
#: src/components/systems-table/systems-table.tsx:424
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "Campos Visíveis"
#: src/components/routes/system.tsx:707
#: src/components/routes/system.tsx:697
msgid "Waiting for enough records to display"
msgstr "Aguardando registros suficientes para exibir"
@@ -848,24 +854,25 @@ msgstr "Aguardando registros suficientes para exibir"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "Quer nos ajudar a melhorar ainda mais nossas traduções? Confira <0>Crowdin</0> para mais detalhes."
#: src/components/routes/settings/notifications.tsx:126
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Notificações Webhook / Push"
#. Disk write
#: src/components/charts/area-chart.tsx:61
#: src/components/charts/area-chart.tsx:71
#: src/components/charts/area-chart.tsx:59
#: src/components/charts/area-chart.tsx:69
msgid "Write"
msgstr "Escrever"
#: src/components/routes/settings/layout.tsx:62
#: src/components/routes/settings/layout.tsx:61
msgid "YAML Config"
msgstr "Configuração YAML"
#: src/components/routes/settings/config-yaml.tsx:46
#: src/components/routes/settings/config-yaml.tsx:45
msgid "YAML Configuration"
msgstr "Configuração YAML"
#: src/components/routes/settings/layout.tsx:35
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "As configurações do seu usuário foram atualizadas."

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: ru\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-03-06 07:27\n"
"PO-Revision-Date: 2025-03-25 08:32\n"
"Last-Translator: \n"
"Language-Team: Russian\n"
"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
@@ -300,12 +300,12 @@ msgstr "Документация"
#: src/components/systems-table/systems-table.tsx:142
#: src/components/routes/system.tsx:345
msgid "Down"
msgstr ""
msgstr "Не в сети"
#: src/components/add-system.tsx:126
#: src/components/systems-table/systems-table.tsx:653
msgid "Edit"
msgstr ""
msgstr "Редактировать"
#: src/components/login/forgot-pass-form.tsx:54
#: src/components/login/auth-form.tsx:176
@@ -553,7 +553,7 @@ msgstr "Пауза"
#: src/components/systems-table/systems-table.tsx:143
msgid "Paused"
msgstr ""
msgstr "Пауза"
#: src/components/routes/settings/notifications.tsx:97
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
@@ -636,7 +636,7 @@ msgstr "Сохранить настройки"
#: src/components/add-system.tsx:232
msgid "Save system"
msgstr ""
msgstr "Сохранить систему"
#: src/components/navbar.tsx:134
msgid "Search"
@@ -717,7 +717,7 @@ msgstr "Таблица"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:244
msgid "Temp"
msgstr ""
msgstr "Темп"
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:534
@@ -801,7 +801,7 @@ msgstr "Срабатывает, когда использование любог
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:343
msgid "Up"
msgstr ""
msgstr "В сети"
#: src/components/systems-table/systems-table.tsx:350
msgid "Updated in real time. Click on a system to view information."
@@ -869,3 +869,4 @@ msgstr "YAML конфигурация"
#: src/components/routes/settings/layout.tsx:35
msgid "Your user settings have been updated."
msgstr "Ваши настройки пользователя были обновлены."

View File

@@ -19,11 +19,11 @@ msgstr ""
"X-Crowdin-File-ID: 16\n"
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:259
#: src/components/routes/system.tsx:255
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# dan} two {# dneva} few {# dni} other {# dni}}"
#: src/components/routes/system.tsx:257
#: src/components/routes/system.tsx:253
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# ura} two {# uri} few {# ur} other {# ur}}"
@@ -48,27 +48,30 @@ msgid "30 days"
msgstr "30 dni"
#. Table column
#: src/components/systems-table/systems-table.tsx:304
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "Dejanja"
#: src/components/routes/home.tsx:94
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Aktivna opozorila"
#: src/components/add-system.tsx:43
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Dodaj <0>sistem</0>"
#: src/components/add-system.tsx:126
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "Dodaj nov sistem"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Add system"
msgstr "Dodaj sistem"
#: src/components/routes/settings/notifications.tsx:158
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Dodaj URL"
@@ -84,21 +87,21 @@ msgstr "Prilagodi možnosti prikaza za grafikone."
msgid "Admin"
msgstr "Administrator"
#: src/components/systems-table/systems-table.tsx:270
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "Agent"
#: src/components/alerts/alert-button.tsx:33
#: src/components/alerts/alert-button.tsx:79
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "Opozorila"
#: src/components/systems-table/systems-table.tsx:347
#: src/components/alerts/alert-button.tsx:99
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
msgid "All Systems"
msgstr "Vsi sistemi"
#: src/components/systems-table/systems-table.tsx:696
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "Ali ste prepričani, da želite izbrisati {name}?"
@@ -106,29 +109,29 @@ msgstr "Ali ste prepričani, da želite izbrisati {name}?"
msgid "Automatic copy requires a secure context."
msgstr "Za samodejno kopiranje je potreben varen kontekst."
#: src/components/routes/system.tsx:670
#: src/components/routes/system.tsx:660
msgid "Average"
msgstr "Povprečno"
#: src/components/routes/system.tsx:446
#: src/components/routes/system.tsx:437
msgid "Average CPU utilization of containers"
msgstr "Povprečna izkoriščenost procesorja kontejnerjev"
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:253
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Povprečje presega <0>{value}{0}</0>"
#: src/components/routes/system.tsx:547
#: src/components/routes/system.tsx:538
msgid "Average power consumption of GPUs"
msgstr "Povprečna poraba energije GPU"
#: src/components/routes/system.tsx:435
#: src/components/routes/system.tsx:426
msgid "Average system-wide CPU utilization"
msgstr "Povprečna CPU izkoriščenost v celotnem sistemu"
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:569
#: src/components/routes/system.tsx:556
msgid "Average utilization of {0}"
msgstr "Povprečna poraba {0}"
@@ -138,31 +141,31 @@ msgid "Backups"
msgstr "Varnostne kopije"
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:491
#: src/components/routes/system.tsx:482
msgid "Bandwidth"
msgstr "Pasovna širina"
#: src/components/login/auth-form.tsx:305
#: src/components/login/auth-form.tsx:306
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel podpira OpenID Connect in številne ponudnike preverjanja pristnosti OAuth2."
#: src/components/routes/settings/notifications.tsx:129
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel uporablja <0>Shoutrrr</0> za integracijo s priljubljenimi storitvami obveščanja."
#: src/components/add-system.tsx:131
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "Binarno"
#: src/components/charts/mem-chart.tsx:87
#: src/components/charts/mem-chart.tsx:89
msgid "Cache / Buffers"
msgstr "Predpomnilnik / medpomnilniki"
#: src/components/systems-table/systems-table.tsx:707
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "Prekliči"
#: src/components/routes/settings/config-yaml.tsx:69
#: src/components/routes/settings/config-yaml.tsx:68
msgid "Caution - potential data loss"
msgstr "Pozor - možna izguba podatkov"
@@ -174,37 +177,37 @@ msgstr "Spremeni splošne možnosti aplikacije."
msgid "Chart options"
msgstr "Možnosti grafikona"
#: src/components/login/forgot-pass-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:34
msgid "Check {email} for a reset link."
msgstr "Preverite {email} za povezavo za ponastavitev."
#: src/components/routes/settings/layout.tsx:41
#: src/components/routes/settings/layout.tsx:40
msgid "Check logs for more details."
msgstr "Za več podrobnosti preverite dnevnike."
#: src/components/routes/settings/notifications.tsx:185
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Preverite storitev obveščanja"
#: src/components/add-system.tsx:205
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "Klikni za kopiranje"
#: src/components/login/forgot-pass-form.tsx:84
#: src/components/login/forgot-pass-form.tsx:90
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Navodila za ukazno vrstico"
#: src/components/routes/settings/notifications.tsx:79
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Nastavi način prejemanja opozorilnih obvestil."
#: src/components/login/auth-form.tsx:213
#: src/components/login/auth-form.tsx:218
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "Potrdite geslo"
#: src/components/systems-table/systems-table.tsx:713
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "Nadaljuj"
@@ -212,16 +215,16 @@ msgstr "Nadaljuj"
msgid "Copied to clipboard"
msgstr "Kopirano v odložišče"
#: src/components/add-system.tsx:216
#: src/components/add-system.tsx:218
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "Kopiraj"
#: src/components/systems-table/systems-table.tsx:678
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "Kopiraj gostitelja"
#: src/components/add-system.tsx:225
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "Kopiraj Linux ukaz"
@@ -229,27 +232,27 @@ msgstr "Kopiraj Linux ukaz"
msgid "Copy text"
msgstr "Kopiraj besedilo"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "CPU"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:434
#: src/components/charts/area-chart.tsx:58
#: src/components/routes/system.tsx:425
#: src/components/charts/area-chart.tsx:56
msgid "CPU Usage"
msgstr "CPU poraba"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "Ustvari račun"
#. Dark theme
#: src/components/mode-toggle.tsx:22
#: src/components/mode-toggle.tsx:21
msgid "Dark"
msgstr "Temno"
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:36
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Nadzorna plošča"
@@ -257,37 +260,37 @@ msgstr "Nadzorna plošča"
msgid "Default time period"
msgstr "Privzeto časovno obdobje"
#: src/components/systems-table/systems-table.tsx:683
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "Izbriši"
#: src/components/systems-table/systems-table.tsx:204
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "Disk"
#: src/components/routes/system.tsx:481
#: src/components/routes/system.tsx:472
msgid "Disk I/O"
msgstr "Disk I/O"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:474
#: src/components/charts/disk-chart.tsx:77
#: src/components/routes/system.tsx:465
#: src/components/charts/disk-chart.tsx:79
msgid "Disk Usage"
msgstr "Poraba diska"
#: src/components/routes/system.tsx:603
#: src/components/routes/system.tsx:593
msgid "Disk usage of {extraFsName}"
msgstr "Poraba diska za {extraFsName}"
#: src/components/routes/system.tsx:445
#: src/components/routes/system.tsx:436
msgid "Docker CPU Usage"
msgstr "Docker CPU poraba"
#: src/components/routes/system.tsx:466
#: src/components/routes/system.tsx:457
msgid "Docker Memory Usage"
msgstr "Docker poraba spomina"
#: src/components/routes/system.tsx:507
#: src/components/routes/system.tsx:498
msgid "Docker Network I/O"
msgstr "Docker I/O mreže"
@@ -297,22 +300,22 @@ msgstr "Dokumentacija"
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:142
#: src/components/routes/system.tsx:345
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:336
msgid "Down"
msgstr ""
#: src/components/add-system.tsx:126
#: src/components/systems-table/systems-table.tsx:653
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr ""
#: src/components/login/forgot-pass-form.tsx:54
#: src/components/login/auth-form.tsx:176
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
msgid "Email"
msgstr "E-pošta"
#: src/components/routes/settings/notifications.tsx:93
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "E-poštna obvestila"
@@ -320,32 +323,32 @@ msgstr "E-poštna obvestila"
msgid "Enter email address to reset password"
msgstr "Vnesite e-poštni naslov za ponastavitev gesla"
#: src/components/routes/settings/notifications.tsx:113
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Vnesite e-poštni naslov..."
#: src/components/routes/settings/notifications.tsx:189
#: src/components/routes/settings/config-yaml.tsx:29
#: src/components/login/auth-form.tsx:137
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "Napaka"
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: src/components/routes/home.tsx:113
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "Preseženo {0}{1} v zadnjih {2, plural, one {# minuti} other {# minutah}}"
#: src/components/routes/settings/config-yaml.tsx:73
#: src/components/routes/settings/config-yaml.tsx:72
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "Obstoječi sistemi, ki niso definirani v <0>config.yml</0>, bodo izbrisani. Prosimo, naredite redne varnostne kopije."
#: src/components/routes/settings/config-yaml.tsx:94
#: src/components/routes/settings/config-yaml.tsx:93
msgid "Export configuration"
msgstr "Izvozi nastavitve"
#: src/components/routes/settings/config-yaml.tsx:49
#: src/components/routes/settings/config-yaml.tsx:48
msgid "Export your current systems configuration."
msgstr "Izvozi trenutne nastavitve sistema."
@@ -353,60 +356,60 @@ msgstr "Izvozi trenutne nastavitve sistema."
msgid "Failed to authenticate"
msgstr "Preverjanje pristnosti ni uspelo"
#: src/components/routes/settings/notifications.tsx:64
#: src/components/routes/settings/layout.tsx:40
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
msgid "Failed to save settings"
msgstr "Shranjevanje nastavitev ni uspelo"
#: src/components/routes/settings/notifications.tsx:190
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Pošiljanje testnega obvestila ni uspelo"
#: src/components/alerts/alerts-system.tsx:26
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Opozorila ni bilo mogoče posodobiti"
#: src/components/systems-table/systems-table.tsx:354
#: src/components/routes/system.tsx:643
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:633
msgid "Filter..."
msgstr "Filter..."
#: src/components/alerts/alerts-system.tsx:285
#: src/components/alerts/alerts-system.tsx:230
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "Za <0>{min}</0> {min, plural, one {minuto} other {minut}}"
#: src/components/login/auth-form.tsx:328
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "Pozabljeno geslo?"
#. Context: General settings
#: src/components/routes/settings/layout.tsx:52
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "Splošno"
#: src/components/routes/system.tsx:546
#: src/components/routes/system.tsx:537
msgid "GPU Power Draw"
msgstr "GPU poraba moči"
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "Mreža"
#: src/components/add-system.tsx:159
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "Gostitelj / IP"
#: src/components/login/forgot-pass-form.tsx:94
#: src/components/login/forgot-pass-form.tsx:93
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Če ste izgubili geslo za svoj skrbniški račun, ga lahko ponastavite z naslednjim ukazom."
#: src/components/login/auth-form.tsx:18
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Napačen e-poštni naslov."
#. Linux kernel
#: src/components/routes/system.tsx:271
#: src/components/routes/system.tsx:267
msgid "Kernel"
msgstr "Jedro"
@@ -414,12 +417,12 @@ msgstr "Jedro"
msgid "Language"
msgstr "Jezik"
#: src/components/systems-table/systems-table.tsx:367
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "Postavitev"
#. Light theme
#: src/components/mode-toggle.tsx:17
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Svetlo"
@@ -431,8 +434,8 @@ msgstr "Odjava"
msgid "Login"
msgstr "Prijava"
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "Poskus prijave ni uspel"
@@ -441,49 +444,49 @@ msgstr "Poskus prijave ni uspel"
msgid "Logs"
msgstr "Dnevniki"
#: src/components/routes/settings/notifications.tsx:82
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "Namesto tega iščete, kje ustvariti opozorila? Kliknite ikone zvonca <0/> v sistemski tabeli."
#: src/components/routes/settings/layout.tsx:86
#: src/components/routes/settings/layout.tsx:85
msgid "Manage display and notification preferences."
msgstr "Upravljajte nastavitve prikaza in obvestil."
#: src/components/add-system.tsx:227
#: src/components/add-system.tsx:226
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:673
#: src/components/routes/system.tsx:663
msgid "Max 1 min"
msgstr "Največ 1 min"
#: src/components/systems-table/systems-table.tsx:195
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "Pomnilnik"
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:456
#: src/components/routes/system.tsx:447
msgid "Memory Usage"
msgstr "Poraba pomnilnika"
#: src/components/routes/system.tsx:467
#: src/components/routes/system.tsx:458
msgid "Memory usage of docker containers"
msgstr "Poraba pomnilnika docker kontejnerjev"
#: src/components/add-system.tsx:155
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "Naziv"
#: src/components/systems-table/systems-table.tsx:223
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "Mreža"
#: src/components/routes/system.tsx:508
#: src/components/routes/system.tsx:499
msgid "Network traffic of docker containers"
msgstr "Omrežni promet docker kontejnerjev"
#: src/components/routes/system.tsx:493
#: src/components/routes/system.tsx:484
msgid "Network traffic of public interfaces"
msgstr "Omrežni promet javnih vmesnikov"
@@ -491,34 +494,34 @@ msgstr "Omrežni promet javnih vmesnikov"
msgid "No results found."
msgstr "Ni rezultatov."
#: src/components/systems-table/systems-table.tsx:472
#: src/components/systems-table/systems-table.tsx:495
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "Ne najdem sistema."
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:76
#: src/components/routes/settings/layout.tsx:57
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
msgid "Notifications"
msgstr "Obvestila"
#: src/components/login/auth-form.tsx:300
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "Podpora za OAuth 2 / OIDC"
#: src/components/routes/settings/config-yaml.tsx:62
#: src/components/routes/settings/config-yaml.tsx:61
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "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:639
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "Odpri menu"
#: src/components/login/auth-form.tsx:251
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "Ali nadaljuj z"
#: src/components/alerts/alert-button.tsx:120
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "Prepiši obstoječe alarme"
@@ -530,41 +533,41 @@ msgstr "Stran"
msgid "Pages / Settings"
msgstr "Strani / Nastavitve"
#: src/components/login/auth-form.tsx:195
#: src/components/login/auth-form.tsx:200
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "Geslo"
#: src/components/login/auth-form.tsx:21
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "Geslo mora imeti vsaj 8 znakov."
#: src/components/login/auth-form.tsx:22
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr ""
#: src/components/login/forgot-pass-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Prejeta zahteva za ponastavitev gesla"
#: src/components/systems-table/systems-table.tsx:672
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "Premor"
#: src/components/systems-table/systems-table.tsx:143
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr ""
#: src/components/routes/settings/notifications.tsx:97
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "<0>Nastavite strežnik SMTP</0>, da zagotovite dostavo opozoril."
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Za več podrobnosti preverite dnevnike."
#: src/components/login/forgot-pass-form.tsx:17
#: src/components/login/auth-form.tsx:41
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "Preverite svoje poverilnice in poskusite znova"
@@ -572,7 +575,7 @@ msgstr "Preverite svoje poverilnice in poskusite znova"
msgid "Please create an admin account"
msgstr "Ustvarite skrbniški račun"
#: src/components/login/auth-form.tsx:138
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Omogočite pojavna okna za to spletno mesto"
@@ -580,7 +583,7 @@ msgstr "Omogočite pojavna okna za to spletno mesto"
msgid "Please log in again"
msgstr "Prosimo, prijavite se znova"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Za navodila glejte <0>dokumentacijo</0>."
@@ -588,12 +591,12 @@ msgstr "Za navodila glejte <0>dokumentacijo</0>."
msgid "Please sign in to your account"
msgstr "Prijavite se v svoj račun"
#: src/components/add-system.tsx:171
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "Vrata"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:577
#: src/components/routes/system.tsx:448
#: src/components/routes/system.tsx:564
msgid "Precise utilization at the recorded time"
msgstr "Natančna poraba v zabeleženem času"
@@ -602,39 +605,39 @@ msgid "Preferred Language"
msgstr "Prednostni jezik"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:182
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "Javni ključ"
#. Disk read
#: src/components/charts/area-chart.tsx:62
#: src/components/charts/area-chart.tsx:72
#: src/components/charts/area-chart.tsx:60
#: src/components/charts/area-chart.tsx:70
msgid "Read"
msgstr "Preberano"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx:67
#: src/components/charts/area-chart.tsx:65
msgid "Received"
msgstr "Prejeto"
#: src/components/login/forgot-pass-form.tsx:77
#: src/components/login/forgot-pass-form.tsx:76
msgid "Reset Password"
msgstr "Ponastavi geslo"
#: src/components/systems-table/systems-table.tsx:667
#: src/components/systems-table/systems-table.tsx:628
msgid "Resume"
msgstr "Nadaljuj"
#: src/components/routes/settings/notifications.tsx:119
#: src/components/routes/settings/notifications.tsx:118
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Shranite naslov s tipko enter ali vejico. Pustite prazno, da onemogočite e-poštna obvestila."
#: src/components/routes/settings/notifications.tsx:169
#: src/components/routes/settings/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
msgid "Save Settings"
msgstr "Shrani nastavitve"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr ""
@@ -646,12 +649,12 @@ msgstr "Iskanje"
msgid "Search for systems or settings..."
msgstr "Iskanje sistemov ali nastavitev..."
#: src/components/alerts/alert-button.tsx:82
#: src/components/alerts/alert-button.tsx:71
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Glejte <0>nastavitve obvestil</0>, da nastavite način prejemanja opozoril."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx:66
#: src/components/charts/area-chart.tsx:64
msgid "Sent"
msgstr "Poslano"
@@ -662,16 +665,16 @@ msgstr "Nastavi privzeti časovni obseg za grafikone, ko si ogledujete sistem."
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:72
#: src/components/routes/settings/layout.tsx:83
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
msgstr "Nastavitve"
#: src/components/routes/settings/layout.tsx:34
#: src/components/routes/settings/layout.tsx:33
msgid "Settings saved"
msgstr "Nastavitve so shranjene"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "Prijavite se"
@@ -679,7 +682,7 @@ msgstr "Prijavite se"
msgid "SMTP settings"
msgstr "SMTP nastavitve"
#: src/components/systems-table/systems-table.tsx:389
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "Razvrsti po"
@@ -687,18 +690,21 @@ msgstr "Razvrsti po"
msgid "Status"
msgstr "Status"
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:514
msgid "Swap space used by the system"
msgstr "Swap prostor, ki ga uporablja sistem"
#: src/components/routes/system.tsx:522
#: src/components/routes/system.tsx:513
msgid "Swap Usage"
msgstr "Swap uporaba"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:27
#: src/components/systems-table/systems-table.tsx:152
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "Sistemsko"
@@ -706,70 +712,70 @@ msgstr "Sistemsko"
msgid "Systems"
msgstr "Sistemi"
#: src/components/routes/settings/config-yaml.tsx:56
#: src/components/routes/settings/config-yaml.tsx:55
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "Sisteme lahko upravljate v datoteki <0>config.yml</0> v vašem podatkovnem imeniku."
#: src/components/systems-table/systems-table.tsx:377
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "Tabela"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:244
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr ""
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:534
#: src/components/routes/system.tsx:525
msgid "Temperature"
msgstr "Temperatura"
#: src/components/routes/system.tsx:535
#: src/components/routes/system.tsx:526
msgid "Temperatures of system sensors"
msgstr "Temperature sistemskih senzorjev"
#: src/components/routes/settings/notifications.tsx:213
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Preveri <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:184
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Testno obvestilo je poslano"
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:146
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "Za vzpostavitev povezave mora biti agent zagnan v sistemu. Kopirajte spodnji namestitveni ukaz za agenta."
#: src/components/add-system.tsx:138
#: src/components/add-system.tsx:137
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "Za vzpostavitev povezave mora biti agent zagnan v sistemu. Kopirajte <0>docker-compose.yml</0> za spodnjega agenta."
#: src/components/login/forgot-pass-form.tsx:99
#: src/components/login/forgot-pass-form.tsx:98
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Nato se prijavite v zaledni sistem in ponastavite geslo svojega uporabniškega računa v tabeli uporabnikov."
#: src/components/systems-table/systems-table.tsx:699
#: src/components/systems-table/systems-table.tsx:660
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Tega dejanja ni mogoče razveljaviti. To bo trajno izbrisalo vse trenutne zapise za {name} iz zbirke podatkov."
#: src/components/routes/system.tsx:615
#: src/components/routes/system.tsx:605
msgid "Throughput of {extraFsName}"
msgstr "Prepustnost {extraFsName}"
#: src/components/routes/system.tsx:482
#: src/components/routes/system.tsx:473
msgid "Throughput of root filesystem"
msgstr "Prepustnost korenskega datotečnega sistema"
#: src/components/routes/settings/notifications.tsx:108
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "E-pošta za"
#: src/components/routes/system.tsx:409
#: src/components/routes/system.tsx:422
#: src/components/routes/system.tsx:400
#: src/components/routes/system.tsx:413
msgid "Toggle grid"
msgstr "Preklopi način mreže"
#: src/components/mode-toggle.tsx:34
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "Obrni temo"
@@ -798,32 +804,32 @@ msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Sproži se, ko uporaba katerega koli diska preseže prag"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:343
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:334
msgid "Up"
msgstr ""
#: src/components/systems-table/systems-table.tsx:350
#: src/components/systems-table/systems-table.tsx:337
msgid "Updated in real time. Click on a system to view information."
msgstr "Posodobljeno v realnem času. Za ogled informacij kliknite na sistem."
#: src/components/routes/system.tsx:270
#: src/components/routes/system.tsx:266
msgid "Uptime"
msgstr "Čas delovanja"
#: src/components/routes/system.tsx:568
#: src/components/routes/system.tsx:602
#: src/components/charts/area-chart.tsx:75
#: src/components/routes/system.tsx:555
#: src/components/routes/system.tsx:592
#: src/components/charts/area-chart.tsx:73
msgid "Usage"
msgstr "Uporaba"
#: src/components/routes/system.tsx:474
#: src/components/routes/system.tsx:465
msgid "Usage of root partition"
msgstr "Uporaba korenske particije"
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:63
#: src/components/charts/area-chart.tsx:75
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "Uporabljeno"
@@ -832,15 +838,15 @@ msgstr "Uporabljeno"
msgid "Users"
msgstr "Uporabniki"
#: src/components/systems-table/systems-table.tsx:359
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "Pogled"
#: src/components/systems-table/systems-table.tsx:424
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "Vidna polja"
#: src/components/routes/system.tsx:707
#: src/components/routes/system.tsx:697
msgid "Waiting for enough records to display"
msgstr "Čakam na dovolj zapisov za prikaz"
@@ -848,24 +854,25 @@ msgstr "Čakam na dovolj zapisov za prikaz"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "Ali nam želite pomagati, da bomo naše prevode še izboljšali? Za več podrobnosti si oglejte <0>Crowdin</0>."
#: src/components/routes/settings/notifications.tsx:126
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / potisna obvestila"
#. Disk write
#: src/components/charts/area-chart.tsx:61
#: src/components/charts/area-chart.tsx:71
#: src/components/charts/area-chart.tsx:59
#: src/components/charts/area-chart.tsx:69
msgid "Write"
msgstr "Pisanje"
#: src/components/routes/settings/layout.tsx:62
#: src/components/routes/settings/layout.tsx:61
msgid "YAML Config"
msgstr "YAML nastaviitev"
#: src/components/routes/settings/config-yaml.tsx:46
#: src/components/routes/settings/config-yaml.tsx:45
msgid "YAML Configuration"
msgstr "YAML nastavitev"
#: src/components/routes/settings/layout.tsx:35
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "Vaše uporabniške nastavitve so posodobljene."

View File

@@ -19,11 +19,11 @@ msgstr ""
"X-Crowdin-File-ID: 16\n"
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:259
#: src/components/routes/system.tsx:255
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# dag} other {# dagar}}"
#: src/components/routes/system.tsx:257
#: src/components/routes/system.tsx:253
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# timme} other {# timmar}}"
@@ -48,27 +48,30 @@ msgid "30 days"
msgstr "30 dagar"
#. Table column
#: src/components/systems-table/systems-table.tsx:304
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "Åtgärder"
#: src/components/routes/home.tsx:94
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Aktiva larm"
#: src/components/add-system.tsx:43
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Lägg till <0>System</0>"
#: src/components/add-system.tsx:126
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "Lägg till nytt system"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Add system"
msgstr "Lägg till system"
#: src/components/routes/settings/notifications.tsx:158
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Lägg till URL"
@@ -84,21 +87,21 @@ msgstr "Justera visningsalternativ för diagram."
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx:270
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "Agent"
#: src/components/alerts/alert-button.tsx:33
#: src/components/alerts/alert-button.tsx:79
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "Larm"
#: src/components/systems-table/systems-table.tsx:347
#: src/components/alerts/alert-button.tsx:99
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
msgid "All Systems"
msgstr "Alla system"
#: src/components/systems-table/systems-table.tsx:696
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "Är du säker på att du vill ta bort {name}?"
@@ -106,29 +109,29 @@ msgstr "Är du säker på att du vill ta bort {name}?"
msgid "Automatic copy requires a secure context."
msgstr "Automatisk kopiering kräver en säker kontext."
#: src/components/routes/system.tsx:670
#: src/components/routes/system.tsx:660
msgid "Average"
msgstr "Genomsnitt"
#: src/components/routes/system.tsx:446
#: src/components/routes/system.tsx:437
msgid "Average CPU utilization of containers"
msgstr "Genomsnittlig CPU-användning för containrar"
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:253
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Genomsnittet överskrider <0>{value}{0}</0>"
#: src/components/routes/system.tsx:547
#: src/components/routes/system.tsx:538
msgid "Average power consumption of GPUs"
msgstr "Genomsnittlig strömförbrukning för GPU:er"
#: src/components/routes/system.tsx:435
#: src/components/routes/system.tsx:426
msgid "Average system-wide CPU utilization"
msgstr "Genomsnittlig systemomfattande CPU-användning"
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:569
#: src/components/routes/system.tsx:556
msgid "Average utilization of {0}"
msgstr "Genomsnittlig användning av {0}"
@@ -138,31 +141,31 @@ msgid "Backups"
msgstr "Säkerhetskopior"
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:491
#: src/components/routes/system.tsx:482
msgid "Bandwidth"
msgstr "Bandbredd"
#: src/components/login/auth-form.tsx:305
#: src/components/login/auth-form.tsx:306
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel stöder OpenID Connect och många OAuth2-autentiseringsleverantörer."
#: src/components/routes/settings/notifications.tsx:129
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel använder <0>Shoutrrr</0> för att integrera med populära aviseringstjänster."
#: src/components/add-system.tsx:131
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "Binär"
#: src/components/charts/mem-chart.tsx:87
#: src/components/charts/mem-chart.tsx:89
msgid "Cache / Buffers"
msgstr "Cache / Buffertar"
#: src/components/systems-table/systems-table.tsx:707
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "Avbryt"
#: src/components/routes/settings/config-yaml.tsx:69
#: src/components/routes/settings/config-yaml.tsx:68
msgid "Caution - potential data loss"
msgstr "Varning - potentiell dataförlust"
@@ -174,37 +177,37 @@ msgstr "Ändra allmänna programalternativ."
msgid "Chart options"
msgstr "Diagramalternativ"
#: src/components/login/forgot-pass-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:34
msgid "Check {email} for a reset link."
msgstr "Kontrollera {email} för en återställningslänk."
#: src/components/routes/settings/layout.tsx:41
#: src/components/routes/settings/layout.tsx:40
msgid "Check logs for more details."
msgstr "Kontrollera loggarna för mer information."
#: src/components/routes/settings/notifications.tsx:185
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Kontrollera din aviseringstjänst"
#: src/components/add-system.tsx:205
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "Klicka för att kopiera"
#: src/components/login/forgot-pass-form.tsx:84
#: src/components/login/forgot-pass-form.tsx:90
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Instruktioner för kommandoraden"
#: src/components/routes/settings/notifications.tsx:79
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Konfigurera hur du tar emot larmaviseringar."
#: src/components/login/auth-form.tsx:213
#: src/components/login/auth-form.tsx:218
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "Bekräfta lösenord"
#: src/components/systems-table/systems-table.tsx:713
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "Fortsätt"
@@ -212,16 +215,16 @@ msgstr "Fortsätt"
msgid "Copied to clipboard"
msgstr "Kopierat till urklipp"
#: src/components/add-system.tsx:216
#: src/components/add-system.tsx:218
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "Kopiera"
#: src/components/systems-table/systems-table.tsx:678
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "Kopiera värd"
#: src/components/add-system.tsx:225
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "Kopiera Linux-kommando"
@@ -229,27 +232,27 @@ msgstr "Kopiera Linux-kommando"
msgid "Copy text"
msgstr "Kopiera text"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "CPU"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:434
#: src/components/charts/area-chart.tsx:58
#: src/components/routes/system.tsx:425
#: src/components/charts/area-chart.tsx:56
msgid "CPU Usage"
msgstr "CPU-användning"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "Skapa konto"
#. Dark theme
#: src/components/mode-toggle.tsx:22
#: src/components/mode-toggle.tsx:21
msgid "Dark"
msgstr "Mörkt"
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:36
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Dashboard"
@@ -257,37 +260,37 @@ msgstr "Dashboard"
msgid "Default time period"
msgstr "Standardtidsperiod"
#: src/components/systems-table/systems-table.tsx:683
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "Ta bort"
#: src/components/systems-table/systems-table.tsx:204
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "Disk"
#: src/components/routes/system.tsx:481
#: src/components/routes/system.tsx:472
msgid "Disk I/O"
msgstr "Disk I/O"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:474
#: src/components/charts/disk-chart.tsx:77
#: src/components/routes/system.tsx:465
#: src/components/charts/disk-chart.tsx:79
msgid "Disk Usage"
msgstr "Diskanvändning"
#: src/components/routes/system.tsx:603
#: src/components/routes/system.tsx:593
msgid "Disk usage of {extraFsName}"
msgstr "Diskanvändning av {extraFsName}"
#: src/components/routes/system.tsx:445
#: src/components/routes/system.tsx:436
msgid "Docker CPU Usage"
msgstr "Docker CPU-användning"
#: src/components/routes/system.tsx:466
#: src/components/routes/system.tsx:457
msgid "Docker Memory Usage"
msgstr "Docker Minnesanvändning"
#: src/components/routes/system.tsx:507
#: src/components/routes/system.tsx:498
msgid "Docker Network I/O"
msgstr "Docker Nätverks-I/O"
@@ -297,22 +300,22 @@ msgstr "Dokumentation"
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:142
#: src/components/routes/system.tsx:345
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:336
msgid "Down"
msgstr ""
#: src/components/add-system.tsx:126
#: src/components/systems-table/systems-table.tsx:653
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr ""
#: src/components/login/forgot-pass-form.tsx:54
#: src/components/login/auth-form.tsx:176
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
msgid "Email"
msgstr "E-post"
#: src/components/routes/settings/notifications.tsx:93
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "E-postaviseringar"
@@ -320,32 +323,32 @@ msgstr "E-postaviseringar"
msgid "Enter email address to reset password"
msgstr "Ange e-postadress för att återställa lösenord"
#: src/components/routes/settings/notifications.tsx:113
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Ange e-postadress..."
#: src/components/routes/settings/notifications.tsx:189
#: src/components/routes/settings/config-yaml.tsx:29
#: src/components/login/auth-form.tsx:137
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "Fel"
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: src/components/routes/home.tsx:113
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "Överskrider {0}{1} under de senaste {2, plural, one {# minuten} other {# minuterna}}"
#: src/components/routes/settings/config-yaml.tsx:73
#: src/components/routes/settings/config-yaml.tsx:72
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "Befintliga system som inte definieras i <0>config.yml</0> kommer att tas bort. Gör regelbundna säkerhetskopior."
#: src/components/routes/settings/config-yaml.tsx:94
#: src/components/routes/settings/config-yaml.tsx:93
msgid "Export configuration"
msgstr "Exportera konfiguration"
#: src/components/routes/settings/config-yaml.tsx:49
#: src/components/routes/settings/config-yaml.tsx:48
msgid "Export your current systems configuration."
msgstr "Exportera din nuvarande systemkonfiguration."
@@ -353,60 +356,60 @@ msgstr "Exportera din nuvarande systemkonfiguration."
msgid "Failed to authenticate"
msgstr "Autentisering misslyckades"
#: src/components/routes/settings/notifications.tsx:64
#: src/components/routes/settings/layout.tsx:40
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
msgid "Failed to save settings"
msgstr "Kunde inte spara inställningar"
#: src/components/routes/settings/notifications.tsx:190
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Kunde inte skicka testavisering"
#: src/components/alerts/alerts-system.tsx:26
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Kunde inte uppdatera larm"
#: src/components/systems-table/systems-table.tsx:354
#: src/components/routes/system.tsx:643
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:633
msgid "Filter..."
msgstr "Filtrera..."
#: src/components/alerts/alerts-system.tsx:285
#: src/components/alerts/alerts-system.tsx:230
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "Under <0>{min}</0> {min, plural, one {minut} other {minuter}}"
#: src/components/login/auth-form.tsx:328
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "Glömt lösenordet?"
#. Context: General settings
#: src/components/routes/settings/layout.tsx:52
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "Allmänt"
#: src/components/routes/system.tsx:546
#: src/components/routes/system.tsx:537
msgid "GPU Power Draw"
msgstr "GPU-strömförbrukning"
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "Rutnät"
#: src/components/add-system.tsx:159
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "Värd / IP"
#: src/components/login/forgot-pass-form.tsx:94
#: src/components/login/forgot-pass-form.tsx:93
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Om du har glömt lösenordet till ditt administratörskonto kan du återställa det med följande kommando."
#: src/components/login/auth-form.tsx:18
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Ogiltig e-postadress."
#. Linux kernel
#: src/components/routes/system.tsx:271
#: src/components/routes/system.tsx:267
msgid "Kernel"
msgstr "Kärna"
@@ -414,12 +417,12 @@ msgstr "Kärna"
msgid "Language"
msgstr "Språk"
#: src/components/systems-table/systems-table.tsx:367
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "Layout"
#. Light theme
#: src/components/mode-toggle.tsx:17
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Ljust"
@@ -431,8 +434,8 @@ msgstr "Logga ut"
msgid "Login"
msgstr "Logga in"
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "Inloggningsförsök misslyckades"
@@ -441,49 +444,49 @@ msgstr "Inloggningsförsök misslyckades"
msgid "Logs"
msgstr "Loggar"
#: src/components/routes/settings/notifications.tsx:82
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "Letar du istället efter var du skapar larm? Klicka på klockikonerna <0/> i systemtabellen."
#: src/components/routes/settings/layout.tsx:86
#: src/components/routes/settings/layout.tsx:85
msgid "Manage display and notification preferences."
msgstr "Hantera visnings- och aviseringsinställningar."
#: src/components/add-system.tsx:227
#: src/components/add-system.tsx:226
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:673
#: src/components/routes/system.tsx:663
msgid "Max 1 min"
msgstr "Max 1 min"
#: src/components/systems-table/systems-table.tsx:195
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "Minne"
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:456
#: src/components/routes/system.tsx:447
msgid "Memory Usage"
msgstr "Minnesanvändning"
#: src/components/routes/system.tsx:467
#: src/components/routes/system.tsx:458
msgid "Memory usage of docker containers"
msgstr "Minnesanvändning för dockercontainrar"
#: src/components/add-system.tsx:155
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "Namn"
#: src/components/systems-table/systems-table.tsx:223
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "Nät"
#: src/components/routes/system.tsx:508
#: src/components/routes/system.tsx:499
msgid "Network traffic of docker containers"
msgstr "Nätverkstrafik för dockercontainrar"
#: src/components/routes/system.tsx:493
#: src/components/routes/system.tsx:484
msgid "Network traffic of public interfaces"
msgstr "Nätverkstrafik för publika gränssnitt"
@@ -491,34 +494,34 @@ msgstr "Nätverkstrafik för publika gränssnitt"
msgid "No results found."
msgstr "Inga resultat hittades."
#: src/components/systems-table/systems-table.tsx:472
#: src/components/systems-table/systems-table.tsx:495
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "Inga system hittades."
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:76
#: src/components/routes/settings/layout.tsx:57
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
msgid "Notifications"
msgstr "Aviseringar"
#: src/components/login/auth-form.tsx:300
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "Stöd för OAuth 2 / OIDC"
#: src/components/routes/settings/config-yaml.tsx:62
#: src/components/routes/settings/config-yaml.tsx:61
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "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:639
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "Öppna menyn"
#: src/components/login/auth-form.tsx:251
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "Eller fortsätt med"
#: src/components/alerts/alert-button.tsx:120
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "Skriv över befintliga larm"
@@ -530,41 +533,41 @@ msgstr "Sida"
msgid "Pages / Settings"
msgstr "Sidor / Inställningar"
#: src/components/login/auth-form.tsx:195
#: src/components/login/auth-form.tsx:200
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "Lösenord"
#: src/components/login/auth-form.tsx:21
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "Lösenordet måste vara minst 8 tecken."
#: src/components/login/auth-form.tsx:22
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr ""
#: src/components/login/forgot-pass-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Begäran om återställning av lösenord mottagen"
#: src/components/systems-table/systems-table.tsx:672
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "Paus"
#: src/components/systems-table/systems-table.tsx:143
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr ""
#: src/components/routes/settings/notifications.tsx:97
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "Vänligen <0>konfigurera en SMTP-server</0> för att säkerställa att larm levereras."
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Vänligen kontrollera loggarna för mer information."
#: src/components/login/forgot-pass-form.tsx:17
#: src/components/login/auth-form.tsx:41
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "Vänligen kontrollera dina inloggningsuppgifter och försök igen"
@@ -572,7 +575,7 @@ msgstr "Vänligen kontrollera dina inloggningsuppgifter och försök igen"
msgid "Please create an admin account"
msgstr "Vänligen skapa ett administratörskonto"
#: src/components/login/auth-form.tsx:138
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Vänligen aktivera popup-fönster för den här webbplatsen"
@@ -580,7 +583,7 @@ msgstr "Vänligen aktivera popup-fönster för den här webbplatsen"
msgid "Please log in again"
msgstr "Vänligen logga in igen"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Vänligen se <0>dokumentationen</0> för instruktioner."
@@ -588,12 +591,12 @@ msgstr "Vänligen se <0>dokumentationen</0> för instruktioner."
msgid "Please sign in to your account"
msgstr "Vänligen logga in på ditt konto"
#: src/components/add-system.tsx:171
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "Port"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:577
#: src/components/routes/system.tsx:448
#: src/components/routes/system.tsx:564
msgid "Precise utilization at the recorded time"
msgstr "Exakt användning vid den registrerade tidpunkten"
@@ -602,39 +605,39 @@ msgid "Preferred Language"
msgstr "Föredraget språk"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:182
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "Offentlig nyckel"
#. Disk read
#: src/components/charts/area-chart.tsx:62
#: src/components/charts/area-chart.tsx:72
#: src/components/charts/area-chart.tsx:60
#: src/components/charts/area-chart.tsx:70
msgid "Read"
msgstr "Läs"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx:67
#: src/components/charts/area-chart.tsx:65
msgid "Received"
msgstr "Mottaget"
#: src/components/login/forgot-pass-form.tsx:77
#: src/components/login/forgot-pass-form.tsx:76
msgid "Reset Password"
msgstr "Återställ lösenord"
#: src/components/systems-table/systems-table.tsx:667
#: src/components/systems-table/systems-table.tsx:628
msgid "Resume"
msgstr "Återuppta"
#: src/components/routes/settings/notifications.tsx:119
#: src/components/routes/settings/notifications.tsx:118
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Spara adressen med Enter-tangenten eller komma. Lämna tomt för att inaktivera e-postaviseringar."
#: src/components/routes/settings/notifications.tsx:169
#: src/components/routes/settings/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
msgid "Save Settings"
msgstr "Spara inställningar"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr ""
@@ -646,12 +649,12 @@ msgstr "Sök"
msgid "Search for systems or settings..."
msgstr "Sök efter system eller inställningar..."
#: src/components/alerts/alert-button.tsx:82
#: src/components/alerts/alert-button.tsx:71
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Se <0>aviseringsinställningar</0> för att konfigurera hur du tar emot larm."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx:66
#: src/components/charts/area-chart.tsx:64
msgid "Sent"
msgstr "Skickat"
@@ -662,16 +665,16 @@ msgstr "Anger standardtidsintervallet för diagram när ett system visas."
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:72
#: src/components/routes/settings/layout.tsx:83
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
msgstr "Inställningar"
#: src/components/routes/settings/layout.tsx:34
#: src/components/routes/settings/layout.tsx:33
msgid "Settings saved"
msgstr "Inställningar sparade"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "Logga in"
@@ -679,7 +682,7 @@ msgstr "Logga in"
msgid "SMTP settings"
msgstr "SMTP-inställningar"
#: src/components/systems-table/systems-table.tsx:389
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "Sortera efter"
@@ -687,18 +690,21 @@ msgstr "Sortera efter"
msgid "Status"
msgstr "Status"
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:514
msgid "Swap space used by the system"
msgstr "Swap-utrymme som används av systemet"
#: src/components/routes/system.tsx:522
#: src/components/routes/system.tsx:513
msgid "Swap Usage"
msgstr "Swap-användning"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:27
#: src/components/systems-table/systems-table.tsx:152
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "System"
@@ -706,70 +712,70 @@ msgstr "System"
msgid "Systems"
msgstr "System"
#: src/components/routes/settings/config-yaml.tsx:56
#: src/components/routes/settings/config-yaml.tsx:55
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "System kan hanteras i en <0>config.yml</0>-fil i din datakatalog."
#: src/components/systems-table/systems-table.tsx:377
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "Tabell"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:244
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr ""
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:534
#: src/components/routes/system.tsx:525
msgid "Temperature"
msgstr "Temperatur"
#: src/components/routes/system.tsx:535
#: src/components/routes/system.tsx:526
msgid "Temperatures of system sensors"
msgstr "Temperaturer för systemsensorer"
#: src/components/routes/settings/notifications.tsx:213
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Testa <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:184
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Testavisering skickad"
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:146
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "Agenten måste köras på systemet för att ansluta. Kopiera installationskommandot för agenten nedan."
#: src/components/add-system.tsx:138
#: src/components/add-system.tsx:137
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "Agenten måste köras på systemet för att ansluta. Kopiera <0>docker-compose.yml</0> för agenten nedan."
#: src/components/login/forgot-pass-form.tsx:99
#: src/components/login/forgot-pass-form.tsx:98
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Logga sedan in på backend och återställ ditt användarkontos lösenord i användartabellen."
#: src/components/systems-table/systems-table.tsx:699
#: src/components/systems-table/systems-table.tsx:660
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Den här åtgärden kan inte ångras. Detta kommer permanent att ta bort alla aktuella poster för {name} från databasen."
#: src/components/routes/system.tsx:615
#: src/components/routes/system.tsx:605
msgid "Throughput of {extraFsName}"
msgstr "Genomströmning av {extraFsName}"
#: src/components/routes/system.tsx:482
#: src/components/routes/system.tsx:473
msgid "Throughput of root filesystem"
msgstr "Genomströmning av rotfilsystemet"
#: src/components/routes/settings/notifications.tsx:108
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "Till e-postadress(er)"
#: src/components/routes/system.tsx:409
#: src/components/routes/system.tsx:422
#: src/components/routes/system.tsx:400
#: src/components/routes/system.tsx:413
msgid "Toggle grid"
msgstr "Växla rutnät"
#: src/components/mode-toggle.tsx:34
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "Växla tema"
@@ -798,32 +804,32 @@ msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Utlöses när användningen av någon disk överskrider ett tröskelvärde"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:343
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:334
msgid "Up"
msgstr ""
#: src/components/systems-table/systems-table.tsx:350
#: src/components/systems-table/systems-table.tsx:337
msgid "Updated in real time. Click on a system to view information."
msgstr "Uppdateras i realtid. Klicka på ett system för att visa information."
#: src/components/routes/system.tsx:270
#: src/components/routes/system.tsx:266
msgid "Uptime"
msgstr "Drifttid"
#: src/components/routes/system.tsx:568
#: src/components/routes/system.tsx:602
#: src/components/charts/area-chart.tsx:75
#: src/components/routes/system.tsx:555
#: src/components/routes/system.tsx:592
#: src/components/charts/area-chart.tsx:73
msgid "Usage"
msgstr "Användning"
#: src/components/routes/system.tsx:474
#: src/components/routes/system.tsx:465
msgid "Usage of root partition"
msgstr "Användning av rotpartitionen"
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:63
#: src/components/charts/area-chart.tsx:75
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "Använt"
@@ -832,15 +838,15 @@ msgstr "Använt"
msgid "Users"
msgstr "Användare"
#: src/components/systems-table/systems-table.tsx:359
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "Visa"
#: src/components/systems-table/systems-table.tsx:424
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "Synliga fält"
#: src/components/routes/system.tsx:707
#: src/components/routes/system.tsx:697
msgid "Waiting for enough records to display"
msgstr "Väntar på tillräckligt med poster att visa"
@@ -848,24 +854,25 @@ msgstr "Väntar på tillräckligt med poster att visa"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "Vill du hjälpa oss att göra våra översättningar ännu bättre? Kolla in <0>Crowdin</0> för mer information."
#: src/components/routes/settings/notifications.tsx:126
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / Push-aviseringar"
#. Disk write
#: src/components/charts/area-chart.tsx:61
#: src/components/charts/area-chart.tsx:71
#: src/components/charts/area-chart.tsx:59
#: src/components/charts/area-chart.tsx:69
msgid "Write"
msgstr "Skriv"
#: src/components/routes/settings/layout.tsx:62
#: src/components/routes/settings/layout.tsx:61
msgid "YAML Config"
msgstr "YAML-konfiguration"
#: src/components/routes/settings/config-yaml.tsx:46
#: src/components/routes/settings/config-yaml.tsx:45
msgid "YAML Configuration"
msgstr "YAML-konfiguration"
#: src/components/routes/settings/layout.tsx:35
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "Dina användarinställningar har uppdaterats."

View File

@@ -19,11 +19,11 @@ msgstr ""
"X-Crowdin-File-ID: 16\n"
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:259
#: src/components/routes/system.tsx:255
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# gün} other {# gün}}"
#: src/components/routes/system.tsx:257
#: src/components/routes/system.tsx:253
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# saat} other {# saat}}"
@@ -48,27 +48,30 @@ msgid "30 days"
msgstr "30 gün"
#. Table column
#: src/components/systems-table/systems-table.tsx:304
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "Eylemler"
#: src/components/routes/home.tsx:94
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Aktif Uyarılar"
#: src/components/add-system.tsx:43
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "<0>Sistem</0> Ekle"
#: src/components/add-system.tsx:126
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "Yeni Sistem Ekle"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Add system"
msgstr "Sistem ekle"
#: src/components/routes/settings/notifications.tsx:158
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "URL Ekle"
@@ -84,21 +87,21 @@ msgstr "Grafikler için görüntüleme seçeneklerini ayarlayın."
msgid "Admin"
msgstr "Yönetici"
#: src/components/systems-table/systems-table.tsx:270
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "Aracı"
#: src/components/alerts/alert-button.tsx:33
#: src/components/alerts/alert-button.tsx:79
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "Uyarılar"
#: src/components/systems-table/systems-table.tsx:347
#: src/components/alerts/alert-button.tsx:99
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
msgid "All Systems"
msgstr "Tüm Sistemler"
#: src/components/systems-table/systems-table.tsx:696
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "{name} silmek istediğinizden emin misiniz?"
@@ -106,29 +109,29 @@ msgstr "{name} silmek istediğinizden emin misiniz?"
msgid "Automatic copy requires a secure context."
msgstr "Otomatik kopyalama güvenli bir bağlam gerektirir."
#: src/components/routes/system.tsx:670
#: src/components/routes/system.tsx:660
msgid "Average"
msgstr "Ortalama"
#: src/components/routes/system.tsx:446
#: src/components/routes/system.tsx:437
msgid "Average CPU utilization of containers"
msgstr "Konteynerlerin ortalama CPU kullanımı"
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:253
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Ortalama <0>{value}{0}</0> aşıyor"
#: src/components/routes/system.tsx:547
#: src/components/routes/system.tsx:538
msgid "Average power consumption of GPUs"
msgstr "GPU ların ortalama güç tüketimi"
#: src/components/routes/system.tsx:435
#: src/components/routes/system.tsx:426
msgid "Average system-wide CPU utilization"
msgstr "Sistem genelinde ortalama CPU kullanımı"
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:569
#: src/components/routes/system.tsx:556
msgid "Average utilization of {0}"
msgstr "{0} ortalama kullanımı"
@@ -138,31 +141,31 @@ msgid "Backups"
msgstr "Yedekler"
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:491
#: src/components/routes/system.tsx:482
msgid "Bandwidth"
msgstr "Bant Genişliği"
#: src/components/login/auth-form.tsx:305
#: src/components/login/auth-form.tsx:306
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel, OpenID Connect ve birçok OAuth2 kimlik doğrulama sağlayıcısını destekler."
#: src/components/routes/settings/notifications.tsx:129
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel, popüler bildirim hizmetleriyle entegre olmak için <0>Shoutrrr</0> kullanır."
#: src/components/add-system.tsx:131
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "İkili"
#: src/components/charts/mem-chart.tsx:87
#: src/components/charts/mem-chart.tsx:89
msgid "Cache / Buffers"
msgstr "Önbellek / Tamponlar"
#: src/components/systems-table/systems-table.tsx:707
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "İptal"
#: src/components/routes/settings/config-yaml.tsx:69
#: src/components/routes/settings/config-yaml.tsx:68
msgid "Caution - potential data loss"
msgstr "Dikkat - potansiyel veri kaybı"
@@ -174,37 +177,37 @@ msgstr "Genel uygulama seçeneklerini değiştirin."
msgid "Chart options"
msgstr "Grafik seçenekleri"
#: src/components/login/forgot-pass-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:34
msgid "Check {email} for a reset link."
msgstr "Sıfırlama bağlantısı için {email} kontrol edin."
#: src/components/routes/settings/layout.tsx:41
#: src/components/routes/settings/layout.tsx:40
msgid "Check logs for more details."
msgstr "Daha fazla ayrıntı için günlükleri kontrol edin."
#: src/components/routes/settings/notifications.tsx:185
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Bildirim hizmetinizi kontrol edin"
#: src/components/add-system.tsx:205
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "Kopyalamak için tıklayın"
#: src/components/login/forgot-pass-form.tsx:84
#: src/components/login/forgot-pass-form.tsx:90
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Komut satırı talimatları"
#: src/components/routes/settings/notifications.tsx:79
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Uyarı bildirimlerini nasıl alacağınızı yapılandırın."
#: src/components/login/auth-form.tsx:213
#: src/components/login/auth-form.tsx:218
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "Şifreyi onayla"
#: src/components/systems-table/systems-table.tsx:713
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "Devam et"
@@ -212,16 +215,16 @@ msgstr "Devam et"
msgid "Copied to clipboard"
msgstr "Panoya kopyalandı"
#: src/components/add-system.tsx:216
#: src/components/add-system.tsx:218
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "Kopyala"
#: src/components/systems-table/systems-table.tsx:678
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "Ana bilgisayarı kopyala"
#: src/components/add-system.tsx:225
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "Linux komutunu kopyala"
@@ -229,27 +232,27 @@ msgstr "Linux komutunu kopyala"
msgid "Copy text"
msgstr "Metni kopyala"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "CPU"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:434
#: src/components/charts/area-chart.tsx:58
#: src/components/routes/system.tsx:425
#: src/components/charts/area-chart.tsx:56
msgid "CPU Usage"
msgstr "CPU Kullanımı"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "Hesap oluştur"
#. Dark theme
#: src/components/mode-toggle.tsx:22
#: src/components/mode-toggle.tsx:21
msgid "Dark"
msgstr "Koyu"
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:36
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Gösterge Paneli"
@@ -257,37 +260,37 @@ msgstr "Gösterge Paneli"
msgid "Default time period"
msgstr "Varsayılan zaman dilimi"
#: src/components/systems-table/systems-table.tsx:683
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "Sil"
#: src/components/systems-table/systems-table.tsx:204
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "Disk"
#: src/components/routes/system.tsx:481
#: src/components/routes/system.tsx:472
msgid "Disk I/O"
msgstr "Disk G/Ç"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:474
#: src/components/charts/disk-chart.tsx:77
#: src/components/routes/system.tsx:465
#: src/components/charts/disk-chart.tsx:79
msgid "Disk Usage"
msgstr "Disk Kullanımı"
#: src/components/routes/system.tsx:603
#: src/components/routes/system.tsx:593
msgid "Disk usage of {extraFsName}"
msgstr "{extraFsName} disk kullanımı"
#: src/components/routes/system.tsx:445
#: src/components/routes/system.tsx:436
msgid "Docker CPU Usage"
msgstr "Docker CPU Kullanımı"
#: src/components/routes/system.tsx:466
#: src/components/routes/system.tsx:457
msgid "Docker Memory Usage"
msgstr "Docker Bellek Kullanımı"
#: src/components/routes/system.tsx:507
#: src/components/routes/system.tsx:498
msgid "Docker Network I/O"
msgstr "Docker Ağ G/Ç"
@@ -297,22 +300,22 @@ msgstr "Dokümantasyon"
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:142
#: src/components/routes/system.tsx:345
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:336
msgid "Down"
msgstr ""
#: src/components/add-system.tsx:126
#: src/components/systems-table/systems-table.tsx:653
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr ""
#: src/components/login/forgot-pass-form.tsx:54
#: src/components/login/auth-form.tsx:176
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
msgid "Email"
msgstr "E-posta"
#: src/components/routes/settings/notifications.tsx:93
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "E-posta bildirimleri"
@@ -320,32 +323,32 @@ msgstr "E-posta bildirimleri"
msgid "Enter email address to reset password"
msgstr "Şifreyi sıfırlamak için e-posta adresini girin"
#: src/components/routes/settings/notifications.tsx:113
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "E-posta adresini girin..."
#: src/components/routes/settings/notifications.tsx:189
#: src/components/routes/settings/config-yaml.tsx:29
#: src/components/login/auth-form.tsx:137
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "Hata"
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: src/components/routes/home.tsx:113
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "Son {2, plural, one {# dakika} other {# dakika}} içinde {0}{1} aşıyor"
#: src/components/routes/settings/config-yaml.tsx:73
#: src/components/routes/settings/config-yaml.tsx:72
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "<0>config.yml</0> içinde tanımlanmayan mevcut sistemler silinecektir. Lütfen düzenli yedekler alın."
#: src/components/routes/settings/config-yaml.tsx:94
#: src/components/routes/settings/config-yaml.tsx:93
msgid "Export configuration"
msgstr "Yapılandırmayı dışa aktar"
#: src/components/routes/settings/config-yaml.tsx:49
#: src/components/routes/settings/config-yaml.tsx:48
msgid "Export your current systems configuration."
msgstr "Mevcut sistem yapılandırmanızı dışa aktarın."
@@ -353,60 +356,60 @@ msgstr "Mevcut sistem yapılandırmanızı dışa aktarın."
msgid "Failed to authenticate"
msgstr "Kimlik doğrulama başarısız"
#: src/components/routes/settings/notifications.tsx:64
#: src/components/routes/settings/layout.tsx:40
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
msgid "Failed to save settings"
msgstr "Ayarlar kaydedilemedi"
#: src/components/routes/settings/notifications.tsx:190
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Test bildirimi gönderilemedi"
#: src/components/alerts/alerts-system.tsx:26
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Uyarı güncellenemedi"
#: src/components/systems-table/systems-table.tsx:354
#: src/components/routes/system.tsx:643
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:633
msgid "Filter..."
msgstr "Filtrele..."
#: src/components/alerts/alerts-system.tsx:285
#: src/components/alerts/alerts-system.tsx:230
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "<0>{min}</0> {min, plural, one {dakika} other {dakika}} için"
#: src/components/login/auth-form.tsx:328
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "Şifrenizi mi unuttunuz?"
#. Context: General settings
#: src/components/routes/settings/layout.tsx:52
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "Genel"
#: src/components/routes/system.tsx:546
#: src/components/routes/system.tsx:537
msgid "GPU Power Draw"
msgstr "GPU Güç Çekimi"
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "Izgara"
#: src/components/add-system.tsx:159
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "Host / IP"
#: src/components/login/forgot-pass-form.tsx:94
#: src/components/login/forgot-pass-form.tsx:93
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Yönetici hesabınızın şifresini kaybettiyseniz, aşağıdaki komutu kullanarak sıfırlayabilirsiniz."
#: src/components/login/auth-form.tsx:18
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Geçersiz e-posta adresi."
#. Linux kernel
#: src/components/routes/system.tsx:271
#: src/components/routes/system.tsx:267
msgid "Kernel"
msgstr "Çekirdek"
@@ -414,12 +417,12 @@ msgstr "Çekirdek"
msgid "Language"
msgstr "Dil"
#: src/components/systems-table/systems-table.tsx:367
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "Düzen"
#. Light theme
#: src/components/mode-toggle.tsx:17
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Açık"
@@ -431,8 +434,8 @@ msgstr "Çıkış Yap"
msgid "Login"
msgstr "Giriş Yap"
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "Giriş denemesi başarısız"
@@ -441,49 +444,49 @@ msgstr "Giriş denemesi başarısız"
msgid "Logs"
msgstr "Günlükler"
#: src/components/routes/settings/notifications.tsx:82
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "Uyarı oluşturma yerini mi arıyorsunuz? Sistemler tablosundaki zil <0/> simgelerine tıklayın."
#: src/components/routes/settings/layout.tsx:86
#: src/components/routes/settings/layout.tsx:85
msgid "Manage display and notification preferences."
msgstr "Görüntüleme ve bildirim tercihlerini yönetin."
#: src/components/add-system.tsx:227
#: src/components/add-system.tsx:226
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:673
#: src/components/routes/system.tsx:663
msgid "Max 1 min"
msgstr "Maks 1 dk"
#: src/components/systems-table/systems-table.tsx:195
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "Bellek"
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:456
#: src/components/routes/system.tsx:447
msgid "Memory Usage"
msgstr "Bellek Kullanımı"
#: src/components/routes/system.tsx:467
#: src/components/routes/system.tsx:458
msgid "Memory usage of docker containers"
msgstr "Docker konteynerlerinin bellek kullanımı"
#: src/components/add-system.tsx:155
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "Ad"
#: src/components/systems-table/systems-table.tsx:223
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "Ağ"
#: src/components/routes/system.tsx:508
#: src/components/routes/system.tsx:499
msgid "Network traffic of docker containers"
msgstr "Docker konteynerlerinin ağ trafiği"
#: src/components/routes/system.tsx:493
#: src/components/routes/system.tsx:484
msgid "Network traffic of public interfaces"
msgstr "Genel arayüzlerin ağ trafiği"
@@ -491,34 +494,34 @@ msgstr "Genel arayüzlerin ağ trafiği"
msgid "No results found."
msgstr "Sonuç bulunamadı."
#: src/components/systems-table/systems-table.tsx:472
#: src/components/systems-table/systems-table.tsx:495
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "Sistem bulunamadı."
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:76
#: src/components/routes/settings/layout.tsx:57
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
msgid "Notifications"
msgstr "Bildirimler"
#: src/components/login/auth-form.tsx:300
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "OAuth 2 / OIDC desteği"
#: src/components/routes/settings/config-yaml.tsx:62
#: src/components/routes/settings/config-yaml.tsx:61
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "Her yeniden başlatmada, veritabanındaki sistemler dosyada tanımlanan sistemlerle eşleşecek şekilde güncellenecektir."
#: src/components/systems-table/systems-table.tsx:639
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "Menüyü aç"
#: src/components/login/auth-form.tsx:251
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "Veya devam et"
#: src/components/alerts/alert-button.tsx:120
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "Mevcut uyarıların üzerine yaz"
@@ -530,41 +533,41 @@ msgstr "Sayfa"
msgid "Pages / Settings"
msgstr "Sayfalar / Ayarlar"
#: src/components/login/auth-form.tsx:195
#: src/components/login/auth-form.tsx:200
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "Şifre"
#: src/components/login/auth-form.tsx:21
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "Şifre en az 8 karakter olmalıdır."
#: src/components/login/auth-form.tsx:22
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr ""
#: src/components/login/forgot-pass-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Şifre sıfırlama isteği alındı"
#: src/components/systems-table/systems-table.tsx:672
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "Duraklat"
#: src/components/systems-table/systems-table.tsx:143
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr ""
#: src/components/routes/settings/notifications.tsx:97
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "Uyarıların teslim edilmesini sağlamak için lütfen bir SMTP sunucusu <0>yapılandırın</0>."
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Daha fazla ayrıntı için lütfen günlükleri kontrol edin."
#: src/components/login/forgot-pass-form.tsx:17
#: src/components/login/auth-form.tsx:41
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "Lütfen kimlik bilgilerinizi kontrol edin ve tekrar deneyin"
@@ -572,7 +575,7 @@ msgstr "Lütfen kimlik bilgilerinizi kontrol edin ve tekrar deneyin"
msgid "Please create an admin account"
msgstr "Lütfen bir yönetici hesabı oluşturun"
#: src/components/login/auth-form.tsx:138
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Lütfen bu site için açılır pencereleri etkinleştirin"
@@ -580,7 +583,7 @@ msgstr "Lütfen bu site için açılır pencereleri etkinleştirin"
msgid "Please log in again"
msgstr "Lütfen tekrar giriş yapın"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Talimatlar için lütfen <0>dokümantasyonu</0> inceleyin."
@@ -588,12 +591,12 @@ msgstr "Talimatlar için lütfen <0>dokümantasyonu</0> inceleyin."
msgid "Please sign in to your account"
msgstr "Lütfen hesabınıza giriş yapın"
#: src/components/add-system.tsx:171
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "Port"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:577
#: src/components/routes/system.tsx:448
#: src/components/routes/system.tsx:564
msgid "Precise utilization at the recorded time"
msgstr "Kayıtlı zamanda kesin kullanım"
@@ -602,39 +605,39 @@ msgid "Preferred Language"
msgstr "Tercih Edilen Dil"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:182
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "Genel Anahtar"
#. Disk read
#: src/components/charts/area-chart.tsx:62
#: src/components/charts/area-chart.tsx:72
#: src/components/charts/area-chart.tsx:60
#: src/components/charts/area-chart.tsx:70
msgid "Read"
msgstr "Oku"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx:67
#: src/components/charts/area-chart.tsx:65
msgid "Received"
msgstr "Alındı"
#: src/components/login/forgot-pass-form.tsx:77
#: src/components/login/forgot-pass-form.tsx:76
msgid "Reset Password"
msgstr "Şifreyi Sıfırla"
#: src/components/systems-table/systems-table.tsx:667
#: src/components/systems-table/systems-table.tsx:628
msgid "Resume"
msgstr "Devam et"
#: src/components/routes/settings/notifications.tsx:119
#: src/components/routes/settings/notifications.tsx:118
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Adresleri enter tuşu veya virgül ile kaydedin. E-posta bildirimlerini devre dışı bırakmak için boş bırakın."
#: src/components/routes/settings/notifications.tsx:169
#: src/components/routes/settings/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
msgid "Save Settings"
msgstr "Ayarları Kaydet"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr ""
@@ -646,12 +649,12 @@ msgstr "Ara"
msgid "Search for systems or settings..."
msgstr "Sistemler veya ayarlar için ara..."
#: src/components/alerts/alert-button.tsx:82
#: src/components/alerts/alert-button.tsx:71
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Uyarıları nasıl alacağınızı yapılandırmak için <0>bildirim ayarlarını</0> inceleyin."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx:66
#: src/components/charts/area-chart.tsx:64
msgid "Sent"
msgstr "Gönderildi"
@@ -662,16 +665,16 @@ msgstr "Bir sistem görüntülendiğinde grafikler için varsayılan zaman aral
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:72
#: src/components/routes/settings/layout.tsx:83
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
msgstr "Ayarlar"
#: src/components/routes/settings/layout.tsx:34
#: src/components/routes/settings/layout.tsx:33
msgid "Settings saved"
msgstr "Ayarlar kaydedildi"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "Giriş yap"
@@ -679,7 +682,7 @@ msgstr "Giriş yap"
msgid "SMTP settings"
msgstr "SMTP ayarları"
#: src/components/systems-table/systems-table.tsx:389
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "Sıralama Ölçütü"
@@ -687,18 +690,21 @@ msgstr "Sıralama Ölçütü"
msgid "Status"
msgstr "Durum"
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:514
msgid "Swap space used by the system"
msgstr "Sistem tarafından kullanılan takas alanı"
#: src/components/routes/system.tsx:522
#: src/components/routes/system.tsx:513
msgid "Swap Usage"
msgstr "Takas Kullanımı"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:27
#: src/components/systems-table/systems-table.tsx:152
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "Sistem"
@@ -706,70 +712,70 @@ msgstr "Sistem"
msgid "Systems"
msgstr "Sistemler"
#: src/components/routes/settings/config-yaml.tsx:56
#: src/components/routes/settings/config-yaml.tsx:55
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "Sistemler, veri dizininizdeki bir <0>config.yml</0> dosyasında yönetilebilir."
#: src/components/systems-table/systems-table.tsx:377
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "Tablo"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:244
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr ""
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:534
#: src/components/routes/system.tsx:525
msgid "Temperature"
msgstr "Sıcaklık"
#: src/components/routes/system.tsx:535
#: src/components/routes/system.tsx:526
msgid "Temperatures of system sensors"
msgstr "Sistem sensörlerinin sıcaklıkları"
#: src/components/routes/settings/notifications.tsx:213
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Test <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:184
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Test bildirimi gönderildi"
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:146
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "Bağlanmak için aracının sistemde çalışıyor olması gerekir. Aşağıdaki aracı kurulum komutunu kopyalayın."
#: src/components/add-system.tsx:138
#: src/components/add-system.tsx:137
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "Bağlanmak için aracının sistemde çalışıyor olması gerekir. Aşağıdaki <0>docker-compose.yml</0> dosyasını kopyalayın."
#: src/components/login/forgot-pass-form.tsx:99
#: src/components/login/forgot-pass-form.tsx:98
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "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:699
#: src/components/systems-table/systems-table.tsx:660
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Bu işlem geri alınamaz. Bu, veritabanından {name} için tüm mevcut kayıtları kalıcı olarak silecektir."
#: src/components/routes/system.tsx:615
#: src/components/routes/system.tsx:605
msgid "Throughput of {extraFsName}"
msgstr "{extraFsName} verimliliği"
#: src/components/routes/system.tsx:482
#: src/components/routes/system.tsx:473
msgid "Throughput of root filesystem"
msgstr "Kök dosya sisteminin verimliliği"
#: src/components/routes/settings/notifications.tsx:108
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "E-posta(lar)a"
#: src/components/routes/system.tsx:409
#: src/components/routes/system.tsx:422
#: src/components/routes/system.tsx:400
#: src/components/routes/system.tsx:413
msgid "Toggle grid"
msgstr "Izgarayı değiştir"
#: src/components/mode-toggle.tsx:34
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "Temayı değiştir"
@@ -798,32 +804,32 @@ msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Herhangi bir diskin kullanımı bir eşiği aştığında tetiklenir"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:343
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:334
msgid "Up"
msgstr ""
#: src/components/systems-table/systems-table.tsx:350
#: src/components/systems-table/systems-table.tsx:337
msgid "Updated in real time. Click on a system to view information."
msgstr "Gerçek zamanlı olarak güncellenir. Bilgileri görüntülemek için bir sisteme tıklayın."
#: src/components/routes/system.tsx:270
#: src/components/routes/system.tsx:266
msgid "Uptime"
msgstr "Çalışma Süresi"
#: src/components/routes/system.tsx:568
#: src/components/routes/system.tsx:602
#: src/components/charts/area-chart.tsx:75
#: src/components/routes/system.tsx:555
#: src/components/routes/system.tsx:592
#: src/components/charts/area-chart.tsx:73
msgid "Usage"
msgstr "Kullanım"
#: src/components/routes/system.tsx:474
#: src/components/routes/system.tsx:465
msgid "Usage of root partition"
msgstr "Kök bölümün kullanımı"
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:63
#: src/components/charts/area-chart.tsx:75
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "Kullanıldı"
@@ -832,15 +838,15 @@ msgstr "Kullanıldı"
msgid "Users"
msgstr "Kullanıcılar"
#: src/components/systems-table/systems-table.tsx:359
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "Görüntüle"
#: src/components/systems-table/systems-table.tsx:424
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "Görünür Alanlar"
#: src/components/routes/system.tsx:707
#: src/components/routes/system.tsx:697
msgid "Waiting for enough records to display"
msgstr "Görüntülemek için yeterli kayıt bekleniyor"
@@ -848,24 +854,25 @@ msgstr "Görüntülemek için yeterli kayıt bekleniyor"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "Çevirilerimizi daha iyi hale getirmemize yardımcı olmak ister misiniz? Daha fazla bilgi için <0>Crowdin</0> inceleyin."
#: src/components/routes/settings/notifications.tsx:126
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / Anlık bildirimler"
#. Disk write
#: src/components/charts/area-chart.tsx:61
#: src/components/charts/area-chart.tsx:71
#: src/components/charts/area-chart.tsx:59
#: src/components/charts/area-chart.tsx:69
msgid "Write"
msgstr "Yaz"
#: src/components/routes/settings/layout.tsx:62
#: src/components/routes/settings/layout.tsx:61
msgid "YAML Config"
msgstr "YAML Yapılandırması"
#: src/components/routes/settings/config-yaml.tsx:46
#: src/components/routes/settings/config-yaml.tsx:45
msgid "YAML Configuration"
msgstr "YAML Yapılandırması"
#: src/components/routes/settings/layout.tsx:35
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "Kullanıcı ayarlarınız güncellendi."

View File

@@ -19,11 +19,11 @@ msgstr ""
"X-Crowdin-File-ID: 16\n"
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:259
#: src/components/routes/system.tsx:258
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# день} few {# дні} many {# днів} other {# дня}}"
#: src/components/routes/system.tsx:257
#: src/components/routes/system.tsx:256
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# година} few {# години} many {# годин} other {# години}}"
@@ -48,27 +48,30 @@ msgid "30 days"
msgstr "30 днів"
#. Table column
#: src/components/systems-table/systems-table.tsx:304
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "Дії"
#: src/components/routes/home.tsx:94
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Активні сповіщення"
#: src/components/add-system.tsx:43
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Додати <0>Систему</0>"
#: src/components/add-system.tsx:126
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "Додати нову систему"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Add system"
msgstr "Додати систему"
#: src/components/routes/settings/notifications.tsx:158
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Додати URL"
@@ -84,21 +87,21 @@ msgstr "Налаштуйте параметри відображення для
msgid "Admin"
msgstr "Адміністратор"
#: src/components/systems-table/systems-table.tsx:270
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "Агент"
#: src/components/alerts/alert-button.tsx:33
#: src/components/alerts/alert-button.tsx:79
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "Сповіщення"
#: src/components/systems-table/systems-table.tsx:347
#: src/components/alerts/alert-button.tsx:99
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
msgid "All Systems"
msgstr "Всі системи"
#: src/components/systems-table/systems-table.tsx:696
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "Ви впевнені, що хочете видалити {name}?"
@@ -106,29 +109,29 @@ msgstr "Ви впевнені, що хочете видалити {name}?"
msgid "Automatic copy requires a secure context."
msgstr "Автоматичне копіювання вимагає безпечного контексту."
#: src/components/routes/system.tsx:670
#: src/components/routes/system.tsx:668
msgid "Average"
msgstr "Середнє"
#: src/components/routes/system.tsx:446
#: src/components/routes/system.tsx:445
msgid "Average CPU utilization of containers"
msgstr "Середнє використання CPU контейнерами"
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:253
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Середнє перевищує <0>{value}{0}</0>"
#: src/components/routes/system.tsx:547
#: src/components/routes/system.tsx:546
msgid "Average power consumption of GPUs"
msgstr "Середнє енергоспоживання GPUs"
#: src/components/routes/system.tsx:435
#: src/components/routes/system.tsx:434
msgid "Average system-wide CPU utilization"
msgstr "Середнє використання CPU по всій системі"
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:569
#: src/components/routes/system.tsx:564
msgid "Average utilization of {0}"
msgstr "Середнє використання {0}"
@@ -138,31 +141,31 @@ msgid "Backups"
msgstr "Резервні копії"
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:491
#: src/components/routes/system.tsx:490
msgid "Bandwidth"
msgstr "Пропускна здатність"
#: src/components/login/auth-form.tsx:305
#: src/components/login/auth-form.tsx:306
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel підтримує OpenID Connect та багато постачальників автентифікації OAuth2."
#: src/components/routes/settings/notifications.tsx:129
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel використовує <0>Shoutrrr</0> для інтеграції з популярними сервісами сповіщень."
#: src/components/add-system.tsx:131
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "Двійковий"
#: src/components/charts/mem-chart.tsx:87
#: src/components/charts/mem-chart.tsx:89
msgid "Cache / Buffers"
msgstr "Кеш / Буфери"
#: src/components/systems-table/systems-table.tsx:707
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "Скасувати"
#: src/components/routes/settings/config-yaml.tsx:69
#: src/components/routes/settings/config-yaml.tsx:68
msgid "Caution - potential data loss"
msgstr "Увага - можливе втрата даних"
@@ -174,37 +177,37 @@ msgstr "Змінити загальні параметри програми."
msgid "Chart options"
msgstr "Параметри графіків"
#: src/components/login/forgot-pass-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:34
msgid "Check {email} for a reset link."
msgstr "Перевірте {email} для отримання посилання на скидання."
#: src/components/routes/settings/layout.tsx:41
#: src/components/routes/settings/layout.tsx:40
msgid "Check logs for more details."
msgstr "Перевірте журнали для отримання додаткової інформації."
#: src/components/routes/settings/notifications.tsx:185
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Перевірте свій сервіс сповіщень"
#: src/components/add-system.tsx:205
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "Натисніть, щоб скопіювати"
#: src/components/login/forgot-pass-form.tsx:84
#: src/components/login/forgot-pass-form.tsx:90
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Інструкції командного рядка"
#: src/components/routes/settings/notifications.tsx:79
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Налаштуйте, як ви отримуєте сповіщення про тривоги."
#: src/components/login/auth-form.tsx:213
#: src/components/login/auth-form.tsx:218
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "Підтвердьте пароль"
#: src/components/systems-table/systems-table.tsx:713
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "Продовжити"
@@ -212,16 +215,16 @@ msgstr "Продовжити"
msgid "Copied to clipboard"
msgstr "Скопійовано в буфер обміну"
#: src/components/add-system.tsx:216
#: src/components/add-system.tsx:218
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "Копіювати"
#: src/components/systems-table/systems-table.tsx:678
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "Копіювати хост"
#: src/components/add-system.tsx:225
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "Копіювати команду Linux"
@@ -229,27 +232,27 @@ msgstr "Копіювати команду Linux"
msgid "Copy text"
msgstr "Копіювати текст"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "ЦП"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:434
#: src/components/charts/area-chart.tsx:58
#: src/components/routes/system.tsx:433
#: src/components/charts/area-chart.tsx:56
msgid "CPU Usage"
msgstr "Використання ЦП"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "Створити обліковий запис"
#. Dark theme
#: src/components/mode-toggle.tsx:22
#: src/components/mode-toggle.tsx:21
msgid "Dark"
msgstr "Темний"
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:36
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Панель управління"
@@ -257,37 +260,37 @@ msgstr "Панель управління"
msgid "Default time period"
msgstr "Стандартний період часу"
#: src/components/systems-table/systems-table.tsx:683
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "Видалити"
#: src/components/systems-table/systems-table.tsx:204
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "Диск"
#: src/components/routes/system.tsx:481
#: src/components/routes/system.tsx:480
msgid "Disk I/O"
msgstr "Дисковий ввід/вивід"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:474
#: src/components/charts/disk-chart.tsx:77
#: src/components/routes/system.tsx:473
#: src/components/charts/disk-chart.tsx:79
msgid "Disk Usage"
msgstr "Використання диска"
#: src/components/routes/system.tsx:603
#: src/components/routes/system.tsx:601
msgid "Disk usage of {extraFsName}"
msgstr "Використання диска {extraFsName}"
#: src/components/routes/system.tsx:445
#: src/components/routes/system.tsx:444
msgid "Docker CPU Usage"
msgstr "Використання ЦП Docker"
#: src/components/routes/system.tsx:466
#: src/components/routes/system.tsx:465
msgid "Docker Memory Usage"
msgstr "Використання пам'яті Docker"
#: src/components/routes/system.tsx:507
#: src/components/routes/system.tsx:506
msgid "Docker Network I/O"
msgstr "Мережевий ввід/вивід Docker"
@@ -297,22 +300,22 @@ msgstr "Документація"
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:142
#: src/components/routes/system.tsx:345
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:344
msgid "Down"
msgstr "Не працює"
#: src/components/add-system.tsx:126
#: src/components/systems-table/systems-table.tsx:653
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr "Редагувати"
#: src/components/login/forgot-pass-form.tsx:54
#: src/components/login/auth-form.tsx:176
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
msgid "Email"
msgstr "Електронна пошта"
#: src/components/routes/settings/notifications.tsx:93
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "Сповіщення електронною поштою"
@@ -320,32 +323,32 @@ msgstr "Сповіщення електронною поштою"
msgid "Enter email address to reset password"
msgstr "Введіть адресу електронної пошти для скидання пароля"
#: src/components/routes/settings/notifications.tsx:113
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Введіть адресу електронної пошти..."
#: src/components/routes/settings/notifications.tsx:189
#: src/components/routes/settings/config-yaml.tsx:29
#: src/components/login/auth-form.tsx:137
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "Помилка"
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: src/components/routes/home.tsx:113
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "Перевищує {0}{1} протягом {2, plural, one {останньої # хвилини} other {останніх # хвилин}}"
#: src/components/routes/settings/config-yaml.tsx:73
#: src/components/routes/settings/config-yaml.tsx:72
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "Існуючі системи, не визначені в <0>config.yml</0>, будуть видалені. Будь ласка, робіть регулярні резервні копії."
#: src/components/routes/settings/config-yaml.tsx:94
#: src/components/routes/settings/config-yaml.tsx:93
msgid "Export configuration"
msgstr "Експорт конфігурації"
#: src/components/routes/settings/config-yaml.tsx:49
#: src/components/routes/settings/config-yaml.tsx:48
msgid "Export your current systems configuration."
msgstr "Експортуйте поточну конфігурацію систем."
@@ -353,60 +356,60 @@ msgstr "Експортуйте поточну конфігурацію сист
msgid "Failed to authenticate"
msgstr "Не вдалося автентифікувати"
#: src/components/routes/settings/notifications.tsx:64
#: src/components/routes/settings/layout.tsx:40
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
msgid "Failed to save settings"
msgstr "Не вдалося зберегти налаштування"
#: src/components/routes/settings/notifications.tsx:190
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Не вдалося надіслати тестове сповіщення"
#: src/components/alerts/alerts-system.tsx:26
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Не вдалося оновити сповіщення"
#: src/components/systems-table/systems-table.tsx:354
#: src/components/routes/system.tsx:643
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:641
msgid "Filter..."
msgstr "Фільтр..."
#: src/components/alerts/alerts-system.tsx:285
#: src/components/alerts/alerts-system.tsx:230
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "Протягом <0>{min}</0> {min, plural, one {хвилини} other {хвилин}}"
#: src/components/login/auth-form.tsx:328
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "Забули пароль?"
#. Context: General settings
#: src/components/routes/settings/layout.tsx:52
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "Загальні"
#: src/components/routes/system.tsx:546
#: src/components/routes/system.tsx:545
msgid "GPU Power Draw"
msgstr "Енергоспоживання GPU"
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "Сітка"
#: src/components/add-system.tsx:159
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "Хост / IP"
#: src/components/login/forgot-pass-form.tsx:94
#: src/components/login/forgot-pass-form.tsx:93
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Якщо ви втратили пароль до свого адміністративного облікового запису, ви можете скинути його за допомогою наступної команди."
#: src/components/login/auth-form.tsx:18
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Неправильна адреса електронної пошти."
#. Linux kernel
#: src/components/routes/system.tsx:271
#: src/components/routes/system.tsx:270
msgid "Kernel"
msgstr "Ядро"
@@ -414,12 +417,12 @@ msgstr "Ядро"
msgid "Language"
msgstr "Мова"
#: src/components/systems-table/systems-table.tsx:367
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "Макет"
#. Light theme
#: src/components/mode-toggle.tsx:17
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Світлий"
@@ -431,8 +434,8 @@ msgstr "Вийти"
msgid "Login"
msgstr "Увійти"
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "Спроба входу не вдалася"
@@ -441,49 +444,49 @@ msgstr "Спроба входу не вдалася"
msgid "Logs"
msgstr "Журнали"
#: src/components/routes/settings/notifications.tsx:82
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "Шукаєте, де створити сповіщення? Натисніть на іконки дзвінка <0/> в таблиці систем."
#: src/components/routes/settings/layout.tsx:86
#: src/components/routes/settings/layout.tsx:85
msgid "Manage display and notification preferences."
msgstr "Керуйте параметрами відображення та сповіщень."
#: src/components/add-system.tsx:227
#: src/components/add-system.tsx:226
msgid "Manual setup instructions"
msgstr "Інструкції з ручного налаштування"
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:673
#: src/components/routes/system.tsx:671
msgid "Max 1 min"
msgstr "Макс 1 хв"
#: src/components/systems-table/systems-table.tsx:195
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "Пам'ять"
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:456
#: src/components/routes/system.tsx:455
msgid "Memory Usage"
msgstr "Використання пам'яті"
#: src/components/routes/system.tsx:467
#: src/components/routes/system.tsx:466
msgid "Memory usage of docker containers"
msgstr "Використання пам'яті контейнерами Docker"
#: src/components/add-system.tsx:155
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "Ім'я"
#: src/components/systems-table/systems-table.tsx:223
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "Мережа"
#: src/components/routes/system.tsx:508
#: src/components/routes/system.tsx:507
msgid "Network traffic of docker containers"
msgstr "Мережевий трафік контейнерів Docker"
#: src/components/routes/system.tsx:493
#: src/components/routes/system.tsx:492
msgid "Network traffic of public interfaces"
msgstr "Мережевий трафік публічних інтерфейсів"
@@ -491,34 +494,34 @@ msgstr "Мережевий трафік публічних інтерфейсі
msgid "No results found."
msgstr "Результатів не знайдено."
#: src/components/systems-table/systems-table.tsx:472
#: src/components/systems-table/systems-table.tsx:495
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "Систем не знайдено."
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:76
#: src/components/routes/settings/layout.tsx:57
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
msgid "Notifications"
msgstr "Сповіщення"
#: src/components/login/auth-form.tsx:300
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "Підтримка OAuth 2 / OIDC"
#: src/components/routes/settings/config-yaml.tsx:62
#: src/components/routes/settings/config-yaml.tsx:61
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "При кожному перезапуску системи в базі даних будуть оновлені, щоб відповідати системам, визначеним у файлі."
#: src/components/systems-table/systems-table.tsx:639
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "Відкрити меню"
#: src/components/login/auth-form.tsx:251
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "Або продовжити з"
#: src/components/alerts/alert-button.tsx:120
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "Перезаписати існуючі сповіщення"
@@ -530,41 +533,41 @@ msgstr "Сторінка"
msgid "Pages / Settings"
msgstr "Сторінки / Налаштування"
#: src/components/login/auth-form.tsx:195
#: src/components/login/auth-form.tsx:200
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "Пароль"
#: src/components/login/auth-form.tsx:21
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "Пароль має містити щонайменше 8 символів."
#: src/components/login/auth-form.tsx:22
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr "Пароль не повинен перевищувати 72 байти."
#: src/components/login/forgot-pass-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Запит на скидання пароля отримано"
#: src/components/systems-table/systems-table.tsx:672
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "Призупинити"
#: src/components/systems-table/systems-table.tsx:143
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr ""
msgstr "Призупинено"
#: src/components/routes/settings/notifications.tsx:97
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "Будь ласка, <0>налаштуйте SMTP сервер</0>, щоб забезпечити доставку сповіщень."
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Будь ласка, перевірте журнали для отримання додаткової інформації."
#: src/components/login/forgot-pass-form.tsx:17
#: src/components/login/auth-form.tsx:41
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "Будь ласка, перевірте свої облікові дані та спробуйте ще раз"
@@ -572,7 +575,7 @@ msgstr "Будь ласка, перевірте свої облікові дан
msgid "Please create an admin account"
msgstr "Будь ласка, створіть адміністративний обліковий запис"
#: src/components/login/auth-form.tsx:138
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Будь ласка, увімкніть спливаючі вікна для цього сайту"
@@ -580,7 +583,7 @@ msgstr "Будь ласка, увімкніть спливаючі вікна д
msgid "Please log in again"
msgstr "Будь ласка, увійдіть знову"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Будь ласка, перегляньте <0>документацію</0> для отримання інструкцій."
@@ -588,12 +591,12 @@ msgstr "Будь ласка, перегляньте <0>документацію<
msgid "Please sign in to your account"
msgstr "Будь ласка, увійдіть у свій обліковий запис"
#: src/components/add-system.tsx:171
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "Порт"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:577
#: src/components/routes/system.tsx:456
#: src/components/routes/system.tsx:572
msgid "Precise utilization at the recorded time"
msgstr "Точне використання в записаний час"
@@ -602,39 +605,39 @@ msgid "Preferred Language"
msgstr "Бажана мова"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:182
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "Ключ"
#. Disk read
#: src/components/charts/area-chart.tsx:62
#: src/components/charts/area-chart.tsx:72
#: src/components/charts/area-chart.tsx:60
#: src/components/charts/area-chart.tsx:70
msgid "Read"
msgstr "Читання"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx:67
#: src/components/charts/area-chart.tsx:65
msgid "Received"
msgstr "Отримано"
#: src/components/login/forgot-pass-form.tsx:77
#: src/components/login/forgot-pass-form.tsx:76
msgid "Reset Password"
msgstr "Скинути пароль"
#: src/components/systems-table/systems-table.tsx:667
#: src/components/systems-table/systems-table.tsx:628
msgid "Resume"
msgstr "Відновити"
#: src/components/routes/settings/notifications.tsx:119
#: src/components/routes/settings/notifications.tsx:118
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Збережіть адресу, використовуючи клавішу Enter або кому. Залиште порожнім, щоб вимкнути сповіщення електронною поштою."
#: src/components/routes/settings/notifications.tsx:169
#: src/components/routes/settings/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
msgid "Save Settings"
msgstr "Зберегти налаштування"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr "Зберегти систему"
@@ -646,12 +649,12 @@ msgstr "Пошук"
msgid "Search for systems or settings..."
msgstr "Шукати системи або налаштування..."
#: src/components/alerts/alert-button.tsx:82
#: src/components/alerts/alert-button.tsx:71
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Перегляньте <0>налаштування сповіщень</0>, щоб налаштувати, як ви отримуєте сповіщення."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx:66
#: src/components/charts/area-chart.tsx:64
msgid "Sent"
msgstr "Відправлено"
@@ -662,16 +665,16 @@ msgstr "Встановлює стандартний діапазон часу д
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:72
#: src/components/routes/settings/layout.tsx:83
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
msgstr "Налаштування"
#: src/components/routes/settings/layout.tsx:34
#: src/components/routes/settings/layout.tsx:33
msgid "Settings saved"
msgstr "Налаштування збережено"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "Увійти"
@@ -679,7 +682,7 @@ msgstr "Увійти"
msgid "SMTP settings"
msgstr "Налаштування SMTP"
#: src/components/systems-table/systems-table.tsx:389
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "Сортувати за"
@@ -687,18 +690,21 @@ msgstr "Сортувати за"
msgid "Status"
msgstr "Статус"
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:522
msgid "Swap space used by the system"
msgstr "Область підкачки, використана системою"
#: src/components/routes/system.tsx:522
#: src/components/routes/system.tsx:521
msgid "Swap Usage"
msgstr "Використання підкачки"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:27
#: src/components/systems-table/systems-table.tsx:152
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "Система"
@@ -706,70 +712,70 @@ msgstr "Система"
msgid "Systems"
msgstr "Системи"
#: src/components/routes/settings/config-yaml.tsx:56
#: src/components/routes/settings/config-yaml.tsx:55
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "Системи можуть керуватися у файлі <0>config.yml</0> у вашій директорії даних."
#: src/components/systems-table/systems-table.tsx:377
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "Таблиця"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:244
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr "Температура"
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:534
#: src/components/routes/system.tsx:533
msgid "Temperature"
msgstr "Температура"
#: src/components/routes/system.tsx:535
#: src/components/routes/system.tsx:534
msgid "Temperatures of system sensors"
msgstr "Температури датчиків системи"
#: src/components/routes/settings/notifications.tsx:213
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Тест <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:184
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Тестове сповіщення надіслано"
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:146
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "Агент повинен працювати на системі для підключення. Скопіюйте команду встановлення для агента нижче."
#: src/components/add-system.tsx:138
#: src/components/add-system.tsx:137
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "Агент повинен працювати на системі для підключення. Скопіюйте <0>docker-compose.yml</0> для агента нижче."
#: src/components/login/forgot-pass-form.tsx:99
#: src/components/login/forgot-pass-form.tsx:98
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Потім увійдіть у бекенд і скиньте пароль вашого облікового запису користувача в таблиці користувачів."
#: src/components/systems-table/systems-table.tsx:699
#: src/components/systems-table/systems-table.tsx:660
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Цю дію не можна скасувати. Це назавжди видалить всі поточні записи для {name} з бази даних."
#: src/components/routes/system.tsx:615
#: src/components/routes/system.tsx:613
msgid "Throughput of {extraFsName}"
msgstr "Пропускна здатність {extraFsName}"
#: src/components/routes/system.tsx:482
#: src/components/routes/system.tsx:481
msgid "Throughput of root filesystem"
msgstr "Пропускна здатність кореневої файлової системи"
#: src/components/routes/settings/notifications.tsx:108
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "На електронну пошту"
#: src/components/routes/system.tsx:409
#: src/components/routes/system.tsx:422
#: src/components/routes/system.tsx:408
#: src/components/routes/system.tsx:421
msgid "Toggle grid"
msgstr "Перемкнути сітку"
#: src/components/mode-toggle.tsx:34
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "Перемкнути тему"
@@ -798,32 +804,32 @@ msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Спрацьовує, коли використання будь-якого диска перевищує поріг"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:343
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:342
msgid "Up"
msgstr "Працює"
#: src/components/systems-table/systems-table.tsx:350
#: src/components/systems-table/systems-table.tsx:337
msgid "Updated in real time. Click on a system to view information."
msgstr "Оновлюється в реальному часі. Натисніть на систему, щоб переглянути інформацію."
#: src/components/routes/system.tsx:270
#: src/components/routes/system.tsx:269
msgid "Uptime"
msgstr "Час роботи"
#: src/components/routes/system.tsx:568
#: src/components/routes/system.tsx:602
#: src/components/charts/area-chart.tsx:75
#: src/components/routes/system.tsx:563
#: src/components/routes/system.tsx:600
#: src/components/charts/area-chart.tsx:73
msgid "Usage"
msgstr "Використання"
#: src/components/routes/system.tsx:474
#: src/components/routes/system.tsx:473
msgid "Usage of root partition"
msgstr "Використання кореневого розділу"
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:63
#: src/components/charts/area-chart.tsx:75
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "Використано"
@@ -832,15 +838,15 @@ msgstr "Використано"
msgid "Users"
msgstr "Користувачі"
#: src/components/systems-table/systems-table.tsx:359
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "Вигляд"
#: src/components/systems-table/systems-table.tsx:424
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "Видимі стовпці"
#: src/components/routes/system.tsx:707
#: src/components/routes/system.tsx:705
msgid "Waiting for enough records to display"
msgstr "Очікування достатньої кількості записів для відображення"
@@ -848,24 +854,25 @@ msgstr "Очікування достатньої кількості запис
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "Хочете допомогти нам зробити наші переклади ще кращими? Перегляньте <0>Crowdin</0> для отримання додаткової інформації."
#: src/components/routes/settings/notifications.tsx:126
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / Push сповіщення"
#. Disk write
#: src/components/charts/area-chart.tsx:61
#: src/components/charts/area-chart.tsx:71
#: src/components/charts/area-chart.tsx:59
#: src/components/charts/area-chart.tsx:69
msgid "Write"
msgstr "Запис"
#: src/components/routes/settings/layout.tsx:62
#: src/components/routes/settings/layout.tsx:61
msgid "YAML Config"
msgstr "Конфігурація YAML"
#: src/components/routes/settings/config-yaml.tsx:46
#: src/components/routes/settings/config-yaml.tsx:45
msgid "YAML Configuration"
msgstr "Конфігурація YAML"
#: src/components/routes/settings/layout.tsx:35
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "Ваші налаштування користувача були оновлені."

View File

@@ -19,11 +19,11 @@ msgstr ""
"X-Crowdin-File-ID: 16\n"
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:259
#: src/components/routes/system.tsx:255
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# ngày} other {# ngày}}"
#: src/components/routes/system.tsx:257
#: src/components/routes/system.tsx:253
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# giờ} other {# giờ}}"
@@ -48,27 +48,30 @@ msgid "30 days"
msgstr "30 ngày"
#. Table column
#: src/components/systems-table/systems-table.tsx:304
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "Hành động"
#: src/components/routes/home.tsx:94
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Cảnh báo hoạt động"
#: src/components/add-system.tsx:43
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Thêm <0>Hệ thống</0>"
#: src/components/add-system.tsx:126
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "Thêm Hệ thống Mới"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Add system"
msgstr "Thêm hệ thống"
#: src/components/routes/settings/notifications.tsx:158
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Thêm URL"
@@ -84,21 +87,21 @@ 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:270
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "Tác nhân"
#: src/components/alerts/alert-button.tsx:33
#: src/components/alerts/alert-button.tsx:79
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "Cảnh báo"
#: src/components/systems-table/systems-table.tsx:347
#: src/components/alerts/alert-button.tsx:99
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
msgid "All Systems"
msgstr "Tất cả Hệ thống"
#: src/components/systems-table/systems-table.tsx:696
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "Bạn có chắc chắn muốn xóa {name} không?"
@@ -106,29 +109,29 @@ msgstr "Bạn có chắc chắn muốn xóa {name} không?"
msgid "Automatic copy requires a secure context."
msgstr "Sao chép tự động yêu cầu một ngữ cảnh an toàn."
#: src/components/routes/system.tsx:670
#: src/components/routes/system.tsx:660
msgid "Average"
msgstr "Trung bình"
#: src/components/routes/system.tsx:446
#: src/components/routes/system.tsx:437
msgid "Average CPU utilization of containers"
msgstr "Sử dụng CPU trung bình của các container"
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:253
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Trung bình vượt quá <0>{value}{0}</0>"
#: src/components/routes/system.tsx:547
#: src/components/routes/system.tsx:538
msgid "Average power consumption of GPUs"
msgstr ""
#: src/components/routes/system.tsx:435
#: src/components/routes/system.tsx:426
msgid "Average system-wide CPU utilization"
msgstr "Sử dụng CPU trung bình toàn hệ thống"
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:569
#: src/components/routes/system.tsx:556
msgid "Average utilization of {0}"
msgstr ""
@@ -138,31 +141,31 @@ msgid "Backups"
msgstr "Sao lưu"
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:491
#: src/components/routes/system.tsx:482
msgid "Bandwidth"
msgstr "Băng thông"
#: src/components/login/auth-form.tsx:305
#: src/components/login/auth-form.tsx:306
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel hỗ trợ OpenID Connect và nhiều nhà cung cấp xác thực OAuth2."
#: src/components/routes/settings/notifications.tsx:129
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel sử dụng <0>Shoutrrr</0> để tích hợp với các dịch vụ thông báo phổ biến."
#: src/components/add-system.tsx:131
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "Nhị phân"
#: src/components/charts/mem-chart.tsx:87
#: src/components/charts/mem-chart.tsx:89
msgid "Cache / Buffers"
msgstr "Bộ nhớ đệm / Bộ đệm"
#: src/components/systems-table/systems-table.tsx:707
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "Hủy bỏ"
#: src/components/routes/settings/config-yaml.tsx:69
#: src/components/routes/settings/config-yaml.tsx:68
msgid "Caution - potential data loss"
msgstr "Cẩn thận - có thể mất dữ liệu"
@@ -174,37 +177,37 @@ msgstr "Thay đổi các tùy chọn ứng dụng chung."
msgid "Chart options"
msgstr "Tùy chọn biểu đồ"
#: src/components/login/forgot-pass-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:34
msgid "Check {email} for a reset link."
msgstr "Kiểm tra {email} để lấy liên kết đặt lại."
#: src/components/routes/settings/layout.tsx:41
#: src/components/routes/settings/layout.tsx:40
msgid "Check logs for more details."
msgstr "Kiểm tra nhật ký để biết thêm chi tiết."
#: src/components/routes/settings/notifications.tsx:185
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Kiểm tra dịch vụ thông báo của bạn"
#: src/components/add-system.tsx:205
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "Nhấp để sao chép"
#: src/components/login/forgot-pass-form.tsx:84
#: src/components/login/forgot-pass-form.tsx:90
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Hướng dẫn dòng lệnh"
#: src/components/routes/settings/notifications.tsx:79
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Cấu hình cách bạn nhận thông báo cảnh báo."
#: src/components/login/auth-form.tsx:213
#: src/components/login/auth-form.tsx:218
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "Xác nhận mật khẩu"
#: src/components/systems-table/systems-table.tsx:713
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "Tiếp tục"
@@ -212,16 +215,16 @@ msgstr "Tiếp tục"
msgid "Copied to clipboard"
msgstr "Đã sao chép vào clipboard"
#: src/components/add-system.tsx:216
#: src/components/add-system.tsx:218
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "Sao chép"
#: src/components/systems-table/systems-table.tsx:678
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "Sao chép máy chủ"
#: src/components/add-system.tsx:225
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "Sao chép lệnh Linux"
@@ -229,27 +232,27 @@ msgstr "Sao chép lệnh Linux"
msgid "Copy text"
msgstr "Sao chép văn bản"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "CPU"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:434
#: src/components/charts/area-chart.tsx:58
#: src/components/routes/system.tsx:425
#: src/components/charts/area-chart.tsx:56
msgid "CPU Usage"
msgstr "Sử dụng CPU"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "Tạo tài khoản"
#. Dark theme
#: src/components/mode-toggle.tsx:22
#: src/components/mode-toggle.tsx:21
msgid "Dark"
msgstr "Tối"
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:36
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Bảng điều khiển"
@@ -257,37 +260,37 @@ 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:683
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "Xóa"
#: src/components/systems-table/systems-table.tsx:204
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "Đĩa"
#: src/components/routes/system.tsx:481
#: src/components/routes/system.tsx:472
msgid "Disk I/O"
msgstr "Đĩa I/O"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:474
#: src/components/charts/disk-chart.tsx:77
#: src/components/routes/system.tsx:465
#: src/components/charts/disk-chart.tsx:79
msgid "Disk Usage"
msgstr "Sử dụng Đĩa"
#: src/components/routes/system.tsx:603
#: src/components/routes/system.tsx:593
msgid "Disk usage of {extraFsName}"
msgstr "Sử dụng đĩa của {extraFsName}"
#: src/components/routes/system.tsx:445
#: src/components/routes/system.tsx:436
msgid "Docker CPU Usage"
msgstr "Sử dụng CPU Docker"
#: src/components/routes/system.tsx:466
#: src/components/routes/system.tsx:457
msgid "Docker Memory Usage"
msgstr "Sử dụng Bộ nhớ Docker"
#: src/components/routes/system.tsx:507
#: src/components/routes/system.tsx:498
msgid "Docker Network I/O"
msgstr "Mạng I/O Docker"
@@ -297,22 +300,22 @@ msgstr "Tài liệu"
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:142
#: src/components/routes/system.tsx:345
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:336
msgid "Down"
msgstr ""
#: src/components/add-system.tsx:126
#: src/components/systems-table/systems-table.tsx:653
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr ""
#: src/components/login/forgot-pass-form.tsx:54
#: src/components/login/auth-form.tsx:176
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
msgid "Email"
msgstr "Email"
#: src/components/routes/settings/notifications.tsx:93
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "Thông báo email"
@@ -320,32 +323,32 @@ msgstr "Thông báo email"
msgid "Enter email address to reset password"
msgstr "Nhập địa chỉ email để đặt lại mật khẩu"
#: src/components/routes/settings/notifications.tsx:113
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Nhập địa chỉ email..."
#: src/components/routes/settings/notifications.tsx:189
#: src/components/routes/settings/config-yaml.tsx:29
#: src/components/login/auth-form.tsx:137
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "Lỗi"
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: src/components/routes/home.tsx:113
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "Vượt quá {0}{1} trong {2, plural, one {# phút} other {# phút}} qua"
#: src/components/routes/settings/config-yaml.tsx:73
#: src/components/routes/settings/config-yaml.tsx:72
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "Các hệ thống hiện có không được định nghĩa trong <0>config.yml</0> sẽ bị xóa. Vui lòng sao lưu thường xuyên."
#: src/components/routes/settings/config-yaml.tsx:94
#: src/components/routes/settings/config-yaml.tsx:93
msgid "Export configuration"
msgstr "Xuất cấu hình"
#: src/components/routes/settings/config-yaml.tsx:49
#: src/components/routes/settings/config-yaml.tsx:48
msgid "Export your current systems configuration."
msgstr "Xuất cấu hình hệ thống hiện tại của bạn."
@@ -353,60 +356,60 @@ msgstr "Xuất cấu hình hệ thống hiện tại của bạn."
msgid "Failed to authenticate"
msgstr "Xác thực thất bại"
#: src/components/routes/settings/notifications.tsx:64
#: src/components/routes/settings/layout.tsx:40
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
msgid "Failed to save settings"
msgstr "Lưu cài đặt thất bại"
#: src/components/routes/settings/notifications.tsx:190
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Gửi thông báo thử nghiệm thất bại"
#: src/components/alerts/alerts-system.tsx:26
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Cập nhật cảnh báo thất bại"
#: src/components/systems-table/systems-table.tsx:354
#: src/components/routes/system.tsx:643
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:633
msgid "Filter..."
msgstr "Lọc..."
#: src/components/alerts/alerts-system.tsx:285
#: src/components/alerts/alerts-system.tsx:230
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "Trong <0>{min}</0> {min, plural, one {phút} other {phút}}"
#: src/components/login/auth-form.tsx:328
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "Quên mật khẩu?"
#. Context: General settings
#: src/components/routes/settings/layout.tsx:52
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "Chung"
#: src/components/routes/system.tsx:546
#: src/components/routes/system.tsx:537
msgid "GPU Power Draw"
msgstr ""
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "Lưới"
#: src/components/add-system.tsx:159
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "Máy chủ / IP"
#: src/components/login/forgot-pass-form.tsx:94
#: src/components/login/forgot-pass-form.tsx:93
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Nếu bạn đã mất mật khẩu cho tài khoản quản trị viên của mình, bạn có thể đặt lại bằng cách sử dụng lệnh sau."
#: src/components/login/auth-form.tsx:18
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Địa chỉ email không hợp lệ."
#. Linux kernel
#: src/components/routes/system.tsx:271
#: src/components/routes/system.tsx:267
msgid "Kernel"
msgstr "Nhân"
@@ -414,12 +417,12 @@ msgstr "Nhân"
msgid "Language"
msgstr "Ngôn ngữ"
#: src/components/systems-table/systems-table.tsx:367
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "Bố cục"
#. Light theme
#: src/components/mode-toggle.tsx:17
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Sáng"
@@ -431,8 +434,8 @@ msgstr "Đăng xuất"
msgid "Login"
msgstr "Đăng nhập"
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "Nỗ lực đăng nhập thất bại"
@@ -441,49 +444,49 @@ msgstr "Nỗ lực đăng nhập thất bại"
msgid "Logs"
msgstr "Nhật ký"
#: src/components/routes/settings/notifications.tsx:82
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "Thay vào đó, bạn đang tìm nơi để tạo cảnh báo? Nhấp vào biểu tượng chuông <0/> trong bảng hệ thống."
#: src/components/routes/settings/layout.tsx:86
#: src/components/routes/settings/layout.tsx:85
msgid "Manage display and notification preferences."
msgstr "Quản lý tùy chọn hiển thị và thông báo."
#: src/components/add-system.tsx:227
#: src/components/add-system.tsx:226
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:673
#: src/components/routes/system.tsx:663
msgid "Max 1 min"
msgstr "Tối đa 1 phút"
#: src/components/systems-table/systems-table.tsx:195
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "Bộ nhớ"
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:456
#: src/components/routes/system.tsx:447
msgid "Memory Usage"
msgstr "Sử dụng Bộ nhớ"
#: src/components/routes/system.tsx:467
#: src/components/routes/system.tsx:458
msgid "Memory usage of docker containers"
msgstr "Sử dụng bộ nhớ của các container Docker"
#: src/components/add-system.tsx:155
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "Tên"
#: src/components/systems-table/systems-table.tsx:223
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "Mạng"
#: src/components/routes/system.tsx:508
#: src/components/routes/system.tsx:499
msgid "Network traffic of docker containers"
msgstr "Lưu lượng mạng của các container Docker"
#: src/components/routes/system.tsx:493
#: src/components/routes/system.tsx:484
msgid "Network traffic of public interfaces"
msgstr "Lưu lượng mạng của các giao diện công cộng"
@@ -491,34 +494,34 @@ msgstr "Lưu lượng mạng của các giao diện công cộng"
msgid "No results found."
msgstr "Không tìm thấy kết quả."
#: src/components/systems-table/systems-table.tsx:472
#: src/components/systems-table/systems-table.tsx:495
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "Không tìm thấy hệ thống."
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:76
#: src/components/routes/settings/layout.tsx:57
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
msgid "Notifications"
msgstr "Thông báo"
#: src/components/login/auth-form.tsx:300
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "Hỗ trợ OAuth 2 / OIDC"
#: src/components/routes/settings/config-yaml.tsx:62
#: src/components/routes/settings/config-yaml.tsx:61
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "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:639
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "Mở menu"
#: src/components/login/auth-form.tsx:251
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "Hoặc tiếp tục với"
#: src/components/alerts/alert-button.tsx:120
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "Ghi đè các cảnh báo hiện có"
@@ -530,41 +533,41 @@ msgstr "Trang"
msgid "Pages / Settings"
msgstr "Trang / Cài đặt"
#: src/components/login/auth-form.tsx:195
#: src/components/login/auth-form.tsx:200
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "Mật khẩu"
#: src/components/login/auth-form.tsx:21
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "Mật khẩu phải có ít nhất 8 ký tự."
#: src/components/login/auth-form.tsx:22
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr ""
#: src/components/login/forgot-pass-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Yêu cầu đặt lại mật khẩu đã được nhận"
#: src/components/systems-table/systems-table.tsx:672
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "Tạm dừng"
#: src/components/systems-table/systems-table.tsx:143
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr ""
#: src/components/routes/settings/notifications.tsx:97
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "Vui lòng <0>cấu hình máy chủ SMTP</0> để đảm bảo cảnh báo được gửi đi."
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Vui lòng kiểm tra nhật ký để biết thêm chi tiết."
#: src/components/login/forgot-pass-form.tsx:17
#: src/components/login/auth-form.tsx:41
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "Vui lòng kiểm tra thông tin đăng nhập của bạn và thử lại"
@@ -572,7 +575,7 @@ msgstr "Vui lòng kiểm tra thông tin đăng nhập của bạn và thử lạ
msgid "Please create an admin account"
msgstr "Vui lòng tạo một tài khoản quản trị viên"
#: src/components/login/auth-form.tsx:138
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Vui lòng bật cửa sổ bật lên cho trang web này"
@@ -580,7 +583,7 @@ msgstr "Vui lòng bật cửa sổ bật lên cho trang web này"
msgid "Please log in again"
msgstr "Vui lòng đăng nhập lại"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Vui lòng xem <0>tài liệu</0> để biết hướng dẫn."
@@ -588,12 +591,12 @@ msgstr "Vui lòng xem <0>tài liệu</0> để biết hướng dẫn."
msgid "Please sign in to your account"
msgstr "Vui lòng đăng nhập vào tài khoản của bạn"
#: src/components/add-system.tsx:171
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "Cổng"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:577
#: src/components/routes/system.tsx:448
#: src/components/routes/system.tsx:564
msgid "Precise utilization at the recorded time"
msgstr "Sử dụng chính xác tại thời điểm ghi nhận"
@@ -602,39 +605,39 @@ msgid "Preferred Language"
msgstr "Ngôn ngữ Ưa thích"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:182
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "Khóa"
#. Disk read
#: src/components/charts/area-chart.tsx:62
#: src/components/charts/area-chart.tsx:72
#: src/components/charts/area-chart.tsx:60
#: src/components/charts/area-chart.tsx:70
msgid "Read"
msgstr "Đọc"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx:67
#: src/components/charts/area-chart.tsx:65
msgid "Received"
msgstr "Đã nhận"
#: src/components/login/forgot-pass-form.tsx:77
#: src/components/login/forgot-pass-form.tsx:76
msgid "Reset Password"
msgstr "Đặt lại Mật khẩu"
#: src/components/systems-table/systems-table.tsx:667
#: src/components/systems-table/systems-table.tsx:628
msgid "Resume"
msgstr "Tiếp tục"
#: src/components/routes/settings/notifications.tsx:119
#: src/components/routes/settings/notifications.tsx:118
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Lưu địa chỉ bằng cách sử dụng phím enter hoặc dấu phẩy. Để trống để vô hiệu hóa thông báo email."
#: src/components/routes/settings/notifications.tsx:169
#: src/components/routes/settings/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
msgid "Save Settings"
msgstr "Lưu Cài đặt"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr ""
@@ -646,12 +649,12 @@ msgstr "Tìm kiếm"
msgid "Search for systems or settings..."
msgstr "Tìm kiếm hệ thống hoặc cài đặt..."
#: src/components/alerts/alert-button.tsx:82
#: src/components/alerts/alert-button.tsx:71
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Xem <0>cài đặt thông báo</0> để cấu hình cách bạn nhận cảnh báo."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx:66
#: src/components/charts/area-chart.tsx:64
msgid "Sent"
msgstr "Đã gửi"
@@ -662,16 +665,16 @@ msgstr "Đặt phạm vi thời gian mặc định cho biểu đồ khi một h
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:72
#: src/components/routes/settings/layout.tsx:83
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
msgstr "Cài đặt"
#: src/components/routes/settings/layout.tsx:34
#: src/components/routes/settings/layout.tsx:33
msgid "Settings saved"
msgstr "Cài đặt đã được lưu"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "Đăng nhập"
@@ -679,7 +682,7 @@ msgstr "Đăng nhập"
msgid "SMTP settings"
msgstr "Cài đặt SMTP"
#: src/components/systems-table/systems-table.tsx:389
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "Sắp xếp theo"
@@ -687,18 +690,21 @@ msgstr "Sắp xếp theo"
msgid "Status"
msgstr "Trạng thái"
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:514
msgid "Swap space used by the system"
msgstr "Không gian hoán đổi được sử dụng bởi hệ thống"
#: src/components/routes/system.tsx:522
#: src/components/routes/system.tsx:513
msgid "Swap Usage"
msgstr "Sử dụng Hoán đổi"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:27
#: src/components/systems-table/systems-table.tsx:152
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "Hệ thống"
@@ -706,70 +712,70 @@ msgstr "Hệ thống"
msgid "Systems"
msgstr "Các hệ thống"
#: src/components/routes/settings/config-yaml.tsx:56
#: src/components/routes/settings/config-yaml.tsx:55
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "Các hệ thống có thể được quản lý trong tệp <0>config.yml</0> bên trong thư mục dữ liệu của bạn."
#: src/components/systems-table/systems-table.tsx:377
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "Bảng"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:244
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr ""
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:534
#: src/components/routes/system.tsx:525
msgid "Temperature"
msgstr "Nhiệt độ"
#: src/components/routes/system.tsx:535
#: src/components/routes/system.tsx:526
msgid "Temperatures of system sensors"
msgstr "Nhiệt độ của các cảm biến hệ thống"
#: src/components/routes/settings/notifications.tsx:213
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Kiểm tra <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:184
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Thông báo thử nghiệm đã được gửi"
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:146
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "Tác nhân phải đang chạy trên hệ thống để kết nối. Sao chép lệnh cài đặt cho tác nhân bên dưới."
#: src/components/add-system.tsx:138
#: src/components/add-system.tsx:137
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "Tác nhân phải đang chạy trên hệ thống để kết nối. Sao chép <0>docker-compose.yml</0> cho tác nhân bên dưới."
#: src/components/login/forgot-pass-form.tsx:99
#: src/components/login/forgot-pass-form.tsx:98
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "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:699
#: src/components/systems-table/systems-table.tsx:660
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Hành động này không thể hoàn tác. Điều này sẽ xóa vĩnh viễn tất cả các bản ghi hiện tại cho {name} khỏi cơ sở dữ liệu."
#: src/components/routes/system.tsx:615
#: src/components/routes/system.tsx:605
msgid "Throughput of {extraFsName}"
msgstr "Thông lượng của {extraFsName}"
#: src/components/routes/system.tsx:482
#: src/components/routes/system.tsx:473
msgid "Throughput of root filesystem"
msgstr "Thông lượng của hệ thống tệp gốc"
#: src/components/routes/settings/notifications.tsx:108
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "Đến email(s)"
#: src/components/routes/system.tsx:409
#: src/components/routes/system.tsx:422
#: src/components/routes/system.tsx:400
#: src/components/routes/system.tsx:413
msgid "Toggle grid"
msgstr "Chuyển đổi lưới"
#: src/components/mode-toggle.tsx:34
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "Chuyển đổi chủ đề"
@@ -798,32 +804,32 @@ msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Kích hoạt khi sử dụng bất kỳ đĩa nào vượt quá ngưỡng"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:343
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:334
msgid "Up"
msgstr ""
#: src/components/systems-table/systems-table.tsx:350
#: src/components/systems-table/systems-table.tsx:337
msgid "Updated in real time. Click on a system to view information."
msgstr "Cập nhật theo thời gian thực. Nhấp vào một hệ thống để xem thông tin."
#: src/components/routes/system.tsx:270
#: src/components/routes/system.tsx:266
msgid "Uptime"
msgstr "Thời gian hoạt động"
#: src/components/routes/system.tsx:568
#: src/components/routes/system.tsx:602
#: src/components/charts/area-chart.tsx:75
#: src/components/routes/system.tsx:555
#: src/components/routes/system.tsx:592
#: src/components/charts/area-chart.tsx:73
msgid "Usage"
msgstr "Sử dụng"
#: src/components/routes/system.tsx:474
#: src/components/routes/system.tsx:465
msgid "Usage of root partition"
msgstr "Sử dụng phân vùng gốc"
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:63
#: src/components/charts/area-chart.tsx:75
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "Đã sử dụng"
@@ -832,15 +838,15 @@ msgstr "Đã sử dụng"
msgid "Users"
msgstr "Người dùng"
#: src/components/systems-table/systems-table.tsx:359
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "Xem"
#: src/components/systems-table/systems-table.tsx:424
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "Các cột hiển thị"
#: src/components/routes/system.tsx:707
#: src/components/routes/system.tsx:697
msgid "Waiting for enough records to display"
msgstr "Đang chờ đủ bản ghi để hiển thị"
@@ -848,24 +854,25 @@ msgstr "Đang chờ đủ bản ghi để hiển thị"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "Muốn giúp chúng tôi cải thiện bản dịch của mình? Xem <0>Crowdin</0> để biết thêm chi tiết."
#: src/components/routes/settings/notifications.tsx:126
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Thông báo Webhook / Push"
#. Disk write
#: src/components/charts/area-chart.tsx:61
#: src/components/charts/area-chart.tsx:71
#: src/components/charts/area-chart.tsx:59
#: src/components/charts/area-chart.tsx:69
msgid "Write"
msgstr "Ghi"
#: src/components/routes/settings/layout.tsx:62
#: src/components/routes/settings/layout.tsx:61
msgid "YAML Config"
msgstr "Cấu hình YAML"
#: src/components/routes/settings/config-yaml.tsx:46
#: src/components/routes/settings/config-yaml.tsx:45
msgid "YAML Configuration"
msgstr "Cấu hình YAML"
#: src/components/routes/settings/layout.tsx:35
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "Cài đặt người dùng của bạn đã được cập nhật."

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: zh\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-03-06 07:27\n"
"PO-Revision-Date: 2025-03-15 08:13\n"
"Last-Translator: \n"
"Language-Team: Chinese Simplified\n"
"Plural-Forms: nplurals=1; plural=0;\n"
@@ -300,7 +300,7 @@ msgstr "文档"
#: src/components/systems-table/systems-table.tsx:142
#: src/components/routes/system.tsx:345
msgid "Down"
msgstr ""
msgstr "停止"
#: src/components/add-system.tsx:126
#: src/components/systems-table/systems-table.tsx:653
@@ -553,7 +553,7 @@ msgstr "暂停"
#: src/components/systems-table/systems-table.tsx:143
msgid "Paused"
msgstr ""
msgstr "已暂停"
#: src/components/routes/settings/notifications.tsx:97
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
@@ -801,7 +801,7 @@ msgstr "当任何磁盘的使用率超过阈值时触发"
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:343
msgid "Up"
msgstr ""
msgstr "启动"
#: src/components/systems-table/systems-table.tsx:350
msgid "Updated in real time. Click on a system to view information."
@@ -869,3 +869,4 @@ msgstr "YAML配置"
#: src/components/routes/settings/layout.tsx:35
msgid "Your user settings have been updated."
msgstr "您的用户设置已更新。"

View File

@@ -19,11 +19,11 @@ msgstr ""
"X-Crowdin-File-ID: 16\n"
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:259
#: src/components/routes/system.tsx:255
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# 天} other {# 天}}"
#: src/components/routes/system.tsx:257
#: src/components/routes/system.tsx:253
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# 小時} other {# 小時}}"
@@ -48,27 +48,30 @@ msgid "30 days"
msgstr "30天"
#. Table column
#: src/components/systems-table/systems-table.tsx:304
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "操作"
#: src/components/routes/home.tsx:94
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "活動警報"
#: src/components/add-system.tsx:43
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "新增<0>系統</0>"
#: src/components/add-system.tsx:126
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "新增新系統"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Add system"
msgstr "新增系統"
#: src/components/routes/settings/notifications.tsx:158
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "添加 URL"
@@ -84,21 +87,21 @@ msgstr "調整圖表的顯示選項。"
msgid "Admin"
msgstr "管理員"
#: src/components/systems-table/systems-table.tsx:270
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "客户端"
#: src/components/alerts/alert-button.tsx:33
#: src/components/alerts/alert-button.tsx:79
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "警報"
#: src/components/systems-table/systems-table.tsx:347
#: src/components/alerts/alert-button.tsx:99
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
msgid "All Systems"
msgstr "所有系統"
#: src/components/systems-table/systems-table.tsx:696
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "您確定要刪除 {name} 嗎?"
@@ -106,29 +109,29 @@ msgstr "您確定要刪除 {name} 嗎?"
msgid "Automatic copy requires a secure context."
msgstr "自動複製需要安全的上下文。"
#: src/components/routes/system.tsx:670
#: src/components/routes/system.tsx:660
msgid "Average"
msgstr "平均"
#: src/components/routes/system.tsx:446
#: src/components/routes/system.tsx:437
msgid "Average CPU utilization of containers"
msgstr "容器的平均 CPU 使用率"
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:253
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "平均值超過 <0>{value}{0}</0>"
#: src/components/routes/system.tsx:547
#: src/components/routes/system.tsx:538
msgid "Average power consumption of GPUs"
msgstr "GPU 的平均功耗"
#: src/components/routes/system.tsx:435
#: src/components/routes/system.tsx:426
msgid "Average system-wide CPU utilization"
msgstr "系統的平均 CPU 使用率"
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:569
#: src/components/routes/system.tsx:556
msgid "Average utilization of {0}"
msgstr "{0} 的平均使用率"
@@ -138,31 +141,31 @@ msgid "Backups"
msgstr "備份"
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:491
#: src/components/routes/system.tsx:482
msgid "Bandwidth"
msgstr "帶寬"
#: src/components/login/auth-form.tsx:305
#: src/components/login/auth-form.tsx:306
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel支持OpenID Connect和許多OAuth2認證提供者。"
#: src/components/routes/settings/notifications.tsx:129
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel 使用 <0>Shoutrrr</0> 與流行的通知服務集成。"
#: src/components/add-system.tsx:131
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "執行檔"
#: src/components/charts/mem-chart.tsx:87
#: src/components/charts/mem-chart.tsx:89
msgid "Cache / Buffers"
msgstr "快取 / 緩衝區"
#: src/components/systems-table/systems-table.tsx:707
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "取消"
#: src/components/routes/settings/config-yaml.tsx:69
#: src/components/routes/settings/config-yaml.tsx:68
msgid "Caution - potential data loss"
msgstr "注意 - 可能遺失資料"
@@ -174,37 +177,37 @@ msgstr "更改一般應用選項。"
msgid "Chart options"
msgstr "圖表選項"
#: src/components/login/forgot-pass-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:34
msgid "Check {email} for a reset link."
msgstr "檢查 {email} 以獲取重置鏈接。"
#: src/components/routes/settings/layout.tsx:41
#: src/components/routes/settings/layout.tsx:40
msgid "Check logs for more details."
msgstr "檢查日誌以取得更多資訊。"
#: src/components/routes/settings/notifications.tsx:185
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "檢查您的通知服務"
#: src/components/add-system.tsx:205
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "點擊以複製"
#: src/components/login/forgot-pass-form.tsx:84
#: src/components/login/forgot-pass-form.tsx:90
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "命令行指令"
#: src/components/routes/settings/notifications.tsx:79
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "配置您接收警報通知的方式。"
#: src/components/login/auth-form.tsx:213
#: src/components/login/auth-form.tsx:218
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "確認密碼"
#: src/components/systems-table/systems-table.tsx:713
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "繼續"
@@ -212,16 +215,16 @@ msgstr "繼續"
msgid "Copied to clipboard"
msgstr "已複製到剪貼板"
#: src/components/add-system.tsx:216
#: src/components/add-system.tsx:218
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "複製"
#: src/components/systems-table/systems-table.tsx:678
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "複製主機"
#: src/components/add-system.tsx:225
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "複製 Linux 指令"
@@ -229,27 +232,27 @@ msgstr "複製 Linux 指令"
msgid "Copy text"
msgstr "複製文本"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "CPU"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:434
#: src/components/charts/area-chart.tsx:58
#: src/components/routes/system.tsx:425
#: src/components/charts/area-chart.tsx:56
msgid "CPU Usage"
msgstr "CPU 使用率"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "創建帳戶"
#. Dark theme
#: src/components/mode-toggle.tsx:22
#: src/components/mode-toggle.tsx:21
msgid "Dark"
msgstr "深色"
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:36
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "控制面板"
@@ -257,37 +260,37 @@ msgstr "控制面板"
msgid "Default time period"
msgstr "預設時間段"
#: src/components/systems-table/systems-table.tsx:683
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "刪除"
#: src/components/systems-table/systems-table.tsx:204
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "磁碟"
#: src/components/routes/system.tsx:481
#: src/components/routes/system.tsx:472
msgid "Disk I/O"
msgstr "磁碟 I/O"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:474
#: src/components/charts/disk-chart.tsx:77
#: src/components/routes/system.tsx:465
#: src/components/charts/disk-chart.tsx:79
msgid "Disk Usage"
msgstr "磁碟使用"
#: src/components/routes/system.tsx:603
#: src/components/routes/system.tsx:593
msgid "Disk usage of {extraFsName}"
msgstr "{extraFsName} 的磁碟使用量"
#: src/components/routes/system.tsx:445
#: src/components/routes/system.tsx:436
msgid "Docker CPU Usage"
msgstr "Docker CPU 使用率"
#: src/components/routes/system.tsx:466
#: src/components/routes/system.tsx:457
msgid "Docker Memory Usage"
msgstr "Docker 記憶體使用率"
#: src/components/routes/system.tsx:507
#: src/components/routes/system.tsx:498
msgid "Docker Network I/O"
msgstr "Docker 網絡 I/O"
@@ -297,22 +300,22 @@ msgstr "文件"
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:142
#: src/components/routes/system.tsx:345
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:336
msgid "Down"
msgstr ""
#: src/components/add-system.tsx:126
#: src/components/systems-table/systems-table.tsx:653
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr "編輯"
#: src/components/login/forgot-pass-form.tsx:54
#: src/components/login/auth-form.tsx:176
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
msgid "Email"
msgstr "電子郵件"
#: src/components/routes/settings/notifications.tsx:93
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "電子郵件通知"
@@ -320,32 +323,32 @@ msgstr "電子郵件通知"
msgid "Enter email address to reset password"
msgstr "輸入電子郵件地址以重置密碼"
#: src/components/routes/settings/notifications.tsx:113
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "輸入電子郵件地址..."
#: src/components/routes/settings/notifications.tsx:189
#: src/components/routes/settings/config-yaml.tsx:29
#: src/components/login/auth-form.tsx:137
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "錯誤"
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: src/components/routes/home.tsx:113
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "在過去的{2, plural, one {# 分鐘} other {# 分鐘}}中超過{0}{1}"
#: src/components/routes/settings/config-yaml.tsx:73
#: src/components/routes/settings/config-yaml.tsx:72
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "未在<0>config.yml</0>中定義的現有系統將被刪除。請定期備份。"
#: src/components/routes/settings/config-yaml.tsx:94
#: src/components/routes/settings/config-yaml.tsx:93
msgid "Export configuration"
msgstr "匯出設定"
#: src/components/routes/settings/config-yaml.tsx:49
#: src/components/routes/settings/config-yaml.tsx:48
msgid "Export your current systems configuration."
msgstr "匯出您現在的系統設定。"
@@ -353,60 +356,60 @@ msgstr "匯出您現在的系統設定。"
msgid "Failed to authenticate"
msgstr "認證失敗"
#: src/components/routes/settings/notifications.tsx:64
#: src/components/routes/settings/layout.tsx:40
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
msgid "Failed to save settings"
msgstr "儲存設定失敗"
#: src/components/routes/settings/notifications.tsx:190
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "發送測試通知失敗"
#: src/components/alerts/alerts-system.tsx:26
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "更新警報失敗"
#: src/components/systems-table/systems-table.tsx:354
#: src/components/routes/system.tsx:643
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:633
msgid "Filter..."
msgstr "篩選..."
#: src/components/alerts/alerts-system.tsx:285
#: src/components/alerts/alerts-system.tsx:230
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "持續<0>{min}</0> {min, plural, one {分鐘} other {分鐘}}"
#: src/components/login/auth-form.tsx:328
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "忘記密碼?"
#. Context: General settings
#: src/components/routes/settings/layout.tsx:52
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "一般"
#: src/components/routes/system.tsx:546
#: src/components/routes/system.tsx:537
msgid "GPU Power Draw"
msgstr "GPU 功耗"
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "網格"
#: src/components/add-system.tsx:159
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "主機 / IP"
#: src/components/login/forgot-pass-form.tsx:94
#: src/components/login/forgot-pass-form.tsx:93
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "如果您遺失了管理員帳號密碼,可以使用以下指令重設。"
#: src/components/login/auth-form.tsx:18
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "無效的電子郵件地址。"
#. Linux kernel
#: src/components/routes/system.tsx:271
#: src/components/routes/system.tsx:267
msgid "Kernel"
msgstr "Kernel"
@@ -414,12 +417,12 @@ msgstr "Kernel"
msgid "Language"
msgstr "語言"
#: src/components/systems-table/systems-table.tsx:367
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "版面配置"
#. Light theme
#: src/components/mode-toggle.tsx:17
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "淺色"
@@ -431,8 +434,8 @@ msgstr "登出"
msgid "Login"
msgstr "登入"
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "登入嘗試失敗"
@@ -441,49 +444,49 @@ msgstr "登入嘗試失敗"
msgid "Logs"
msgstr "日誌"
#: src/components/routes/settings/notifications.tsx:82
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "在尋找創建警報的位置嗎?點擊系統表中的鈴鐺<0/>。"
#: src/components/routes/settings/layout.tsx:86
#: src/components/routes/settings/layout.tsx:85
msgid "Manage display and notification preferences."
msgstr "管理顯示和通知偏好。"
#: src/components/add-system.tsx:227
#: src/components/add-system.tsx:226
msgid "Manual setup instructions"
msgstr "手動設定說明"
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:673
#: src/components/routes/system.tsx:663
msgid "Max 1 min"
msgstr "一分鐘內最大值"
#: src/components/systems-table/systems-table.tsx:195
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "記憶體"
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:456
#: src/components/routes/system.tsx:447
msgid "Memory Usage"
msgstr "記憶體使用"
#: src/components/routes/system.tsx:467
#: src/components/routes/system.tsx:458
msgid "Memory usage of docker containers"
msgstr "Docker 容器的記憶體使用量"
#: src/components/add-system.tsx:155
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "名稱"
#: src/components/systems-table/systems-table.tsx:223
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "網絡"
#: src/components/routes/system.tsx:508
#: src/components/routes/system.tsx:499
msgid "Network traffic of docker containers"
msgstr "Docker 容器的網絡流量"
#: src/components/routes/system.tsx:493
#: src/components/routes/system.tsx:484
msgid "Network traffic of public interfaces"
msgstr "公共接口的網絡流量"
@@ -491,34 +494,34 @@ msgstr "公共接口的網絡流量"
msgid "No results found."
msgstr "未找到結果。"
#: src/components/systems-table/systems-table.tsx:472
#: src/components/systems-table/systems-table.tsx:495
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "未找到系統。"
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:76
#: src/components/routes/settings/layout.tsx:57
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
msgid "Notifications"
msgstr "通知"
#: src/components/login/auth-form.tsx:300
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "支援 OAuth 2 / OIDC"
#: src/components/routes/settings/config-yaml.tsx:62
#: src/components/routes/settings/config-yaml.tsx:61
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "每次重新啟動時,將會以檔案中的系統定義更新資料庫。"
#: src/components/systems-table/systems-table.tsx:639
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "開啟選單"
#: src/components/login/auth-form.tsx:251
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "或繼續使用"
#: src/components/alerts/alert-button.tsx:120
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "覆蓋現有警報"
@@ -530,41 +533,41 @@ msgstr "頁面"
msgid "Pages / Settings"
msgstr "頁面 / 設定"
#: src/components/login/auth-form.tsx:195
#: src/components/login/auth-form.tsx:200
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "密碼"
#: src/components/login/auth-form.tsx:21
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "密碼必須至少包含 8 個字符。"
#: src/components/login/auth-form.tsx:22
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr "密碼必須少於 72 個字節。"
#: src/components/login/forgot-pass-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "已收到密碼重設請求"
#: src/components/systems-table/systems-table.tsx:672
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "暫停"
#: src/components/systems-table/systems-table.tsx:143
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr ""
#: src/components/routes/settings/notifications.tsx:97
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "請<0>配置SMTP伺服器</0>以確保警報被傳送。"
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "請檢查日誌以獲取更多資訊。"
#: src/components/login/forgot-pass-form.tsx:17
#: src/components/login/auth-form.tsx:41
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "請檢查您的憑證並重試"
@@ -572,7 +575,7 @@ msgstr "請檢查您的憑證並重試"
msgid "Please create an admin account"
msgstr "請建立一個管理員帳號"
#: src/components/login/auth-form.tsx:138
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "請為此網站啟用彈出窗口"
@@ -580,7 +583,7 @@ msgstr "請為此網站啟用彈出窗口"
msgid "Please log in again"
msgstr "請重新登入"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "請參閱<0>文件</0>以取得說明。"
@@ -588,12 +591,12 @@ msgstr "請參閱<0>文件</0>以取得說明。"
msgid "Please sign in to your account"
msgstr "請登入您的帳號"
#: src/components/add-system.tsx:171
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "端口"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:577
#: src/components/routes/system.tsx:448
#: src/components/routes/system.tsx:564
msgid "Precise utilization at the recorded time"
msgstr "記錄時間的精確使用率"
@@ -602,39 +605,39 @@ msgid "Preferred Language"
msgstr "首選語言"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:182
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "公鑰"
#. Disk read
#: src/components/charts/area-chart.tsx:62
#: src/components/charts/area-chart.tsx:72
#: src/components/charts/area-chart.tsx:60
#: src/components/charts/area-chart.tsx:70
msgid "Read"
msgstr "讀取"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx:67
#: src/components/charts/area-chart.tsx:65
msgid "Received"
msgstr "接收"
#: src/components/login/forgot-pass-form.tsx:77
#: src/components/login/forgot-pass-form.tsx:76
msgid "Reset Password"
msgstr "重設密碼"
#: src/components/systems-table/systems-table.tsx:667
#: src/components/systems-table/systems-table.tsx:628
msgid "Resume"
msgstr "恢復"
#: src/components/routes/settings/notifications.tsx:119
#: src/components/routes/settings/notifications.tsx:118
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "使用回車鍵或逗號保存地址。留空以禁用電子郵件通知。"
#: src/components/routes/settings/notifications.tsx:169
#: src/components/routes/settings/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
msgid "Save Settings"
msgstr "儲存設定"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr "儲存系統"
@@ -646,12 +649,12 @@ msgstr "搜索"
msgid "Search for systems or settings..."
msgstr "搜索系統或設置..."
#: src/components/alerts/alert-button.tsx:82
#: src/components/alerts/alert-button.tsx:71
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "查看<0>通知設置</0>以配置您接收警報的方式。"
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx:66
#: src/components/charts/area-chart.tsx:64
msgid "Sent"
msgstr "發送"
@@ -662,16 +665,16 @@ msgstr "設置查看系統時圖表的默認時間範圍。"
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:72
#: src/components/routes/settings/layout.tsx:83
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
msgstr "設置"
#: src/components/routes/settings/layout.tsx:34
#: src/components/routes/settings/layout.tsx:33
msgid "Settings saved"
msgstr "設置已保存"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "登錄"
@@ -679,7 +682,7 @@ msgstr "登錄"
msgid "SMTP settings"
msgstr "SMTP設置"
#: src/components/systems-table/systems-table.tsx:389
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "排序依據"
@@ -687,18 +690,21 @@ msgstr "排序依據"
msgid "Status"
msgstr "狀態"
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:514
msgid "Swap space used by the system"
msgstr "系統使用的交換空間"
#: src/components/routes/system.tsx:522
#: src/components/routes/system.tsx:513
msgid "Swap Usage"
msgstr "交換使用"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:27
#: src/components/systems-table/systems-table.tsx:152
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "系統"
@@ -706,70 +712,70 @@ msgstr "系統"
msgid "Systems"
msgstr "系統"
#: src/components/routes/settings/config-yaml.tsx:56
#: src/components/routes/settings/config-yaml.tsx:55
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "系統可以在您的數據目錄中的<0>config.yml</0>文件中管理。"
#: src/components/systems-table/systems-table.tsx:377
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "表格"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:244
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr "溫度"
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:534
#: src/components/routes/system.tsx:525
msgid "Temperature"
msgstr "溫度"
#: src/components/routes/system.tsx:535
#: src/components/routes/system.tsx:526
msgid "Temperatures of system sensors"
msgstr "系統傳感器的溫度"
#: src/components/routes/settings/notifications.tsx:213
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "測試<0>URL</0>"
#: src/components/routes/settings/notifications.tsx:184
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "測試通知已發送"
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:146
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "代理必須在系統上運行才能連接。複製下面的代理安裝命令。"
#: src/components/add-system.tsx:138
#: src/components/add-system.tsx:137
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "代理必須在系統上運行才能連接。複製下面的<0>docker-compose.yml</0>。"
#: src/components/login/forgot-pass-form.tsx:99
#: src/components/login/forgot-pass-form.tsx:98
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "然後登錄到後端並在用戶表中重置您的用戶帳戶密碼。"
#: src/components/systems-table/systems-table.tsx:699
#: src/components/systems-table/systems-table.tsx:660
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "此操作無法撤銷。這將永久刪除數據庫中{name}的所有當前記錄。"
#: src/components/routes/system.tsx:615
#: src/components/routes/system.tsx:605
msgid "Throughput of {extraFsName}"
msgstr "{extraFsName}的吞吐量"
#: src/components/routes/system.tsx:482
#: src/components/routes/system.tsx:473
msgid "Throughput of root filesystem"
msgstr "根文件系統的吞吐量"
#: src/components/routes/settings/notifications.tsx:108
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "發送到電子郵件"
#: src/components/routes/system.tsx:409
#: src/components/routes/system.tsx:422
#: src/components/routes/system.tsx:400
#: src/components/routes/system.tsx:413
msgid "Toggle grid"
msgstr "切換網格"
#: src/components/mode-toggle.tsx:34
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "切換主題"
@@ -798,32 +804,32 @@ msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "當任何磁碟的使用超過閾值時觸發"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:343
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:334
msgid "Up"
msgstr ""
#: src/components/systems-table/systems-table.tsx:350
#: src/components/systems-table/systems-table.tsx:337
msgid "Updated in real time. Click on a system to view information."
msgstr "實時更新。點擊系統查看信息。"
#: src/components/routes/system.tsx:270
#: src/components/routes/system.tsx:266
msgid "Uptime"
msgstr "正常運行時間"
#: src/components/routes/system.tsx:568
#: src/components/routes/system.tsx:602
#: src/components/charts/area-chart.tsx:75
#: src/components/routes/system.tsx:555
#: src/components/routes/system.tsx:592
#: src/components/charts/area-chart.tsx:73
msgid "Usage"
msgstr "使用"
#: src/components/routes/system.tsx:474
#: src/components/routes/system.tsx:465
msgid "Usage of root partition"
msgstr "根分區的使用"
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:63
#: src/components/charts/area-chart.tsx:75
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "已用"
@@ -832,15 +838,15 @@ msgstr "已用"
msgid "Users"
msgstr "用戶"
#: src/components/systems-table/systems-table.tsx:359
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "檢視"
#: src/components/systems-table/systems-table.tsx:424
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "可見欄位"
#: src/components/routes/system.tsx:707
#: src/components/routes/system.tsx:697
msgid "Waiting for enough records to display"
msgstr "等待足夠的記錄以顯示"
@@ -848,24 +854,25 @@ msgstr "等待足夠的記錄以顯示"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "想幫助我們改進翻譯嗎?查看<0>Crowdin</0>以獲取更多詳細信息。"
#: src/components/routes/settings/notifications.tsx:126
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / 推送通知"
#. Disk write
#: src/components/charts/area-chart.tsx:61
#: src/components/charts/area-chart.tsx:71
#: src/components/charts/area-chart.tsx:59
#: src/components/charts/area-chart.tsx:69
msgid "Write"
msgstr "寫入"
#: src/components/routes/settings/layout.tsx:62
#: src/components/routes/settings/layout.tsx:61
msgid "YAML Config"
msgstr "YAML配置"
#: src/components/routes/settings/config-yaml.tsx:46
#: src/components/routes/settings/config-yaml.tsx:45
msgid "YAML Configuration"
msgstr "YAML配置"
#: src/components/routes/settings/layout.tsx:35
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "您的用戶設置已更新。"

View File

@@ -19,11 +19,11 @@ msgstr ""
"X-Crowdin-File-ID: 16\n"
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:259
#: src/components/routes/system.tsx:255
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# 天} other {# 天}}"
#: src/components/routes/system.tsx:257
#: src/components/routes/system.tsx:253
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# 小時} other {# 小時}}"
@@ -48,27 +48,30 @@ msgid "30 days"
msgstr "30天"
#. Table column
#: src/components/systems-table/systems-table.tsx:304
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "操作"
#: src/components/routes/home.tsx:94
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "活動警報"
#: src/components/add-system.tsx:43
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "新增<0>系統</0>"
#: src/components/add-system.tsx:126
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "新增新系統"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Add system"
msgstr "新增系統"
#: src/components/routes/settings/notifications.tsx:158
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "新增 URL"
@@ -84,21 +87,21 @@ msgstr "調整圖表的顯示選項。"
msgid "Admin"
msgstr "管理員"
#: src/components/systems-table/systems-table.tsx:270
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "代理"
#: src/components/alerts/alert-button.tsx:33
#: src/components/alerts/alert-button.tsx:79
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "警報"
#: src/components/systems-table/systems-table.tsx:347
#: src/components/alerts/alert-button.tsx:99
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
msgid "All Systems"
msgstr "所有系統"
#: src/components/systems-table/systems-table.tsx:696
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "您確定要刪除 {name} 嗎?"
@@ -106,29 +109,29 @@ msgstr "您確定要刪除 {name} 嗎?"
msgid "Automatic copy requires a secure context."
msgstr "只有在受保護的環境才能自動複製。"
#: src/components/routes/system.tsx:670
#: src/components/routes/system.tsx:660
msgid "Average"
msgstr "平均"
#: src/components/routes/system.tsx:446
#: src/components/routes/system.tsx:437
msgid "Average CPU utilization of containers"
msgstr "容器的平均 CPU 使用率"
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:253
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "平均值超過<0>{value}{0}</0>"
#: src/components/routes/system.tsx:547
#: src/components/routes/system.tsx:538
msgid "Average power consumption of GPUs"
msgstr "GPU 的平均功耗"
#: src/components/routes/system.tsx:435
#: src/components/routes/system.tsx:426
msgid "Average system-wide CPU utilization"
msgstr "系統的平均 CPU 使用率"
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:569
#: src/components/routes/system.tsx:556
msgid "Average utilization of {0}"
msgstr "{0} 的平均使用率"
@@ -138,31 +141,31 @@ msgid "Backups"
msgstr "備份"
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:491
#: src/components/routes/system.tsx:482
msgid "Bandwidth"
msgstr "網路流量"
#: src/components/login/auth-form.tsx:305
#: src/components/login/auth-form.tsx:306
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel支援OpenID Connect和許多OAuth2認證提供者。"
#: src/components/routes/settings/notifications.tsx:129
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel 以 <0>Shoutrrr</0> 整合常用的通知服務。"
#: src/components/add-system.tsx:131
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "執行檔"
#: src/components/charts/mem-chart.tsx:87
#: src/components/charts/mem-chart.tsx:89
msgid "Cache / Buffers"
msgstr "快取/緩衝"
#: src/components/systems-table/systems-table.tsx:707
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "取消"
#: src/components/routes/settings/config-yaml.tsx:69
#: src/components/routes/settings/config-yaml.tsx:68
msgid "Caution - potential data loss"
msgstr "注意 - 可能遺失資料"
@@ -174,37 +177,37 @@ msgstr "修改一般應用程式選項。"
msgid "Chart options"
msgstr "圖表選項"
#: src/components/login/forgot-pass-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:34
msgid "Check {email} for a reset link."
msgstr "檢查{email}以取得重設連結。"
#: src/components/routes/settings/layout.tsx:41
#: src/components/routes/settings/layout.tsx:40
msgid "Check logs for more details."
msgstr "檢查系統記錄以取得更多資訊。"
#: src/components/routes/settings/notifications.tsx:185
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "檢查您的通知服務"
#: src/components/add-system.tsx:205
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "點擊複製"
#: src/components/login/forgot-pass-form.tsx:84
#: src/components/login/forgot-pass-form.tsx:90
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "命令列指令"
#: src/components/routes/settings/notifications.tsx:79
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "設定您要如何接收警報通知"
#: src/components/login/auth-form.tsx:213
#: src/components/login/auth-form.tsx:218
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "確認密碼"
#: src/components/systems-table/systems-table.tsx:713
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "繼續"
@@ -212,16 +215,16 @@ msgstr "繼續"
msgid "Copied to clipboard"
msgstr "已複製到剪貼簿"
#: src/components/add-system.tsx:216
#: src/components/add-system.tsx:218
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "複製"
#: src/components/systems-table/systems-table.tsx:678
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "複製主機"
#: src/components/add-system.tsx:225
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "複製 Linux 指令"
@@ -229,27 +232,27 @@ msgstr "複製 Linux 指令"
msgid "Copy text"
msgstr "複製文字"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "CPU"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:434
#: src/components/charts/area-chart.tsx:58
#: src/components/routes/system.tsx:425
#: src/components/charts/area-chart.tsx:56
msgid "CPU Usage"
msgstr "CPU 使用率"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "建立帳號"
#. Dark theme
#: src/components/mode-toggle.tsx:22
#: src/components/mode-toggle.tsx:21
msgid "Dark"
msgstr "深色"
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:36
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "控制面板"
@@ -257,37 +260,37 @@ msgstr "控制面板"
msgid "Default time period"
msgstr "預設時間段"
#: src/components/systems-table/systems-table.tsx:683
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "刪除"
#: src/components/systems-table/systems-table.tsx:204
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "磁碟"
#: src/components/routes/system.tsx:481
#: src/components/routes/system.tsx:472
msgid "Disk I/O"
msgstr "磁碟 I/O"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:474
#: src/components/charts/disk-chart.tsx:77
#: src/components/routes/system.tsx:465
#: src/components/charts/disk-chart.tsx:79
msgid "Disk Usage"
msgstr "磁碟使用量"
#: src/components/routes/system.tsx:603
#: src/components/routes/system.tsx:593
msgid "Disk usage of {extraFsName}"
msgstr "{extraFsName}的磁碟使用量"
#: src/components/routes/system.tsx:445
#: src/components/routes/system.tsx:436
msgid "Docker CPU Usage"
msgstr "Docker CPU 使用率"
#: src/components/routes/system.tsx:466
#: src/components/routes/system.tsx:457
msgid "Docker Memory Usage"
msgstr "Docker 記憶體使用率"
#: src/components/routes/system.tsx:507
#: src/components/routes/system.tsx:498
msgid "Docker Network I/O"
msgstr "Docker 網路 I/O"
@@ -297,22 +300,22 @@ msgstr "文件"
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:142
#: src/components/routes/system.tsx:345
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:336
msgid "Down"
msgstr ""
#: src/components/add-system.tsx:126
#: src/components/systems-table/systems-table.tsx:653
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr "編輯"
#: src/components/login/forgot-pass-form.tsx:54
#: src/components/login/auth-form.tsx:176
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
msgid "Email"
msgstr "電子郵件"
#: src/components/routes/settings/notifications.tsx:93
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "電子郵件通知"
@@ -320,32 +323,32 @@ msgstr "電子郵件通知"
msgid "Enter email address to reset password"
msgstr "輸入電子郵件地址以重設密碼"
#: src/components/routes/settings/notifications.tsx:113
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "輸入電子郵件地址..."
#: src/components/routes/settings/notifications.tsx:189
#: src/components/routes/settings/config-yaml.tsx:29
#: src/components/login/auth-form.tsx:137
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "錯誤"
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: src/components/routes/home.tsx:113
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "在過去的{2, plural, one {# 分鐘} other {# 分鐘}}中超過{0}{1}"
#: src/components/routes/settings/config-yaml.tsx:73
#: src/components/routes/settings/config-yaml.tsx:72
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "未在 <0>config.yml</0> 中定義的現有系統將會被刪除。請定期備份。"
#: src/components/routes/settings/config-yaml.tsx:94
#: src/components/routes/settings/config-yaml.tsx:93
msgid "Export configuration"
msgstr "匯出設定"
#: src/components/routes/settings/config-yaml.tsx:49
#: src/components/routes/settings/config-yaml.tsx:48
msgid "Export your current systems configuration."
msgstr "匯出您現在的系統設定。"
@@ -353,60 +356,60 @@ msgstr "匯出您現在的系統設定。"
msgid "Failed to authenticate"
msgstr "認證失敗"
#: src/components/routes/settings/notifications.tsx:64
#: src/components/routes/settings/layout.tsx:40
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
msgid "Failed to save settings"
msgstr "儲存設定失敗"
#: src/components/routes/settings/notifications.tsx:190
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "發送測試通知失敗"
#: src/components/alerts/alerts-system.tsx:26
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "更新警報失敗"
#: src/components/systems-table/systems-table.tsx:354
#: src/components/routes/system.tsx:643
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:633
msgid "Filter..."
msgstr "篩選..."
#: src/components/alerts/alerts-system.tsx:285
#: src/components/alerts/alerts-system.tsx:230
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "持續<0>{min}</0> {min, plural, one {分鐘} other {分鐘}}"
#: src/components/login/auth-form.tsx:328
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "忘記密碼?"
#. Context: General settings
#: src/components/routes/settings/layout.tsx:52
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "一般"
#: src/components/routes/system.tsx:546
#: src/components/routes/system.tsx:537
msgid "GPU Power Draw"
msgstr "GPU 功耗"
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "網格"
#: src/components/add-system.tsx:159
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "Host / IP"
#: src/components/login/forgot-pass-form.tsx:94
#: src/components/login/forgot-pass-form.tsx:93
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "如果您遺失管理員帳號密碼,可以使用以下指令重設。"
#: src/components/login/auth-form.tsx:18
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "無效的電子郵件地址。"
#. Linux kernel
#: src/components/routes/system.tsx:271
#: src/components/routes/system.tsx:267
msgid "Kernel"
msgstr "Kernel"
@@ -414,12 +417,12 @@ msgstr "Kernel"
msgid "Language"
msgstr "語言"
#: src/components/systems-table/systems-table.tsx:367
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "版面配置"
#. Light theme
#: src/components/mode-toggle.tsx:17
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "淺色"
@@ -431,8 +434,8 @@ msgstr "登出"
msgid "Login"
msgstr "登入"
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "登入失敗"
@@ -441,49 +444,49 @@ msgstr "登入失敗"
msgid "Logs"
msgstr "系統記錄"
#: src/components/routes/settings/notifications.tsx:82
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "在尋找從哪裡建立警報嗎?點擊系統列表中的小鈴鐺<0/>。"
#: src/components/routes/settings/layout.tsx:86
#: src/components/routes/settings/layout.tsx:85
msgid "Manage display and notification preferences."
msgstr "管理顯示和通知偏好。"
#: src/components/add-system.tsx:227
#: src/components/add-system.tsx:226
msgid "Manual setup instructions"
msgstr "手動設定說明"
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:673
#: src/components/routes/system.tsx:663
msgid "Max 1 min"
msgstr "最多1分鐘"
#: src/components/systems-table/systems-table.tsx:195
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "記憶體"
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:456
#: src/components/routes/system.tsx:447
msgid "Memory Usage"
msgstr "記憶體使用量"
#: src/components/routes/system.tsx:467
#: src/components/routes/system.tsx:458
msgid "Memory usage of docker containers"
msgstr "Docker 容器的記憶體使用量"
#: src/components/add-system.tsx:155
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "名稱"
#: src/components/systems-table/systems-table.tsx:223
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "網路"
#: src/components/routes/system.tsx:508
#: src/components/routes/system.tsx:499
msgid "Network traffic of docker containers"
msgstr "Docker 容器的網路流量"
#: src/components/routes/system.tsx:493
#: src/components/routes/system.tsx:484
msgid "Network traffic of public interfaces"
msgstr "公開介面的網路流量"
@@ -491,34 +494,34 @@ msgstr "公開介面的網路流量"
msgid "No results found."
msgstr "找不到結果。"
#: src/components/systems-table/systems-table.tsx:472
#: src/components/systems-table/systems-table.tsx:495
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "找不到任何系統。"
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:76
#: src/components/routes/settings/layout.tsx:57
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
msgid "Notifications"
msgstr "通知"
#: src/components/login/auth-form.tsx:300
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "支援 OAuth 2 / OIDC"
#: src/components/routes/settings/config-yaml.tsx:62
#: src/components/routes/settings/config-yaml.tsx:61
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "每次重新啟動時,將會以檔案中的系統定義更新資料庫。"
#: src/components/systems-table/systems-table.tsx:639
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "開啟選單"
#: src/components/login/auth-form.tsx:251
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "或繼續使用"
#: src/components/alerts/alert-button.tsx:120
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "覆蓋現有警報"
@@ -530,41 +533,41 @@ msgstr "頁面"
msgid "Pages / Settings"
msgstr "頁面 / 設定"
#: src/components/login/auth-form.tsx:195
#: src/components/login/auth-form.tsx:200
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "密碼"
#: src/components/login/auth-form.tsx:21
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "密碼需要至少8個字元"
#: src/components/login/auth-form.tsx:22
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr "密碼必須少於 72 個位元組。"
#: src/components/login/forgot-pass-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "已收到密碼重設請求"
#: src/components/systems-table/systems-table.tsx:672
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "暫停"
#: src/components/systems-table/systems-table.tsx:143
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr ""
#: src/components/routes/settings/notifications.tsx:97
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "請<0>設定一個SMTP 伺服器</0>以確保能傳送警報。"
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "請檢查系統記錄以取得更多資訊。"
#: src/components/login/forgot-pass-form.tsx:17
#: src/components/login/auth-form.tsx:41
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "請檢查您的憑證後重試"
@@ -572,7 +575,7 @@ msgstr "請檢查您的憑證後重試"
msgid "Please create an admin account"
msgstr "請建立一個管理員帳號"
#: src/components/login/auth-form.tsx:138
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "請為此網站啟用彈出視窗"
@@ -580,7 +583,7 @@ msgstr "請為此網站啟用彈出視窗"
msgid "Please log in again"
msgstr "請重新登入"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "請參閱<0>文件</0>以取得說明。"
@@ -588,12 +591,12 @@ msgstr "請參閱<0>文件</0>以取得說明。"
msgid "Please sign in to your account"
msgstr "請登入您的帳號"
#: src/components/add-system.tsx:171
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "Port"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:577
#: src/components/routes/system.tsx:448
#: src/components/routes/system.tsx:564
msgid "Precise utilization at the recorded time"
msgstr "紀錄時間內的精確使用量"
@@ -602,39 +605,39 @@ msgid "Preferred Language"
msgstr "首選語言"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:182
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "公鑰"
#. Disk read
#: src/components/charts/area-chart.tsx:62
#: src/components/charts/area-chart.tsx:72
#: src/components/charts/area-chart.tsx:60
#: src/components/charts/area-chart.tsx:70
msgid "Read"
msgstr "讀取"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx:67
#: src/components/charts/area-chart.tsx:65
msgid "Received"
msgstr "接收"
#: src/components/login/forgot-pass-form.tsx:77
#: src/components/login/forgot-pass-form.tsx:76
msgid "Reset Password"
msgstr "重設密碼"
#: src/components/systems-table/systems-table.tsx:667
#: src/components/systems-table/systems-table.tsx:628
msgid "Resume"
msgstr "繼續"
#: src/components/routes/settings/notifications.tsx:119
#: src/components/routes/settings/notifications.tsx:118
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "使用 Enter 鍵或逗號儲存地址。留空以停用電子郵件通知。"
#: src/components/routes/settings/notifications.tsx:169
#: src/components/routes/settings/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
msgid "Save Settings"
msgstr "儲存設定"
#: src/components/add-system.tsx:232
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr "儲存系統"
@@ -646,12 +649,12 @@ msgstr "搜尋"
msgid "Search for systems or settings..."
msgstr "在設定或系統中搜尋..."
#: src/components/alerts/alert-button.tsx:82
#: src/components/alerts/alert-button.tsx:71
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "查看<0>通知設定</0>以設定您如何接收警報。"
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx:66
#: src/components/charts/area-chart.tsx:64
msgid "Sent"
msgstr "傳送"
@@ -662,16 +665,16 @@ msgstr "設定顯示系統圖表的預設時間範圍。"
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:72
#: src/components/routes/settings/layout.tsx:83
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
msgstr "設定"
#: src/components/routes/settings/layout.tsx:34
#: src/components/routes/settings/layout.tsx:33
msgid "Settings saved"
msgstr "已儲存設定"
#: src/components/login/auth-form.tsx:239
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "登入"
@@ -679,7 +682,7 @@ msgstr "登入"
msgid "SMTP settings"
msgstr "SMTP 設定"
#: src/components/systems-table/systems-table.tsx:389
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "排序"
@@ -687,18 +690,21 @@ msgstr "排序"
msgid "Status"
msgstr "狀態"
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:514
msgid "Swap space used by the system"
msgstr "系統的虛擬記憶體使用量"
#: src/components/routes/system.tsx:522
#: src/components/routes/system.tsx:513
msgid "Swap Usage"
msgstr "虛擬記憶體使用量"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:27
#: src/components/systems-table/systems-table.tsx:152
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "系統"
@@ -706,70 +712,70 @@ msgstr "系統"
msgid "Systems"
msgstr "系統"
#: src/components/routes/settings/config-yaml.tsx:56
#: src/components/routes/settings/config-yaml.tsx:55
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "可以用您Data資料夾中的<0>config.yml</0>來管理系統。"
#: src/components/systems-table/systems-table.tsx:377
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "列表"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:244
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr "溫度"
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:534
#: src/components/routes/system.tsx:525
msgid "Temperature"
msgstr "溫度"
#: src/components/routes/system.tsx:535
#: src/components/routes/system.tsx:526
msgid "Temperatures of system sensors"
msgstr "系統感應器的溫度"
#: src/components/routes/settings/notifications.tsx:213
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "測試<0>URL</0>"
#: src/components/routes/settings/notifications.tsx:184
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "已發送測試通知"
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:146
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "必須在系統上執行代理程式才能連線,複製以下代理程式的安裝指令。"
#: src/components/add-system.tsx:138
#: src/components/add-system.tsx:137
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "必須在系統上執行代理程式才能連線,複製以下代理程式的<0>docker-compose.yml</0>。"
#: src/components/login/forgot-pass-form.tsx:99
#: src/components/login/forgot-pass-form.tsx:98
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "然後登入後台並在使用者列表中重設您的帳號密碼。"
#: src/components/systems-table/systems-table.tsx:699
#: src/components/systems-table/systems-table.tsx:660
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "此操作無法復原。這將永久刪除資料庫中{name}的所有當前記錄。"
#: src/components/routes/system.tsx:615
#: src/components/routes/system.tsx:605
msgid "Throughput of {extraFsName}"
msgstr "{extraFsName}的傳輸速率"
#: src/components/routes/system.tsx:482
#: src/components/routes/system.tsx:473
msgid "Throughput of root filesystem"
msgstr "Root文件系統的傳輸速率"
#: src/components/routes/settings/notifications.tsx:108
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "發送到電子郵件"
#: src/components/routes/system.tsx:409
#: src/components/routes/system.tsx:422
#: src/components/routes/system.tsx:400
#: src/components/routes/system.tsx:413
msgid "Toggle grid"
msgstr "切換網格"
#: src/components/mode-toggle.tsx:34
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "切換主題"
@@ -798,32 +804,32 @@ msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "當任何磁碟使用率超過閾值時觸發"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:343
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:334
msgid "Up"
msgstr ""
#: src/components/systems-table/systems-table.tsx:350
#: src/components/systems-table/systems-table.tsx:337
msgid "Updated in real time. Click on a system to view information."
msgstr "實時更新。點擊系統顯示資訊。"
#: src/components/routes/system.tsx:270
#: src/components/routes/system.tsx:266
msgid "Uptime"
msgstr "運行時間"
#: src/components/routes/system.tsx:568
#: src/components/routes/system.tsx:602
#: src/components/charts/area-chart.tsx:75
#: src/components/routes/system.tsx:555
#: src/components/routes/system.tsx:592
#: src/components/charts/area-chart.tsx:73
msgid "Usage"
msgstr "使用量"
#: src/components/routes/system.tsx:474
#: src/components/routes/system.tsx:465
msgid "Usage of root partition"
msgstr "Root 分區的使用量"
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:63
#: src/components/charts/area-chart.tsx:75
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "已使用"
@@ -832,15 +838,15 @@ msgstr "已使用"
msgid "Users"
msgstr "使用者"
#: src/components/systems-table/systems-table.tsx:359
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "檢視"
#: src/components/systems-table/systems-table.tsx:424
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "顯示欄位"
#: src/components/routes/system.tsx:707
#: src/components/routes/system.tsx:697
msgid "Waiting for enough records to display"
msgstr "等待足夠的記錄以顯示"
@@ -848,24 +854,25 @@ msgstr "等待足夠的記錄以顯示"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "想幫助我們改善翻譯嗎?查看<0>Crowdin</0>以取得更多詳細信息。"
#: src/components/routes/settings/notifications.tsx:126
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / 推送通知"
#. Disk write
#: src/components/charts/area-chart.tsx:61
#: src/components/charts/area-chart.tsx:71
#: src/components/charts/area-chart.tsx:59
#: src/components/charts/area-chart.tsx:69
msgid "Write"
msgstr "寫入"
#: src/components/routes/settings/layout.tsx:62
#: src/components/routes/settings/layout.tsx:61
msgid "YAML Config"
msgstr "YAML 設定檔"
#: src/components/routes/settings/config-yaml.tsx:46
#: src/components/routes/settings/config-yaml.tsx:45
msgid "YAML Configuration"
msgstr "YAML 設定檔"
#: src/components/routes/settings/layout.tsx:35
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "已更新您的使用者設定"

View File

@@ -1,11 +1,11 @@
import "./index.css"
// import { Suspense, lazy, useEffect, StrictMode } from "react"
import { Suspense, lazy, memo, useEffect } from "react"
import { Suspense, lazy, useEffect } from "react"
import ReactDOM from "react-dom/client"
import { Home } from "./components/routes/home.tsx"
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 { $authenticated, $systems, pb, $publicKey, $hubVersion, $copyContent, $direction } from "./lib/stores.ts"
import { updateUserSettings, updateAlerts, updateFavicon, updateSystemList } from "./lib/utils.ts"
import { useStore } from "@nanostores/react"
import { Toaster } from "./components/ui/toaster.tsx"
@@ -14,14 +14,13 @@ import SystemDetail from "./components/routes/system.tsx"
import Navbar from "./components/navbar.tsx"
import { I18nProvider } from "@lingui/react"
import { i18n } from "@lingui/core"
import { getLocale, dynamicActivate } from "./lib/i18n.ts"
// const ServerDetail = lazy(() => import('./components/routes/system.tsx'))
const LoginPage = lazy(() => import("./components/login/login.tsx"))
const CopyToClipboardDialog = lazy(() => import("./components/copy-to-clipboard.tsx"))
const Settings = lazy(() => import("./components/routes/settings/layout.tsx"))
const App = memo(() => {
const App = () => {
const page = useStore($router)
const authenticated = useStore($authenticated)
const systems = useStore($systems)
@@ -34,6 +33,7 @@ const App = memo(() => {
// get version / public key
pb.send("/api/beszel/getkey", {}).then((data) => {
$publicKey.set(data.key)
$hubVersion.set(data.v)
})
// get servers / alerts / settings
updateUserSettings()
@@ -74,7 +74,7 @@ const App = memo(() => {
</Suspense>
)
}
})
}
const Layout = () => {
const authenticated = useStore($authenticated)
@@ -110,25 +110,15 @@ const Layout = () => {
)
}
const I18nApp = () => {
useEffect(() => {
dynamicActivate(getLocale())
}, [])
return (
<I18nProvider i18n={i18n}>
<ThemeProvider>
<Layout />
<Toaster />
</ThemeProvider>
</I18nProvider>
)
}
ReactDOM.createRoot(document.getElementById("app")!).render(
// strict mode in dev mounts / unmounts components twice
// and breaks the clipboard dialog
//<StrictMode>
<I18nApp />
<I18nProvider i18n={i18n}>
<ThemeProvider>
<Layout />
<Toaster />
</ThemeProvider>
</I18nProvider>
//</StrictMode>
)

View File

@@ -2,9 +2,8 @@ import { RecordModel } from "pocketbase"
// global window properties
declare global {
var BESZEL: {
interface Window {
BASE_PATH: string
HUB_VERSION: string
}
}

View File

@@ -2,7 +2,6 @@ import { defineConfig } from "vite"
import path from "path"
import react from "@vitejs/plugin-react-swc"
import { lingui } from "@lingui/vite-plugin"
import { version } from "./package.json"
export default defineConfig({
base: "./",
@@ -11,13 +10,6 @@ export default defineConfig({
plugins: [["@lingui/swc-plugin", {}]],
}),
lingui(),
{
name: "replace version in index.html during dev",
apply: "serve",
transformIndexHtml(html) {
return html.replace("{{V}}", version)
},
},
],
esbuild: {
legalComments: "external",

View File

@@ -1,6 +1,6 @@
package beszel
const (
Version = "0.10.2"
Version = "0.9.1"
AppName = "beszel"
)

View File

@@ -21,6 +21,7 @@ ProtectClock=yes
ProtectHome=read-only
ProtectHostname=yes
ProtectKernelLogs=yes
ProtectKernelTunables=yes
ProtectSystem=strict
RemoveIPC=yes
RestrictSUIDSGID=true

View File

@@ -483,6 +483,7 @@ ProtectClock=yes
ProtectHome=read-only
ProtectHostname=yes
ProtectKernelLogs=yes
ProtectKernelTunables=yes
ProtectSystem=strict
RemoveIPC=yes
RestrictSUIDSGID=true