mirror of
https://github.com/henrygd/beszel.git
synced 2026-09-25 19:07:47 +02:00
Compare commits
70 Commits
2784460621
...
l10n_main_
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
173b561f14 | ||
|
|
820e1d5de5 | ||
|
|
f2bf04f111 | ||
|
|
c32d962f9f | ||
|
|
f85b5ba3bf | ||
|
|
79ebf54bbc | ||
|
|
6fb22b7205 | ||
|
|
d9a7897dbe | ||
|
|
c7b72cc101 | ||
|
|
53fcd9bdff | ||
|
|
43ecac1155 | ||
|
|
b4c9e2237a | ||
|
|
c23a4d313f | ||
|
|
f99ba28b5e | ||
|
|
ebe0428445 | ||
|
|
36d864e797 | ||
|
|
bd295dbd49 | ||
|
|
960224aeca | ||
|
|
6265bc58c7 | ||
|
|
e99e0d8cfa | ||
|
|
7f187a895a | ||
|
|
45dde45e54 | ||
|
|
ab55501768 | ||
|
|
209fcd59f6 | ||
|
|
7c95bb1efd | ||
|
|
c1ea72b66c | ||
|
|
02278df9c7 | ||
|
|
a4eb214f26 | ||
|
|
afc8827744 | ||
|
|
6f781d37b2 | ||
|
|
12011d54f5 | ||
|
|
8602c82ff2 | ||
|
|
234d10ae7a | ||
|
|
a203315ae3 | ||
|
|
ac3f859ea5 | ||
|
|
a06fed4d2b | ||
|
|
2d1624e37a | ||
|
|
e7c27a2bd5 | ||
|
|
c21412f45d | ||
|
|
367d2f39da | ||
|
|
eabd9a950a | ||
|
|
0be9882b34 | ||
|
|
e4b84b72ab | ||
|
|
fc33e62736 | ||
|
|
a99fe5e997 | ||
|
|
0870716052 | ||
|
|
b1270e341c | ||
|
|
9042a8c5c8 | ||
|
|
8bf6917fe0 | ||
|
|
2d5ea3fa08 | ||
|
|
627d364071 | ||
|
|
8047f005d4 | ||
|
|
4a4610bbc3 | ||
|
|
1aaabfc255 | ||
|
|
97ea3c16cb | ||
|
|
c9de35fad2 | ||
|
|
a5f216f425 | ||
|
|
cbe4824ac3 | ||
|
|
2c69197d2d | ||
|
|
97e6f64bdc | ||
|
|
4a5915b141 | ||
|
|
e68372dce4 | ||
|
|
c52f3acb94 | ||
|
|
c09eb8c6df | ||
|
|
a0dc19eacf | ||
|
|
912bc50874 | ||
|
|
c54dbfba7c | ||
|
|
dd3f7d58b5 | ||
|
|
0509053a69 | ||
|
|
187dc886a9 |
@@ -68,10 +68,11 @@ type dockerManager struct {
|
||||
excludeContainers []string // Patterns to exclude containers by name
|
||||
usingPodman bool // Whether the Docker Engine API is running on Podman
|
||||
|
||||
registryClient *http.Client // Client for registry requests; nil uses a client with a 10-second timeout
|
||||
imageUpdatesMutex sync.RWMutex // Protects imageUpdates, its entries, and imageUpdatesRunning
|
||||
imageUpdates map[string]*imageUpdateStatus // Shared update status keyed by normalized image reference
|
||||
imageUpdatesRunning bool // Whether a background image-update batch is in progress
|
||||
registryClient *http.Client // Client for registry requests; nil uses a client with a 10-second timeout
|
||||
imageUpdatesDisabled bool // Whether image update checks are disabled by configuration
|
||||
imageUpdatesMutex sync.RWMutex // Protects imageUpdates, its entries, and imageUpdatesRunning
|
||||
imageUpdates map[string]*imageUpdateStatus // Shared update status keyed by normalized image reference
|
||||
imageUpdatesRunning bool // Whether a background image-update batch is in progress
|
||||
|
||||
// Cache-time-aware tracking for CPU stats (similar to cpu.go)
|
||||
// Maps cache time intervals to container-specific CPU usage tracking
|
||||
@@ -688,6 +689,8 @@ func newDockerManager(agent *Agent) *dockerManager {
|
||||
userAgent: "Docker-Client/",
|
||||
}
|
||||
|
||||
dockerImageCheck, _ := utils.GetEnv("DOCKER_IMAGE_CHECK")
|
||||
|
||||
// Read container exclusion patterns from environment variable
|
||||
var excludeContainers []string
|
||||
if excludeStr, set := utils.GetEnv("EXCLUDE_CONTAINERS"); set && excludeStr != "" {
|
||||
@@ -707,10 +710,11 @@ func newDockerManager(agent *Agent) *dockerManager {
|
||||
Timeout: timeout,
|
||||
Transport: userAgentTransport,
|
||||
},
|
||||
containerStatsMap: make(map[string]*container.Stats),
|
||||
sem: make(chan struct{}, 5),
|
||||
apiContainerList: []*container.ApiInfo{},
|
||||
excludeContainers: excludeContainers,
|
||||
containerStatsMap: make(map[string]*container.Stats),
|
||||
sem: make(chan struct{}, 5),
|
||||
apiContainerList: []*container.ApiInfo{},
|
||||
excludeContainers: excludeContainers,
|
||||
imageUpdatesDisabled: dockerImageCheck == "false",
|
||||
|
||||
// Initialize cache-time-aware tracking structures
|
||||
lastCpuContainer: make(map[uint16]map[string]uint64),
|
||||
|
||||
@@ -31,6 +31,9 @@ func normalizedImageReference(image string) string {
|
||||
// refreshImageUpdates starts at most one background batch. Neither its network
|
||||
// work nor its completion is part of the container metrics wait group.
|
||||
func (dm *dockerManager) refreshImageUpdates(containers []*container.ApiInfo, now time.Time) {
|
||||
if dm.imageUpdatesDisabled {
|
||||
return
|
||||
}
|
||||
dm.imageUpdatesMutex.Lock()
|
||||
defer dm.imageUpdatesMutex.Unlock()
|
||||
if dm.imageUpdatesRunning {
|
||||
|
||||
@@ -27,6 +27,29 @@ func waitForImageUpdates(t *testing.T, dm *dockerManager) {
|
||||
}, time.Second*3, time.Millisecond)
|
||||
}
|
||||
|
||||
func TestDisableDockerImageUpdateCheck(t *testing.T) {
|
||||
t.Setenv("BESZEL_AGENT_DOCKER_IMAGE_CHECK", "false")
|
||||
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
if r.URL.Path == "/version" {
|
||||
fmt.Fprint(w, `{"Version":"25.0.0"}`)
|
||||
return
|
||||
}
|
||||
http.NotFound(w, r)
|
||||
}))
|
||||
defer server.Close()
|
||||
t.Setenv("BESZEL_AGENT_DOCKER_HOST", server.URL)
|
||||
|
||||
dm := newDockerManager(nil)
|
||||
require.True(t, dm.imageUpdatesDisabled)
|
||||
dm.registryClient = &http.Client{Transport: roundTripFunc(func(*http.Request) (*http.Response, error) {
|
||||
t.Fatal("disabled image update check made a registry request")
|
||||
return nil, nil
|
||||
})}
|
||||
dm.refreshImageUpdates([]*container.ApiInfo{{Image: "nginx", Names: []string{"/nginx"}}}, time.Now())
|
||||
require.False(t, dm.imageUpdatesRunning)
|
||||
require.Nil(t, dm.imageUpdates)
|
||||
}
|
||||
|
||||
func TestImageUpdateCacheAndStats(t *testing.T) {
|
||||
local := "sha256:" + strings.Repeat("a", 64)
|
||||
remote := "sha256:" + strings.Repeat("b", 64)
|
||||
|
||||
@@ -6,6 +6,7 @@ import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"slices"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
@@ -37,7 +38,7 @@ func (dm *dockerManager) checkImageUpdate(image string) (bool, error) {
|
||||
repository := reference.Path(named)
|
||||
tag := named.(reference.Tagged).Tag()
|
||||
|
||||
localDigest, err := dm.inspectImageDigest(image, registry, repository)
|
||||
localDigests, err := dm.inspectImageDigests(image, registry, repository)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
@@ -47,48 +48,49 @@ func (dm *dockerManager) checkImageUpdate(image string) (bool, error) {
|
||||
return false, err
|
||||
}
|
||||
|
||||
return remoteDigest != localDigest, nil
|
||||
return !slices.Contains(localDigests, remoteDigest), nil
|
||||
}
|
||||
|
||||
// inspectImageDigest reads Docker's image metadata without using dm.decode.
|
||||
// inspectImageDigests reads Docker's image metadata without using dm.decode.
|
||||
// The checker runs in the image-discovery goroutine, so it must not hold any
|
||||
// of the container statistics locks while waiting on the Docker API.
|
||||
func (dm *dockerManager) inspectImageDigest(image, registry, repository string) (string, error) {
|
||||
func (dm *dockerManager) inspectImageDigests(image, registry, repository string) ([]string, error) {
|
||||
if dm.client == nil {
|
||||
return "", fmt.Errorf("inspect image %q: Docker client is unavailable", image)
|
||||
return nil, fmt.Errorf("inspect image %q: Docker client is unavailable", image)
|
||||
}
|
||||
|
||||
endpoint := "http://localhost/images/" + url.PathEscape(image) + "/json"
|
||||
resp, err := dm.client.Get(endpoint)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("inspect image %q: %w", image, err)
|
||||
return nil, fmt.Errorf("inspect image %q: %w", image, err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
return "", fmt.Errorf("inspect image %q failed: %s", image, responseStatus(resp))
|
||||
return nil, fmt.Errorf("inspect image %q failed: %s", image, responseStatus(resp))
|
||||
}
|
||||
|
||||
var inspect struct {
|
||||
RepoDigests []string `json:"RepoDigests"`
|
||||
}
|
||||
if err := json.NewDecoder(resp.Body).Decode(&inspect); err != nil {
|
||||
return "", fmt.Errorf("decode image inspect %q: %w", image, err)
|
||||
return nil, fmt.Errorf("decode image inspect %q: %w", image, err)
|
||||
}
|
||||
if len(inspect.RepoDigests) == 0 {
|
||||
return "", fmt.Errorf("inspect image %q returned no repository digests", image)
|
||||
return nil, fmt.Errorf("inspect image %q returned no repository digests", image)
|
||||
}
|
||||
|
||||
localDigest, ok := matchingRepositoryDigest(inspect.RepoDigests, registry, repository)
|
||||
if !ok {
|
||||
return "", fmt.Errorf("inspect image %q returned no valid digest for %s/%s", image, registry, repository)
|
||||
localDigests := matchingRepositoryDigests(inspect.RepoDigests, registry, repository)
|
||||
if len(localDigests) == 0 {
|
||||
return nil, fmt.Errorf("inspect image %q returned no valid digest for %s/%s", image, registry, repository)
|
||||
}
|
||||
return localDigest, nil
|
||||
return localDigests, nil
|
||||
}
|
||||
|
||||
// matchingRepositoryDigest returns a valid digest belonging to the requested
|
||||
// repository. Docker can return multiple RepoDigests for one local image; an
|
||||
// unrelated first entry must never be used for the comparison.
|
||||
func matchingRepositoryDigest(repoDigests []string, registry, repository string) (string, bool) {
|
||||
// matchingRepositoryDigests returns all valid digests belonging to the requested
|
||||
// repository. Container engines can return both index and platform manifest digests for one
|
||||
// local image, in either order.
|
||||
func matchingRepositoryDigests(repoDigests []string, registry, repository string) []string {
|
||||
var digests []string
|
||||
for _, repoDigest := range repoDigests {
|
||||
repoDigest = strings.TrimSpace(repoDigest)
|
||||
at := strings.LastIndexByte(repoDigest, '@')
|
||||
@@ -108,9 +110,9 @@ func matchingRepositoryDigest(repoDigests []string, registry, repository string)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
return d.String(), true
|
||||
digests = append(digests, d.String())
|
||||
}
|
||||
return "", false
|
||||
return digests
|
||||
}
|
||||
|
||||
func sameRegistry(left, right string) bool {
|
||||
|
||||
@@ -80,6 +80,45 @@ func TestCheckImageUpdateUsesInspectAndManifestDigests(t *testing.T) {
|
||||
require.EqualValues(t, 1, manifestCalls.Load())
|
||||
}
|
||||
|
||||
func TestCheckImageUpdateMatchesAnyRepositoryDigest(t *testing.T) {
|
||||
platform := registryDigest('a')
|
||||
index := registryDigest('b')
|
||||
other := registryDigest('c')
|
||||
|
||||
for _, test := range []struct {
|
||||
name string
|
||||
digests []string
|
||||
remote string
|
||||
available bool
|
||||
}{
|
||||
{name: "platform then index, remote index", digests: []string{platform, index}, remote: index},
|
||||
{name: "index then platform, remote index", digests: []string{index, platform}, remote: index},
|
||||
{name: "platform then index, remote platform", digests: []string{platform, index}, remote: platform},
|
||||
{name: "index then platform, remote platform", digests: []string{index, platform}, remote: platform},
|
||||
{name: "neither matches", digests: []string{platform, index}, remote: other, available: true},
|
||||
} {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
inspect := fmt.Sprintf(`{"RepoDigests":["docker.io/library/busybox@%s","docker.io/library/alpine@%s","docker.io/library/alpine@sha256:invalid","docker.io/library/alpine@%s"]}`, test.remote, test.digests[0], test.digests[1])
|
||||
var manifestCalls atomic.Int32
|
||||
dm := newRegistryChecker(t, inspect, registryTransportFunc(func(req *http.Request) (*http.Response, error) {
|
||||
if req.Method == http.MethodGet {
|
||||
return registryResponse(http.StatusOK, `{"token":"test"}`), nil
|
||||
}
|
||||
manifestCalls.Add(1)
|
||||
require.Equal(t, http.MethodHead, req.Method)
|
||||
resp := registryResponse(http.StatusOK, "")
|
||||
resp.Header.Set("Docker-Content-Digest", test.remote)
|
||||
return resp, nil
|
||||
}))
|
||||
|
||||
available, err := dm.checkImageUpdate("alpine")
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, test.available, available)
|
||||
require.EqualValues(t, 1, manifestCalls.Load())
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestCheckImageUpdateReportsUnknownInspectState(t *testing.T) {
|
||||
for _, test := range []struct {
|
||||
name string
|
||||
|
||||
@@ -15,6 +15,7 @@ type MonitorManager struct {
|
||||
mu sync.RWMutex
|
||||
monitors map[string]*monitorTask // keyed by monitor ID
|
||||
probe monitorProbe
|
||||
certCheck certChecker
|
||||
resumeGuard monitorResumeGuard
|
||||
}
|
||||
|
||||
@@ -23,7 +24,7 @@ func newMonitorManager() *MonitorManager {
|
||||
}
|
||||
|
||||
func newMonitorManagerWithProbe(probe monitorProbe) *MonitorManager {
|
||||
return &MonitorManager{monitors: make(map[string]*monitorTask), probe: probe}
|
||||
return &MonitorManager{monitors: make(map[string]*monitorTask), probe: probe, certCheck: checkCert}
|
||||
}
|
||||
|
||||
// SyncMonitors replaces all monitor tasks with the given configs.
|
||||
@@ -107,7 +108,7 @@ func (pm *MonitorManager) UpsertMonitor(config monitor.Config, runNow bool) (*mo
|
||||
if !runNow {
|
||||
return nil, nil
|
||||
}
|
||||
return task.runProbe(pm.probe), nil
|
||||
return pm.runNow(task), nil
|
||||
}
|
||||
if exists {
|
||||
task.cancel()
|
||||
@@ -119,7 +120,7 @@ func (pm *MonitorManager) UpsertMonitor(config monitor.Config, runNow bool) (*mo
|
||||
pm.mu.Unlock()
|
||||
|
||||
if runNow {
|
||||
result := task.runProbe(pm.probe)
|
||||
result := pm.runNow(task)
|
||||
pm.startMonitor(task)
|
||||
return result, nil
|
||||
}
|
||||
@@ -127,6 +128,19 @@ func (pm *MonitorManager) UpsertMonitor(config monitor.Config, runNow bool) (*mo
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// runNow runs a probe and any due certificate check concurrently, so the
|
||||
// response fits within the hub's single probe timeout budget.
|
||||
func (pm *MonitorManager) runNow(task *monitorTask) *monitor.Result {
|
||||
var wg sync.WaitGroup
|
||||
wg.Go(func() { task.refreshCert(pm.certCheck) })
|
||||
result := task.runProbe(pm.probe)
|
||||
wg.Wait()
|
||||
if result != nil {
|
||||
result.Cert = task.certInfo()
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// DeleteMonitor stops and removes a single monitor task.
|
||||
func (pm *MonitorManager) DeleteMonitor(id string) {
|
||||
if id == "" {
|
||||
@@ -158,6 +172,11 @@ func (pm *MonitorManager) GetResults(durationMs uint16) map[string]monitor.Resul
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
// Only the default interval updates monitor records on the hub, so
|
||||
// realtime requests must not consume the unsent certificate.
|
||||
if durationMs == defaultDataCacheTimeMs {
|
||||
result.Cert = task.takeUnsentCert()
|
||||
}
|
||||
results[task.config.ID] = result
|
||||
}
|
||||
|
||||
|
||||
74
agent/network_monitor_cert.go
Normal file
74
agent/network_monitor_cert.go
Normal file
@@ -0,0 +1,74 @@
|
||||
package agent
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/tls"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net"
|
||||
"net/url"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/henrygd/beszel/internal/entities/monitor"
|
||||
)
|
||||
|
||||
const (
|
||||
certCheckInterval = 24 * time.Hour
|
||||
certCheckRetryInterval = time.Hour
|
||||
)
|
||||
|
||||
// certChecker fetches the leaf certificate for an HTTPS target.
|
||||
type certChecker func(context.Context, string) (monitor.CertInfo, error)
|
||||
|
||||
// certCheckEnabled reports whether a monitor's certificate is checked, which is
|
||||
// the case for every HTTP monitor with an https target.
|
||||
func certCheckEnabled(config monitor.Config) bool {
|
||||
return config.Protocol == "http" && len(config.Target) > 8 && strings.EqualFold(config.Target[:8], "https://")
|
||||
}
|
||||
|
||||
// checkCert reads the leaf certificate presented by an HTTPS target. The chain is
|
||||
// not verified, so expired or self-signed certificates are still reported.
|
||||
func checkCert(ctx context.Context, target string) (monitor.CertInfo, error) {
|
||||
address, host, err := certAddress(target)
|
||||
if err != nil {
|
||||
return monitor.CertInfo{}, err
|
||||
}
|
||||
ctx, cancel := context.WithTimeout(ctx, monitor.MaxProbeTimeout)
|
||||
defer cancel()
|
||||
dialer := tls.Dialer{Config: &tls.Config{ServerName: host, InsecureSkipVerify: true}}
|
||||
conn, err := dialer.DialContext(ctx, "tcp", address)
|
||||
if err != nil {
|
||||
return monitor.CertInfo{}, err
|
||||
}
|
||||
defer conn.Close()
|
||||
certs := conn.(*tls.Conn).ConnectionState().PeerCertificates
|
||||
if len(certs) == 0 {
|
||||
return monitor.CertInfo{}, errors.New("no peer certificates")
|
||||
}
|
||||
leaf := certs[0]
|
||||
return monitor.CertInfo{
|
||||
Expires: leaf.NotAfter.UnixMilli(),
|
||||
Issuer: leaf.Issuer.CommonName,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// certAddress returns the dial address and server name for an HTTPS URL.
|
||||
func certAddress(target string) (address, host string, err error) {
|
||||
u, err := url.Parse(target)
|
||||
if err != nil {
|
||||
return "", "", err
|
||||
}
|
||||
if !strings.EqualFold(u.Scheme, "https") {
|
||||
return "", "", fmt.Errorf("certificate check requires an https target: %s", target)
|
||||
}
|
||||
host = u.Hostname()
|
||||
if host == "" {
|
||||
return "", "", fmt.Errorf("missing host in target: %s", target)
|
||||
}
|
||||
port := u.Port()
|
||||
if port == "" {
|
||||
port = "443"
|
||||
}
|
||||
return net.JoinHostPort(host, port), host, nil
|
||||
}
|
||||
184
agent/network_monitor_cert_test.go
Normal file
184
agent/network_monitor_cert_test.go
Normal file
@@ -0,0 +1,184 @@
|
||||
//go:build testing
|
||||
|
||||
package agent
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"testing"
|
||||
"testing/synctest"
|
||||
"time"
|
||||
|
||||
"github.com/henrygd/beszel/internal/entities/monitor"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestCheckCertReadsUnverifiedLeaf(t *testing.T) {
|
||||
server := httptest.NewTLSServer(http.HandlerFunc(func(http.ResponseWriter, *http.Request) {}))
|
||||
defer server.Close()
|
||||
|
||||
// httptest uses a self-signed certificate, which must still be reported.
|
||||
info, err := checkCert(context.Background(), server.URL)
|
||||
require.NoError(t, err)
|
||||
leaf := server.Certificate()
|
||||
assert.Equal(t, leaf.NotAfter.UnixMilli(), info.Expires)
|
||||
assert.Equal(t, leaf.Issuer.CommonName, info.Issuer)
|
||||
}
|
||||
|
||||
func TestCertAddress(t *testing.T) {
|
||||
tests := []struct {
|
||||
target, address, host string
|
||||
wantErr bool
|
||||
}{
|
||||
{target: "https://example.com", address: "example.com:443", host: "example.com"},
|
||||
{target: "https://example.com:8443/path?q=1", address: "example.com:8443", host: "example.com"},
|
||||
{target: "HTTPS://[::1]:9443", address: "[::1]:9443", host: "::1"},
|
||||
{target: "http://example.com", wantErr: true},
|
||||
{target: "https://", wantErr: true},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
address, host, err := certAddress(tt.target)
|
||||
if tt.wantErr {
|
||||
assert.Error(t, err, tt.target)
|
||||
continue
|
||||
}
|
||||
require.NoError(t, err, tt.target)
|
||||
assert.Equal(t, tt.address, address)
|
||||
assert.Equal(t, tt.host, host)
|
||||
}
|
||||
}
|
||||
|
||||
func TestRefreshCertCadence(t *testing.T) {
|
||||
synctest.Test(t, func(t *testing.T) {
|
||||
task := newMonitorTask(monitor.Config{ID: "test", Target: "https://example.test", Protocol: "http"})
|
||||
defer task.cancel()
|
||||
var calls int
|
||||
var fail error
|
||||
// Far enough out that the regular interval applies for the whole test.
|
||||
expires := time.Now().Add(365 * 24 * time.Hour).UnixMilli()
|
||||
check := func(context.Context, string) (monitor.CertInfo, error) {
|
||||
calls++
|
||||
if fail != nil {
|
||||
return monitor.CertInfo{}, fail
|
||||
}
|
||||
return monitor.CertInfo{Expires: expires + int64(calls)}, nil
|
||||
}
|
||||
|
||||
task.refreshCert(check)
|
||||
require.NotNil(t, task.certInfo())
|
||||
assert.Equal(t, expires+1, task.certInfo().Expires)
|
||||
|
||||
// Not due again until the check interval passes.
|
||||
time.Sleep(certCheckInterval - time.Second)
|
||||
task.refreshCert(check)
|
||||
assert.Equal(t, 1, calls)
|
||||
time.Sleep(time.Second)
|
||||
task.refreshCert(check)
|
||||
assert.Equal(t, 2, calls)
|
||||
|
||||
// Failures keep the last known certificate and retry sooner.
|
||||
fail = errors.New("connection refused")
|
||||
time.Sleep(certCheckInterval)
|
||||
task.refreshCert(check)
|
||||
assert.Equal(t, 3, calls)
|
||||
assert.Equal(t, expires+2, task.certInfo().Expires)
|
||||
time.Sleep(certCheckRetryInterval)
|
||||
fail = nil
|
||||
task.refreshCert(check)
|
||||
assert.Equal(t, 4, calls)
|
||||
assert.Equal(t, expires+4, task.certInfo().Expires)
|
||||
})
|
||||
}
|
||||
|
||||
func TestRefreshCertRetriesSoonerNearExpiry(t *testing.T) {
|
||||
for _, tc := range []struct {
|
||||
name string
|
||||
expires time.Duration // relative to the check
|
||||
interval time.Duration
|
||||
}{
|
||||
{"expired", -time.Hour, certCheckRetryInterval},
|
||||
{"expires before next regular check", certCheckInterval - time.Minute, certCheckRetryInterval},
|
||||
{"expires after next regular check", certCheckInterval + time.Minute, certCheckInterval},
|
||||
} {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
synctest.Test(t, func(t *testing.T) {
|
||||
task := newMonitorTask(monitor.Config{ID: "test", Target: "https://example.test", Protocol: "http"})
|
||||
defer task.cancel()
|
||||
var calls int
|
||||
check := func(context.Context, string) (monitor.CertInfo, error) {
|
||||
calls++
|
||||
return monitor.CertInfo{Expires: time.Now().Add(tc.expires).UnixMilli()}, nil
|
||||
}
|
||||
task.refreshCert(check)
|
||||
time.Sleep(tc.interval - time.Second)
|
||||
task.refreshCert(check)
|
||||
assert.Equal(t, 1, calls)
|
||||
time.Sleep(time.Second)
|
||||
task.refreshCert(check)
|
||||
assert.Equal(t, 2, calls)
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestCertCheckEnabled(t *testing.T) {
|
||||
tests := []struct {
|
||||
protocol, target string
|
||||
want bool
|
||||
}{
|
||||
{"http", "https://example.com", true},
|
||||
{"http", "HTTPS://example.com:8443/path", true},
|
||||
{"http", "http://example.com", false},
|
||||
{"http", "https://", false},
|
||||
{"tcp", "https://example.com", false},
|
||||
{"icmp", "example.com", false},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
assert.Equal(t, tt.want, certCheckEnabled(monitor.Config{Protocol: tt.protocol, Target: tt.target}), tt.protocol+" "+tt.target)
|
||||
}
|
||||
}
|
||||
|
||||
func TestRefreshCertSkipsNonHTTPS(t *testing.T) {
|
||||
task := newMonitorTask(monitor.Config{ID: "test", Target: "http://example.test", Protocol: "http"})
|
||||
defer task.cancel()
|
||||
task.refreshCert(func(context.Context, string) (monitor.CertInfo, error) {
|
||||
t.Fatal("certificate check must not run for non-https targets")
|
||||
return monitor.CertInfo{}, nil
|
||||
})
|
||||
assert.Nil(t, task.certInfo())
|
||||
}
|
||||
|
||||
func TestUpsertMonitorRunNowIncludesCert(t *testing.T) {
|
||||
server := httptest.NewTLSServer(http.HandlerFunc(func(http.ResponseWriter, *http.Request) {}))
|
||||
defer server.Close()
|
||||
|
||||
pm := newMonitorManagerWithProbe(func(context.Context, monitor.Config) (int64, error) { return 100, nil })
|
||||
defer pm.Stop()
|
||||
config := monitor.Config{ID: "cert", Target: server.URL, Protocol: "http", Interval: 60}
|
||||
result, err := pm.UpsertMonitor(config, true)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, result)
|
||||
require.NotNil(t, result.Cert)
|
||||
assert.Equal(t, server.Certificate().NotAfter.UnixMilli(), result.Cert.Expires)
|
||||
|
||||
// Realtime results never carry the certificate, and the default interval
|
||||
// sends it only once per check.
|
||||
assert.Nil(t, pm.GetResults(1000)["cert"].Cert)
|
||||
results := pm.GetResults(defaultDataCacheTimeMs)
|
||||
require.NotNil(t, results["cert"].Cert)
|
||||
assert.Equal(t, result.Cert.Expires, results["cert"].Cert.Expires)
|
||||
assert.Nil(t, pm.GetResults(defaultDataCacheTimeMs)["cert"].Cert)
|
||||
|
||||
// Changing the interval keeps the known certificate without resending it.
|
||||
config.Interval = 30
|
||||
_, err = pm.UpsertMonitor(config, false)
|
||||
require.NoError(t, err)
|
||||
pm.mu.RLock()
|
||||
task := pm.monitors["cert"]
|
||||
pm.mu.RUnlock()
|
||||
assert.NotNil(t, task.certInfo())
|
||||
assert.Nil(t, pm.GetResults(defaultDataCacheTimeMs)["cert"].Cert)
|
||||
}
|
||||
@@ -8,9 +8,12 @@ import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/henrygd/beszel"
|
||||
"github.com/henrygd/beszel/internal/entities/monitor"
|
||||
)
|
||||
|
||||
const networkMonitorUserAgent = "Beszel-Agent/" + beszel.Version + " (+https://beszel.dev)"
|
||||
|
||||
// monitorProbe performs one check. Errors are recorded as loss by the task runner.
|
||||
// Implementations must honor cancellation and bound their execution time.
|
||||
type monitorProbe func(context.Context, monitor.Config) (int64, error)
|
||||
@@ -93,6 +96,7 @@ func monitorHTTP(ctx context.Context, client *http.Client, url string) (int64, e
|
||||
if err != nil {
|
||||
return -1, err
|
||||
}
|
||||
req.Header.Set("User-Agent", networkMonitorUserAgent)
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
return -1, err
|
||||
|
||||
@@ -14,9 +14,12 @@ func (pm *MonitorManager) startMonitor(task *monitorTask) {
|
||||
}
|
||||
delay := getStagger(interval.Milliseconds())
|
||||
slog.Debug("starting monitor task", "target", task.config.Target, "delay", delay, "interval", interval)
|
||||
// Certificate checks piggyback on probe ticks, so they run at most once per
|
||||
// probe interval after they become due.
|
||||
go runMonitorSchedule(task.ctx, interval, delay, func() {
|
||||
if _, allowed := task.resumeGuard.snapshot(); allowed {
|
||||
task.runProbe(pm.probe)
|
||||
task.refreshCert(pm.certCheck)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@@ -21,6 +21,12 @@ type monitorTask struct {
|
||||
runMu sync.Mutex
|
||||
inflight *monitorRun
|
||||
lastFailureLog int64 // Unix nanoseconds
|
||||
|
||||
certMu sync.Mutex
|
||||
cert *monitor.CertInfo
|
||||
certUnsent bool // cert has not been included in a stats result yet
|
||||
certChecking bool
|
||||
nextCertCheck time.Time
|
||||
}
|
||||
|
||||
type monitorRun struct {
|
||||
@@ -45,6 +51,11 @@ func newMonitorTaskFromExisting(config monitor.Config, existing *monitorTask) *m
|
||||
task := newMonitorTask(config)
|
||||
if existing != nil {
|
||||
task.history = existing.history.clone()
|
||||
// Keep the last known certificate, but check again soon for the new config.
|
||||
// The hub already stores it, so it is not marked unsent.
|
||||
if config.Target == existing.config.Target {
|
||||
task.cert = existing.certInfo()
|
||||
}
|
||||
}
|
||||
return task
|
||||
}
|
||||
@@ -107,6 +118,70 @@ func (task *monitorTask) runProbe(probe monitorProbe) *monitor.Result {
|
||||
return copyMonitorResult(run.result)
|
||||
}
|
||||
|
||||
// refreshCert checks the certificate of an HTTPS target when due. A failed
|
||||
// check keeps the last known certificate and retries sooner, as does a
|
||||
// certificate that expires before the next regular check, so renewals show up
|
||||
// quickly. Concurrent callers skip rather than wait, and no lock is held during
|
||||
// network I/O.
|
||||
func (task *monitorTask) refreshCert(check certChecker) {
|
||||
if check == nil || !certCheckEnabled(task.config) {
|
||||
return
|
||||
}
|
||||
task.certMu.Lock()
|
||||
if task.certChecking || time.Now().Before(task.nextCertCheck) {
|
||||
task.certMu.Unlock()
|
||||
return
|
||||
}
|
||||
task.certChecking = true
|
||||
task.certMu.Unlock()
|
||||
|
||||
info, err := check(task.ctx, task.config.Target)
|
||||
|
||||
task.certMu.Lock()
|
||||
defer task.certMu.Unlock()
|
||||
task.certChecking = false
|
||||
if task.ctx.Err() != nil {
|
||||
return
|
||||
}
|
||||
if err != nil {
|
||||
task.nextCertCheck = time.Now().Add(certCheckRetryInterval)
|
||||
slog.Warn("certificate check failed", "err", err, "target", task.config.Target)
|
||||
return
|
||||
}
|
||||
task.cert = &info
|
||||
task.certUnsent = true
|
||||
now := time.Now()
|
||||
interval := certCheckInterval
|
||||
if time.UnixMilli(info.Expires).Before(now.Add(certCheckInterval)) {
|
||||
interval = certCheckRetryInterval
|
||||
}
|
||||
task.nextCertCheck = now.Add(interval)
|
||||
}
|
||||
|
||||
// certInfo returns a copy of the latest certificate info, or nil if unknown.
|
||||
func (task *monitorTask) certInfo() *monitor.CertInfo {
|
||||
task.certMu.Lock()
|
||||
defer task.certMu.Unlock()
|
||||
if task.cert == nil {
|
||||
return nil
|
||||
}
|
||||
cert := *task.cert
|
||||
return &cert
|
||||
}
|
||||
|
||||
// takeUnsentCert returns the latest certificate info once after each successful
|
||||
// check, so unchanged info is not resent with every stats result.
|
||||
func (task *monitorTask) takeUnsentCert() *monitor.CertInfo {
|
||||
task.certMu.Lock()
|
||||
defer task.certMu.Unlock()
|
||||
if !task.certUnsent {
|
||||
return nil
|
||||
}
|
||||
task.certUnsent = false
|
||||
cert := *task.cert
|
||||
return &cert
|
||||
}
|
||||
|
||||
func copyMonitorResult(result *monitor.Result) *monitor.Result {
|
||||
if result == nil {
|
||||
return nil
|
||||
|
||||
@@ -10,6 +10,7 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/henrygd/beszel"
|
||||
"github.com/henrygd/beszel/internal/entities/monitor"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
@@ -240,6 +241,7 @@ func TestMonitorManagerGetRandomDelay(t *testing.T) {
|
||||
func TestMonitorHTTP(t *testing.T) {
|
||||
t.Run("success", func(t *testing.T) {
|
||||
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
assert.Equal(t, "Beszel-Agent/"+beszel.Version+" (+https://beszel.dev)", r.Header.Get("User-Agent"))
|
||||
w.WriteHeader(http.StatusNoContent)
|
||||
}))
|
||||
defer server.Close()
|
||||
|
||||
@@ -54,12 +54,18 @@ type poolBackend struct {
|
||||
kernelStatsFn func() ([]zfs.PoolKernelStat, error) // procfs pool state/I/O source
|
||||
poolStatusesFn func() ([]zfs.PoolStatus, error) // scrub/vdev detail source
|
||||
|
||||
poolData []zfs.PoolStat // cached pool inventory (TTL below)
|
||||
lastPoolStats time.Time
|
||||
kernelSamples map[string]poolKernelSample
|
||||
// Utility-backed caches below are refreshed in the background after the
|
||||
// first collection, so cacheMu guards them against those goroutines.
|
||||
cacheMu sync.Mutex
|
||||
poolData []zfs.PoolStat // cached pool inventory (TTL below)
|
||||
lastPoolStats time.Time
|
||||
poolRefreshing bool
|
||||
|
||||
datasetUsage map[string]zfsDatasetUsage // mountpoint -> usage
|
||||
lastUsageRefresh time.Time
|
||||
usageRefreshing bool
|
||||
|
||||
kernelSamples map[string]poolKernelSample
|
||||
|
||||
// Detail data (pools, vdevs, scrub, datasets) is cached and refreshed on
|
||||
// an interval. Accessed from handler goroutines, so it is mutex-protected.
|
||||
@@ -177,21 +183,42 @@ func (b *poolBackend) updateBackendStats(systemStats *system.Stats) {
|
||||
}
|
||||
|
||||
// poolStats returns the cached pool inventory, calling its collector at most
|
||||
// every poolStatsRefreshInterval. On failure the previous inventory is
|
||||
// retained and the refresh is retried on the next cadence.
|
||||
// every poolStatsRefreshInterval. Only the first collection blocks; later
|
||||
// refreshes run in the background because utilities like `zpool list` can hang
|
||||
// for seconds on busy hosts, which would otherwise delay the hub's stats
|
||||
// response. On failure the previous inventory is retained and the refresh is
|
||||
// retried on the next cadence.
|
||||
func (b *poolBackend) poolStats() []zfs.PoolStat {
|
||||
if b.lastPoolStats.IsZero() || time.Since(b.lastPoolStats) >= poolStatsRefreshInterval {
|
||||
pools, err := b.poolStatsFn()
|
||||
if err != nil {
|
||||
slog.Debug("Storage pool stats unavailable", "backend", b.name, "err", err)
|
||||
} else {
|
||||
b.poolData = pools
|
||||
}
|
||||
b.lastPoolStats = time.Now()
|
||||
b.cacheMu.Lock()
|
||||
defer b.cacheMu.Unlock()
|
||||
if b.poolRefreshing || (!b.lastPoolStats.IsZero() && time.Since(b.lastPoolStats) < poolStatsRefreshInterval) {
|
||||
return b.poolData
|
||||
}
|
||||
if b.lastPoolStats.IsZero() {
|
||||
b.storePoolStats(b.poolStatsFn())
|
||||
return b.poolData
|
||||
}
|
||||
b.poolRefreshing = true
|
||||
go func() {
|
||||
pools, err := b.poolStatsFn()
|
||||
b.cacheMu.Lock()
|
||||
defer b.cacheMu.Unlock()
|
||||
b.poolRefreshing = false
|
||||
b.storePoolStats(pools, err)
|
||||
}()
|
||||
return b.poolData
|
||||
}
|
||||
|
||||
// storePoolStats records a pool inventory result. Callers must hold cacheMu.
|
||||
func (b *poolBackend) storePoolStats(pools []zfs.PoolStat, err error) {
|
||||
if err != nil {
|
||||
slog.Debug("Storage pool stats unavailable", "backend", b.name, "err", err)
|
||||
} else {
|
||||
b.poolData = pools
|
||||
}
|
||||
b.lastPoolStats = time.Now()
|
||||
}
|
||||
|
||||
// kernelStats reads cumulative pool counters and converts them to per-second
|
||||
// rates. Counter decreases indicate a pool export/import and reset the
|
||||
// baseline instead of producing an underflow spike.
|
||||
@@ -225,12 +252,33 @@ func (b *poolBackend) kernelStats() (map[string]zfs.PoolKernelStat, map[string]z
|
||||
}
|
||||
|
||||
// refreshDatasetUsage re-runs `zfs list` when the refresh window has elapsed
|
||||
// and rebuilds the mountpoint-keyed usage map.
|
||||
func (b *poolBackend) refreshDatasetUsage() {
|
||||
if !b.lastUsageRefresh.IsZero() && time.Since(b.lastUsageRefresh) < datasetUsageRefreshInterval {
|
||||
return
|
||||
// and returns the mountpoint-keyed usage map. Like poolStats, only the first
|
||||
// collection blocks and later refreshes run in the background.
|
||||
func (b *poolBackend) refreshDatasetUsage() map[string]zfsDatasetUsage {
|
||||
b.cacheMu.Lock()
|
||||
defer b.cacheMu.Unlock()
|
||||
if b.usageRefreshing || (!b.lastUsageRefresh.IsZero() && time.Since(b.lastUsageRefresh) < datasetUsageRefreshInterval) {
|
||||
return b.datasetUsage
|
||||
}
|
||||
datasets, err := b.datasets()
|
||||
if b.lastUsageRefresh.IsZero() {
|
||||
b.storeDatasetUsage(b.datasets())
|
||||
return b.datasetUsage
|
||||
}
|
||||
b.usageRefreshing = true
|
||||
go func() {
|
||||
datasets, err := b.datasets()
|
||||
b.cacheMu.Lock()
|
||||
defer b.cacheMu.Unlock()
|
||||
b.usageRefreshing = false
|
||||
b.storeDatasetUsage(datasets, err)
|
||||
}()
|
||||
return b.datasetUsage
|
||||
}
|
||||
|
||||
// storeDatasetUsage rebuilds the usage map from a dataset listing. The map is
|
||||
// replaced rather than mutated so returned references stay safe to read.
|
||||
// Callers must hold cacheMu.
|
||||
func (b *poolBackend) storeDatasetUsage(datasets []zfs.Dataset, err error) {
|
||||
if err != nil {
|
||||
slog.Debug("Storage pool dataset usage unavailable", "backend", b.name, "err", err)
|
||||
} else {
|
||||
@@ -251,8 +299,7 @@ func (b *poolBackend) refreshDatasetUsage() {
|
||||
func (m *StoragePoolManager) DatasetUsage() map[string]zfsDatasetUsage {
|
||||
for _, backend := range m.backends {
|
||||
if backend.name == "zfs" {
|
||||
backend.refreshDatasetUsage()
|
||||
return backend.datasetUsage
|
||||
return backend.refreshDatasetUsage()
|
||||
}
|
||||
}
|
||||
return nil
|
||||
@@ -442,7 +489,10 @@ func (m *StoragePoolManager) markDuplicateCharts(stats *system.Stats, filesystem
|
||||
}
|
||||
}
|
||||
for _, backend := range m.backends {
|
||||
for _, pool := range backend.poolData {
|
||||
backend.cacheMu.Lock()
|
||||
pools := backend.poolData
|
||||
backend.cacheMu.Unlock()
|
||||
for _, pool := range pools {
|
||||
sample := stats.ZfsPools[pool.Name]
|
||||
if sample == nil || pool.MountID == "" {
|
||||
continue
|
||||
|
||||
@@ -518,3 +518,31 @@ func TestBtrfsPoolIdentities(t *testing.T) {
|
||||
assert.Equal(t, first, zm.GetDetail(true).Pools[1].Name)
|
||||
assert.Equal(t, "renamed", zm.GetDetail(true).Pools[1].DisplayName)
|
||||
}
|
||||
|
||||
func TestStaleUtilityCachesRefreshInBackground(t *testing.T) {
|
||||
release := make(chan struct{})
|
||||
b := &poolBackend{name: "zfs"}
|
||||
b.poolStatsFn = func() ([]zfs.PoolStat, error) {
|
||||
<-release
|
||||
return []zfs.PoolStat{{Name: "new"}}, nil
|
||||
}
|
||||
b.datasetsFn = func() ([]zfs.Dataset, error) {
|
||||
<-release
|
||||
return []zfs.Dataset{{Name: "new", Mountpoint: "/new"}}, nil
|
||||
}
|
||||
b.poolData = []zfs.PoolStat{{Name: "old"}}
|
||||
b.lastPoolStats = time.Now().Add(-2 * poolStatsRefreshInterval)
|
||||
b.datasetUsage = map[string]zfsDatasetUsage{"/old": {}}
|
||||
b.lastUsageRefresh = time.Now().Add(-2 * datasetUsageRefreshInterval)
|
||||
|
||||
// A hung utility must not block collection; cached data is served meanwhile.
|
||||
for range 2 {
|
||||
assert.Equal(t, "old", b.poolStats()[0].Name)
|
||||
assert.Contains(t, b.refreshDatasetUsage(), "/old")
|
||||
}
|
||||
|
||||
close(release)
|
||||
require.Eventually(t, func() bool {
|
||||
return b.poolStats()[0].Name == "new" && b.refreshDatasetUsage()["/new"] == zfsDatasetUsage{}
|
||||
}, time.Second, time.Millisecond)
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ import (
|
||||
"strings"
|
||||
"sync/atomic"
|
||||
"testing"
|
||||
"testing/synctest"
|
||||
|
||||
beszelTests "github.com/henrygd/beszel/internal/tests"
|
||||
pbTests "github.com/pocketbase/pocketbase/tests"
|
||||
@@ -533,6 +534,20 @@ func TestSendTestNotification(t *testing.T) {
|
||||
|
||||
for _, url := range []string{localURL, "smtp://user:pass@127.0.0.1/?fromAddress=sender@example.com&toAddresses=recipient@example.com", "mqtt://127.0.0.1/topic"} {
|
||||
scenarios = append(scenarios, beszelTests.ApiScenario{
|
||||
BeforeTestFunc: func(tb testing.TB, _ *pbTests.TestApp, e *core.ServeEvent) {
|
||||
if !strings.HasPrefix(url, "mqtt://") {
|
||||
return
|
||||
}
|
||||
// Keep the real MQTT rejection path, but advance its library's
|
||||
// fixed timeout using virtual time instead of waiting 10 seconds.
|
||||
e.Router.BindFunc(func(re *core.RequestEvent) error {
|
||||
var err error
|
||||
synctest.Test(tb.(*testing.T), func(t *testing.T) {
|
||||
err = re.Next()
|
||||
})
|
||||
return err
|
||||
})
|
||||
},
|
||||
Name: "readonly cannot send to " + url,
|
||||
Method: http.MethodPost,
|
||||
URL: "/api/beszel/test-notification",
|
||||
|
||||
@@ -11,6 +11,7 @@ import (
|
||||
"strings"
|
||||
"sync/atomic"
|
||||
"testing"
|
||||
"testing/synctest"
|
||||
|
||||
"github.com/nicholas-fedor/shoutrrr/pkg/types"
|
||||
"golang.org/x/net/dns/dnsmessage"
|
||||
@@ -178,39 +179,45 @@ func TestPublicNotificationTCP(t *testing.T) {
|
||||
} {
|
||||
t.Run(rawURL, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
// MQTT waits for a fixed library timeout even after a dial failure.
|
||||
// Virtual time preserves the full send/cleanup path without that delay.
|
||||
t.Run("internal destination", func(t *testing.T) {
|
||||
err := sendPublicNotification(strings.ReplaceAll(rawURL, "HOST", "127.0.0.1"), "test")
|
||||
if !errors.Is(err, errInternalDestination) {
|
||||
t.Fatalf("expected blocked destination, got %v", err)
|
||||
}
|
||||
synctest.Test(t, func(t *testing.T) {
|
||||
err := sendPublicNotification(strings.ReplaceAll(rawURL, "HOST", "127.0.0.1"), "test")
|
||||
if !errors.Is(err, errInternalDestination) {
|
||||
t.Fatalf("expected blocked destination, got %v", err)
|
||||
}
|
||||
})
|
||||
})
|
||||
t.Run("public destination uses injected dialer", func(t *testing.T) {
|
||||
var calls atomic.Int32
|
||||
stopped := errors.New("test dial stopped")
|
||||
service, err := newPublicNotificationService(strings.ReplaceAll(rawURL, "HOST", "8.8.8.8"), types.SenderOptions{
|
||||
DialContext: func(ctx context.Context, network, address string) (net.Conn, error) {
|
||||
calls.Add(1)
|
||||
if network != "tcp" || !strings.HasPrefix(address, "8.8.8.8:") {
|
||||
t.Errorf("unexpected dial: %s %s", network, address)
|
||||
}
|
||||
if err := checkNotificationAddress(address); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
return nil, stopped
|
||||
},
|
||||
synctest.Test(t, func(t *testing.T) {
|
||||
var calls atomic.Int32
|
||||
stopped := errors.New("test dial stopped")
|
||||
service, err := newPublicNotificationService(strings.ReplaceAll(rawURL, "HOST", "8.8.8.8"), types.SenderOptions{
|
||||
DialContext: func(ctx context.Context, network, address string) (net.Conn, error) {
|
||||
calls.Add(1)
|
||||
if network != "tcp" || !strings.HasPrefix(address, "8.8.8.8:") {
|
||||
t.Errorf("unexpected dial: %s %s", network, address)
|
||||
}
|
||||
if err := checkNotificationAddress(address); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
return nil, stopped
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if closer, ok := service.(io.Closer); ok {
|
||||
defer closer.Close()
|
||||
}
|
||||
if err := service.Send("test", &types.Params{}); err == nil {
|
||||
t.Fatal("expected dial failure")
|
||||
}
|
||||
if calls.Load() == 0 {
|
||||
t.Fatal("custom dialer was not used")
|
||||
}
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if closer, ok := service.(io.Closer); ok {
|
||||
defer closer.Close()
|
||||
}
|
||||
if err := service.Send("test", &types.Params{}); err == nil {
|
||||
t.Fatal("expected dial failure")
|
||||
}
|
||||
if calls.Load() == 0 {
|
||||
t.Fatal("custom dialer was not used")
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"runtime"
|
||||
"strings"
|
||||
|
||||
"github.com/henrygd/beszel"
|
||||
@@ -14,6 +16,12 @@ import (
|
||||
"golang.org/x/crypto/ssh"
|
||||
)
|
||||
|
||||
type noKeyProvidedError struct{}
|
||||
|
||||
func (noKeyProvidedError) Error() string {
|
||||
return "no key provided: must set -key flag, KEY env var, or KEY_FILE env var. Use 'beszel-agent help' for usage"
|
||||
}
|
||||
|
||||
// cli options
|
||||
type cmdOptions struct {
|
||||
key string // key is the public key(s) for SSH authentication.
|
||||
@@ -124,7 +132,7 @@ func (opts *cmdOptions) loadPublicKeys() ([]ssh.PublicKey, error) {
|
||||
// Try key file
|
||||
keyFile, ok := utils.GetEnv("KEY_FILE")
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("no key provided: must set -key flag, KEY env var, or KEY_FILE env var. Use 'beszel-agent help' for usage")
|
||||
return nil, noKeyProvidedError{}
|
||||
}
|
||||
|
||||
pubKey, err := os.ReadFile(keyFile)
|
||||
@@ -138,6 +146,14 @@ func (opts *cmdOptions) getAddress() string {
|
||||
return agent.GetAddress(opts.listen)
|
||||
}
|
||||
|
||||
func isBenignStartupError(err error, goos string) bool {
|
||||
if goos != "windows" {
|
||||
return false
|
||||
}
|
||||
var noKeyErr noKeyProvidedError
|
||||
return errors.As(err, &noKeyErr)
|
||||
}
|
||||
|
||||
// handleFingerprint handles the "fingerprint" command with subcommands "view" and "reset".
|
||||
func handleFingerprint() {
|
||||
subCmd := ""
|
||||
@@ -182,6 +198,12 @@ func main() {
|
||||
var err error
|
||||
serverConfig.Keys, err = opts.loadPublicKeys()
|
||||
if err != nil {
|
||||
if isBenignStartupError(err, runtime.GOOS) {
|
||||
// WinGet launches the executable without configuration during validation.
|
||||
// Exit successfully in that case while retaining the error on other platforms.
|
||||
log.Print("Failed to load public keys:", err)
|
||||
return
|
||||
}
|
||||
log.Fatal("Failed to load public keys:", err)
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ package main
|
||||
|
||||
import (
|
||||
"crypto/ed25519"
|
||||
"errors"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
@@ -187,6 +188,26 @@ func TestLoadPublicKeys(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestIsBenignStartupError(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
err error
|
||||
goos string
|
||||
want bool
|
||||
}{
|
||||
{name: "missing key on windows", err: noKeyProvidedError{}, goos: "windows", want: true},
|
||||
{name: "wrapped missing key on windows", err: errors.Join(errors.New("startup failed"), noKeyProvidedError{}), goos: "windows", want: true},
|
||||
{name: "missing key on linux", err: noKeyProvidedError{}, goos: "linux", want: false},
|
||||
{name: "different error on windows", err: errors.New("invalid key"), goos: "windows", want: false},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
assert.Equal(t, tt.want, isBenignStartupError(tt.err, tt.goos))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetNetwork(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
|
||||
@@ -12,7 +12,7 @@ RUN apk add --no-cache ca-certificates && update-ca-certificates
|
||||
|
||||
# Build
|
||||
ARG TARGETOS TARGETARCH
|
||||
RUN CGO_ENABLED=0 GOGC=75 GOOS=$TARGETOS GOARCH=$TARGETARCH go build -ldflags "-w -s" -o /agent ./internal/cmd/agent
|
||||
RUN CGO_ENABLED=0 GOOS=$TARGETOS GOARCH=$TARGETARCH go build -ldflags "-w -s" -o /agent ./internal/cmd/agent
|
||||
|
||||
RUN rm -rf /tmp/*
|
||||
|
||||
|
||||
@@ -10,14 +10,14 @@ COPY . ./
|
||||
|
||||
# Build
|
||||
ARG TARGETOS TARGETARCH
|
||||
RUN CGO_ENABLED=0 GOGC=75 GOOS=$TARGETOS GOARCH=$TARGETARCH go build -ldflags "-w -s" -o /agent ./internal/cmd/agent
|
||||
RUN CGO_ENABLED=0 GOOS=$TARGETOS GOARCH=$TARGETARCH go build -ldflags "-w -s" -o /agent ./internal/cmd/agent
|
||||
|
||||
RUN rm -rf /tmp/*
|
||||
|
||||
# --------------------------
|
||||
# Final image: default scratch-based agent
|
||||
# --------------------------
|
||||
FROM alpine:3.23
|
||||
FROM alpine:3.24
|
||||
COPY --from=builder /agent /agent
|
||||
|
||||
# AMD GPU name lookup (used by agent on Linux when /usr/share/libdrm/amdgpu.ids is read)
|
||||
@@ -28,4 +28,4 @@ RUN apk add --no-cache smartmontools zfs
|
||||
# Ensure data persistence across container recreations
|
||||
VOLUME ["/var/lib/beszel-agent"]
|
||||
|
||||
ENTRYPOINT ["/agent"]
|
||||
ENTRYPOINT ["/agent"]
|
||||
|
||||
@@ -10,13 +10,13 @@ COPY . ./
|
||||
|
||||
# Build
|
||||
ARG TARGETOS TARGETARCH
|
||||
RUN CGO_ENABLED=0 GOGC=75 GOOS=$TARGETOS GOARCH=$TARGETARCH go build -ldflags "-w -s" -o /agent ./internal/cmd/agent
|
||||
RUN CGO_ENABLED=0 GOOS=$TARGETOS GOARCH=$TARGETARCH go build -ldflags "-w -s" -o /agent ./internal/cmd/agent
|
||||
|
||||
# --------------------------
|
||||
# Final image
|
||||
# Note: must cap_add: [CAP_PERFMON] and mount /dev/dri/ as volume
|
||||
# --------------------------
|
||||
FROM alpine:3.23
|
||||
FROM alpine:3.24
|
||||
|
||||
COPY --from=builder /agent /agent
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ COPY . ./
|
||||
|
||||
# Build
|
||||
ARG TARGETOS TARGETARCH
|
||||
RUN CGO_ENABLED=0 GOGC=75 GOOS=$TARGETOS GOARCH=$TARGETARCH go build -tags glibc -ldflags "-w -s" -o /agent ./internal/cmd/agent
|
||||
RUN CGO_ENABLED=0 GOOS=$TARGETOS GOARCH=$TARGETARCH go build -tags glibc -ldflags "-w -s" -o /agent ./internal/cmd/agent
|
||||
|
||||
# --------------------------
|
||||
# Smartmontools builder stage
|
||||
|
||||
@@ -17,7 +17,7 @@ RUN set -eux; \
|
||||
if [ "$TARGETARCH" = "arm" ] && [ -n "$TARGETVARIANT" ]; then \
|
||||
export GOARM="${TARGETVARIANT#v}"; \
|
||||
fi; \
|
||||
CGO_ENABLED=0 GOGC=75 GOOS=$TARGETOS GOARCH=$TARGETARCH \
|
||||
CGO_ENABLED=0 GOOS=$TARGETOS GOARCH=$TARGETARCH \
|
||||
go build -tags glibc -ldflags "-w -s" -o /agent ./internal/cmd/agent
|
||||
|
||||
# --------------------------
|
||||
@@ -70,7 +70,9 @@ RUN set -eux; \
|
||||
# --------------------------
|
||||
FROM --platform=$TARGETPLATFORM debian:bookworm-slim AS zfsutils-builder
|
||||
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
# zfsutils-linux is distributed in Debian's contrib component.
|
||||
RUN sed -i 's/Components: main/Components: main contrib/' /etc/apt/sources.list.d/debian.sources \
|
||||
&& apt-get update && apt-get install -y --no-install-recommends \
|
||||
zfsutils-linux \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ RUN update-ca-certificates
|
||||
|
||||
# Build
|
||||
ARG TARGETOS TARGETARCH
|
||||
RUN CGO_ENABLED=0 GOGC=75 GOOS=$TARGETOS GOARCH=$TARGETARCH go build -ldflags "-w -s" -o /beszel ./internal/cmd/hub
|
||||
RUN CGO_ENABLED=0 GOOS=$TARGETOS GOARCH=$TARGETARCH go build -ldflags "-w -s" -o /beszel ./internal/cmd/hub
|
||||
|
||||
# ? -------------------------
|
||||
FROM scratch
|
||||
@@ -31,4 +31,4 @@ VOLUME ["/beszel_data"]
|
||||
EXPOSE 8090
|
||||
|
||||
ENTRYPOINT [ "/beszel" ]
|
||||
CMD ["serve", "--http=0.0.0.0:8090"]
|
||||
CMD ["serve", "--http=0.0.0.0:8090"]
|
||||
|
||||
@@ -27,6 +27,13 @@ type Config struct {
|
||||
Interval uint16 `cbor:"4,keyasint"` // seconds
|
||||
}
|
||||
|
||||
// CertInfo holds details of the leaf TLS certificate presented by a target.
|
||||
type CertInfo struct {
|
||||
// Expires is the certificate's NotAfter Unix timestamp in milliseconds.
|
||||
Expires int64 `cbor:"0,keyasint" json:"expires"`
|
||||
Issuer string `cbor:"1,keyasint,omitempty" json:"issuer,omitempty"`
|
||||
}
|
||||
|
||||
// SyncRequest defines an incremental or full monitor sync request sent to the agent.
|
||||
type SyncRequest struct {
|
||||
Action SyncAction `cbor:"0,keyasint"`
|
||||
@@ -76,6 +83,8 @@ type Result struct {
|
||||
TotalCount int64 `cbor:"10,keyasint"`
|
||||
SuccessCount int64 `cbor:"11,keyasint"`
|
||||
ResponseSum int64 `cbor:"12,keyasint"`
|
||||
// Cert is set for HTTPS targets when a certificate check has new info the hub has not stored yet.
|
||||
Cert *CertInfo `cbor:"13,keyasint,omitempty"`
|
||||
}
|
||||
|
||||
// Stats holds response times in microseconds and packet loss percentage (0-100).
|
||||
|
||||
@@ -978,11 +978,18 @@ func TestAgentWebSocketIntegration(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// Verify system status
|
||||
updatedSystemRecord, err := testApp.FindRecordById("systems", systemRecord.Id)
|
||||
require.NoError(t, err)
|
||||
status := updatedSystemRecord.GetString("status")
|
||||
assert.Equal(t, tc.expectSystemStatus, status, "System status should match expected value")
|
||||
// A connected WebSocket does not mean the hub has finished verifying
|
||||
// the agent and updating the system. Wait for the database state rather
|
||||
// than assuming that work completes within a fixed sleep under load.
|
||||
var status string
|
||||
require.EventuallyWithT(t, func(c *assert.CollectT) {
|
||||
updatedSystemRecord, err := testApp.FindRecordById("systems", systemRecord.Id)
|
||||
if !assert.NoError(c, err) {
|
||||
return
|
||||
}
|
||||
status = updatedSystemRecord.GetString("status")
|
||||
assert.Equal(c, tc.expectSystemStatus, status, "System status should match expected value")
|
||||
}, 5*time.Second, 20*time.Millisecond)
|
||||
|
||||
t.Logf("%s - System status: %s, Fingerprint: %s", tc.description, status, finalFingerprint)
|
||||
})
|
||||
@@ -1142,42 +1149,43 @@ func TestMultipleSystemsWithSameUniversalToken(t *testing.T) {
|
||||
|
||||
// Verify system creation/reuse behavior
|
||||
if tc.expectConnection {
|
||||
// Count systems after connection
|
||||
systemsAfter, err := testApp.FindRecordsByFilter("systems", "users ~ {:userId}", "", -1, 0, map[string]any{"userId": userRecord.Id})
|
||||
require.NoError(t, err)
|
||||
systemsAfterCount := len(systemsAfter)
|
||||
|
||||
expectedSystemsAfter := systemsBeforeCount
|
||||
if tc.expectNewSystem {
|
||||
// Should have created a new system
|
||||
expectedSystemsAfter++
|
||||
systemCount++
|
||||
assert.Equal(t, systemsBeforeCount+1, systemsAfterCount, "Should have created a new system")
|
||||
assert.Equal(t, systemCount, systemsAfterCount, "Total system count should match expected")
|
||||
} else {
|
||||
// Should have reused existing system
|
||||
assert.Equal(t, systemsBeforeCount, systemsAfterCount, "Should not have created a new system")
|
||||
assert.Equal(t, systemCount, systemsAfterCount, "Total system count should remain the same")
|
||||
}
|
||||
|
||||
time.Sleep(20 * time.Millisecond)
|
||||
// WebSocket connection precedes the hub's asynchronous system
|
||||
// setup. Re-read all database state until setup is complete.
|
||||
var systemId, status string
|
||||
require.EventuallyWithT(t, func(c *assert.CollectT) {
|
||||
systemsAfter, err := testApp.FindRecordsByFilter("systems", "users ~ {:userId}", "", -1, 0, map[string]any{"userId": userRecord.Id})
|
||||
if !assert.NoError(c, err) {
|
||||
return
|
||||
}
|
||||
assert.Len(c, systemsAfter, expectedSystemsAfter, "System creation/reuse should match expected behavior")
|
||||
assert.Len(c, systemsAfter, systemCount, "Total system count should match expected")
|
||||
|
||||
// Verify that a fingerprint record exists for this fingerprint
|
||||
fingerprints, err := testApp.FindRecordsByFilter("fingerprints", "token = {:token} && fingerprint = {:fingerprint}", "", -1, 0, map[string]any{
|
||||
"token": universalToken,
|
||||
"fingerprint": tc.agentFingerprint,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
require.Len(t, fingerprints, 1, "Should have exactly one fingerprint record for this token+fingerprint combination")
|
||||
fingerprints, err := testApp.FindRecordsByFilter("fingerprints", "token = {:token} && fingerprint = {:fingerprint}", "", -1, 0, map[string]any{
|
||||
"token": universalToken,
|
||||
"fingerprint": tc.agentFingerprint,
|
||||
})
|
||||
if !assert.NoError(c, err) || !assert.Len(c, fingerprints, 1, "Should have exactly one fingerprint record for this token+fingerprint combination") {
|
||||
return
|
||||
}
|
||||
|
||||
fingerprint := fingerprints[0]
|
||||
assert.Equal(t, universalToken, fingerprint.GetString("token"), "Fingerprint should have the universal token")
|
||||
assert.Equal(t, tc.agentFingerprint, fingerprint.GetString("fingerprint"), "Fingerprint should match agent's fingerprint")
|
||||
fingerprint := fingerprints[0]
|
||||
assert.Equal(c, universalToken, fingerprint.GetString("token"), "Fingerprint should have the universal token")
|
||||
assert.Equal(c, tc.agentFingerprint, fingerprint.GetString("fingerprint"), "Fingerprint should match agent's fingerprint")
|
||||
|
||||
// Verify system status
|
||||
systemId := fingerprint.GetString("system")
|
||||
system, err := testApp.FindRecordById("systems", systemId)
|
||||
require.NoError(t, err)
|
||||
status := system.GetString("status")
|
||||
assert.Equal(t, tc.expectSystemStatus, status, "System status should match expected value")
|
||||
systemId = fingerprint.GetString("system")
|
||||
system, err := testApp.FindRecordById("systems", systemId)
|
||||
if !assert.NoError(c, err) {
|
||||
return
|
||||
}
|
||||
status = system.GetString("status")
|
||||
assert.Equal(c, tc.expectSystemStatus, status, "System status should match expected value")
|
||||
}, 5*time.Second, 20*time.Millisecond)
|
||||
|
||||
t.Logf("%s - System ID: %s, Status: %s, New System: %v", tc.description, systemId, status, tc.expectNewSystem)
|
||||
}
|
||||
|
||||
@@ -114,6 +114,9 @@ func setMonitorResultFields(record *core.Record, result monitor.Result) {
|
||||
record.Set("resMin1h", result.MinResponse1h)
|
||||
record.Set("resMax1h", result.MaxResponse1h)
|
||||
record.Set("loss1h", result.PacketLoss1h)
|
||||
if result.Cert != nil {
|
||||
record.Set("certInfo", result.Cert)
|
||||
}
|
||||
record.Set("updated", nowString)
|
||||
}
|
||||
|
||||
|
||||
@@ -206,6 +206,7 @@ func TestCopyMonitorToNewRecordDropsResultFields(t *testing.T) {
|
||||
"resMin1h": 900,
|
||||
"resMax1h": 1600,
|
||||
"loss1h": 5,
|
||||
"certInfo": map[string]any{"expires": 1800000000000},
|
||||
"updated": "2026-04-29 12:00:00.000Z",
|
||||
})
|
||||
|
||||
@@ -216,6 +217,7 @@ func TestCopyMonitorToNewRecordDropsResultFields(t *testing.T) {
|
||||
assert.Equal(t, "http", newRecord.GetString("protocol"))
|
||||
assert.Equal(t, 443, newRecord.GetInt("port"))
|
||||
assert.True(t, newRecord.GetBool("enabled"))
|
||||
assert.Contains(t, []string{"", "null"}, newRecord.GetString("certInfo"))
|
||||
assert.Zero(t, newRecord.GetFloat("res"))
|
||||
assert.Zero(t, newRecord.GetFloat("resAvg1h"))
|
||||
assert.Zero(t, newRecord.GetFloat("resMin1h"))
|
||||
|
||||
159
internal/hub/systems/network_monitor_ssh_test.go
Normal file
159
internal/hub/systems/network_monitor_ssh_test.go
Normal file
@@ -0,0 +1,159 @@
|
||||
//go:build testing
|
||||
|
||||
package systems
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/ed25519"
|
||||
"crypto/rand"
|
||||
"net"
|
||||
"sync/atomic"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/fxamacker/cbor/v2"
|
||||
"github.com/henrygd/beszel/internal/common"
|
||||
"github.com/henrygd/beszel/internal/entities/monitor"
|
||||
esystem "github.com/henrygd/beszel/internal/entities/system"
|
||||
"github.com/henrygd/beszel/internal/hub/expirymap"
|
||||
"github.com/pocketbase/pocketbase/core"
|
||||
"github.com/stretchr/testify/require"
|
||||
"golang.org/x/crypto/ssh"
|
||||
)
|
||||
|
||||
func TestSSHNetworkMonitorReconnectSync(t *testing.T) {
|
||||
sys, app := newTestSystemWithHub(t)
|
||||
sys.manager.zfsFetchMap = expirymap.New[zfsFetchState](time.Hour)
|
||||
t.Cleanup(sys.manager.zfsFetchMap.StopCleaner)
|
||||
sys.ctx = context.Background()
|
||||
sys.Status = up
|
||||
_, key, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
signer, err := ssh.NewSignerFromKey(key)
|
||||
require.NoError(t, err)
|
||||
config := &ssh.ServerConfig{NoClientAuth: true, ServerVersion: "SSH-2.0-beszel_0.20.0"}
|
||||
config.AddHostKey(signer)
|
||||
listener, err := net.Listen("tcp", "127.0.0.1:0")
|
||||
require.NoError(t, err)
|
||||
t.Cleanup(func() { _ = listener.Close() })
|
||||
sys.Host, sys.Port, err = net.SplitHostPort(listener.Addr().String())
|
||||
require.NoError(t, err)
|
||||
sys.manager.sshConfig = &ssh.ClientConfig{User: "test", HostKeyCallback: ssh.InsecureIgnoreHostKey(), Timeout: time.Second}
|
||||
t.Cleanup(sys.closeSSHConnection)
|
||||
requests := make(chan monitor.SyncRequest, 10)
|
||||
var failSync atomic.Bool
|
||||
go func() {
|
||||
for {
|
||||
conn, err := listener.Accept()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
go func() {
|
||||
server, channels, reqs, err := ssh.NewServerConn(conn, config)
|
||||
if err != nil {
|
||||
_ = conn.Close()
|
||||
return
|
||||
}
|
||||
defer server.Close()
|
||||
go ssh.DiscardRequests(reqs)
|
||||
for channel := range channels {
|
||||
ch, reqs, err := channel.Accept()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
go func() {
|
||||
defer ch.Close()
|
||||
for req := range reqs {
|
||||
if req.Type != "shell" {
|
||||
_ = req.Reply(false, nil)
|
||||
continue
|
||||
}
|
||||
_ = req.Reply(true, nil)
|
||||
var request common.HubRequest[cbor.RawMessage]
|
||||
if cbor.NewDecoder(ch).Decode(&request) != nil {
|
||||
return
|
||||
}
|
||||
response := common.AgentResponse{}
|
||||
switch request.Action {
|
||||
case common.GetData:
|
||||
response.SystemData = &esystem.CombinedData{}
|
||||
case common.SyncNetworkMonitors:
|
||||
var syncReq monitor.SyncRequest
|
||||
if cbor.Unmarshal(request.Data, &syncReq) != nil {
|
||||
return
|
||||
}
|
||||
requests <- syncReq
|
||||
if failSync.Load() {
|
||||
response.Error = "test sync failure"
|
||||
} else {
|
||||
response.Data, _ = cbor.Marshal(monitor.SyncResponse{})
|
||||
}
|
||||
}
|
||||
_ = cbor.NewEncoder(ch).Encode(response)
|
||||
_, _ = ch.SendRequest("exit-status", false, ssh.Marshal(struct{ Status uint32 }{0}))
|
||||
return
|
||||
}
|
||||
}()
|
||||
}
|
||||
}()
|
||||
}
|
||||
}()
|
||||
collection, err := app.FindCachedCollectionByNameOrId("network_monitors")
|
||||
require.NoError(t, err)
|
||||
probe := core.NewRecord(collection)
|
||||
probe.Load(map[string]any{"system": sys.Id, "target": "localhost", "protocol": "tcp", "port": 80, "interval": 60, "enabled": true})
|
||||
require.NoError(t, app.SaveNoValidate(probe))
|
||||
fetch := func() {
|
||||
t.Helper()
|
||||
_, err := sys.fetchDataFromAgent(common.DataRequestOptions{})
|
||||
require.NoError(t, err, "monitor sync failure must not fail stats fetching")
|
||||
}
|
||||
receive := func() monitor.SyncRequest {
|
||||
t.Helper()
|
||||
select {
|
||||
case req := <-requests:
|
||||
require.Equal(t, monitor.SyncActionReplace, req.Action)
|
||||
return req
|
||||
case <-time.After(time.Second):
|
||||
t.Fatal("missing full monitor sync")
|
||||
return monitor.SyncRequest{}
|
||||
}
|
||||
}
|
||||
fetch()
|
||||
require.Equal(t, probe.Id, receive().Configs[0].ID)
|
||||
require.False(t, sys.monitorsNeedSync.Load())
|
||||
fetch()
|
||||
require.Empty(t, requests, "steady-state fetch must not resync")
|
||||
|
||||
// Simulate loss of the agent process/connection and its in-memory monitors.
|
||||
require.NoError(t, sys.client.Load().Close())
|
||||
fetch()
|
||||
require.Equal(t, probe.Id, receive().Configs[0].ID)
|
||||
require.False(t, sys.monitorsNeedSync.Load())
|
||||
|
||||
// Failed replacements are retried on the next successful stats fetch.
|
||||
require.NoError(t, sys.client.Load().Close())
|
||||
failSync.Store(true)
|
||||
fetch()
|
||||
receive()
|
||||
require.True(t, sys.monitorsNeedSync.Load())
|
||||
failSync.Store(false)
|
||||
fetch()
|
||||
receive()
|
||||
require.False(t, sys.monitorsNeedSync.Load())
|
||||
|
||||
probe.Set("enabled", false)
|
||||
require.NoError(t, app.SaveNoValidate(probe))
|
||||
require.NoError(t, sys.client.Load().Close())
|
||||
fetch()
|
||||
require.Empty(t, receive().Configs, "empty replacement must clear stale monitors")
|
||||
}
|
||||
|
||||
func TestPendingNetworkMonitorSyncQueryFailure(t *testing.T) {
|
||||
sys, app := newTestSystemWithHub(t)
|
||||
_, err := app.DB().NewQuery("DROP TABLE network_monitors").Execute()
|
||||
require.NoError(t, err)
|
||||
sys.monitorsNeedSync.Store(true)
|
||||
sys.syncPendingNetworkMonitors()
|
||||
require.True(t, sys.monitorsNeedSync.Load())
|
||||
}
|
||||
@@ -222,3 +222,49 @@ func TestNetworkMonitorAlertsAfterCommit(t *testing.T) {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestNetworkMonitorCertPersistence(t *testing.T) {
|
||||
for _, realtime := range []bool{false, true} {
|
||||
name := "sql"
|
||||
if realtime {
|
||||
name = "realtime"
|
||||
}
|
||||
t.Run(name, func(t *testing.T) {
|
||||
sys, app := newTestSystemWithHub(t)
|
||||
if realtime {
|
||||
client := subscriptions.NewDefaultClient()
|
||||
client.Subscribe("network_monitors/*")
|
||||
app.SubscriptionsBroker().Register(client)
|
||||
t.Cleanup(func() { app.SubscriptionsBroker().Unregister(client.Id()) })
|
||||
}
|
||||
col, err := app.FindCachedCollectionByNameOrId("network_monitors")
|
||||
require.NoError(t, err)
|
||||
record := core.NewRecord(col)
|
||||
record.Id = "monitor1"
|
||||
record.Set("system", sys.Id)
|
||||
require.NoError(t, app.SaveNoValidate(record))
|
||||
|
||||
storedCert := func() monitor.CertInfo {
|
||||
t.Helper()
|
||||
record, err := app.FindRecordById("network_monitors", "monitor1")
|
||||
require.NoError(t, err)
|
||||
var cert monitor.CertInfo
|
||||
require.NoError(t, record.UnmarshalJSONField("certInfo", &cert))
|
||||
return cert
|
||||
}
|
||||
cert := &monitor.CertInfo{Expires: 1_800_000_000_000, Issuer: "Test CA"}
|
||||
_, err = sys.createRecords(&system.CombinedData{Monitors: map[string]monitor.Result{
|
||||
"monitor1": {LastProbeAt: 1000, Cert: cert},
|
||||
}})
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, *cert, storedCert())
|
||||
|
||||
// Results without cert info keep the stored certificate.
|
||||
_, err = sys.createRecords(&system.CombinedData{Monitors: map[string]monitor.Result{
|
||||
"monitor1": {LastProbeAt: 2000},
|
||||
}})
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, *cert, storedCert())
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import (
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"strings"
|
||||
"sync/atomic"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
@@ -13,6 +14,7 @@ import (
|
||||
"github.com/fxamacker/cbor/v2"
|
||||
"github.com/henrygd/beszel/internal/common"
|
||||
"github.com/henrygd/beszel/internal/entities/monitor"
|
||||
esystem "github.com/henrygd/beszel/internal/entities/system"
|
||||
"github.com/henrygd/beszel/internal/hub/ws"
|
||||
"github.com/lxzan/gws"
|
||||
"github.com/pocketbase/pocketbase/core"
|
||||
@@ -22,17 +24,31 @@ import (
|
||||
type monitorSyncClient struct {
|
||||
gws.BuiltinEventHandler
|
||||
requests chan common.HubRequest[monitor.SyncRequest]
|
||||
failSync atomic.Bool
|
||||
}
|
||||
|
||||
func (c *monitorSyncClient) OnMessage(conn *gws.Conn, message *gws.Message) {
|
||||
defer message.Close()
|
||||
var req common.HubRequest[monitor.SyncRequest]
|
||||
var req common.HubRequest[cbor.RawMessage]
|
||||
if err := cbor.Unmarshal(message.Bytes(), &req); err != nil {
|
||||
return
|
||||
}
|
||||
c.requests <- req
|
||||
data, _ := cbor.Marshal(monitor.SyncResponse{})
|
||||
response, _ := cbor.Marshal(common.AgentResponse{Id: req.Id, Data: data})
|
||||
resp := common.AgentResponse{Id: req.Id}
|
||||
if req.Action == common.GetData {
|
||||
resp.SystemData = &esystem.CombinedData{}
|
||||
} else {
|
||||
var data monitor.SyncRequest
|
||||
if err := cbor.Unmarshal(req.Data, &data); err != nil {
|
||||
return
|
||||
}
|
||||
c.requests <- common.HubRequest[monitor.SyncRequest]{Id: req.Id, Action: req.Action, Data: data}
|
||||
if c.failSync.Load() {
|
||||
resp.Error = "test sync failure"
|
||||
} else {
|
||||
resp.Data, _ = cbor.Marshal(monitor.SyncResponse{})
|
||||
}
|
||||
}
|
||||
response, _ := cbor.Marshal(resp)
|
||||
_ = conn.WriteMessage(gws.OpcodeBinary, response)
|
||||
}
|
||||
|
||||
@@ -57,7 +73,7 @@ func TestNetworkMonitorSyncSkipsOlderAgents(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestNetworkMonitorReconnectSync(t *testing.T) {
|
||||
for _, change := range []string{"delete", "disable"} {
|
||||
for _, change := range []string{"delete", "disable", "retry"} {
|
||||
t.Run(change, func(t *testing.T) {
|
||||
sys, app := newTestSystemWithHub(t)
|
||||
record, err := app.FindRecordById("systems", sys.Id)
|
||||
@@ -120,9 +136,33 @@ func TestNetworkMonitorReconnectSync(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
client.failSync.Store(change == "retry")
|
||||
initial := connect()
|
||||
require.Len(t, initial.Configs, 1)
|
||||
require.Equal(t, probe.Id, initial.Configs[0].ID)
|
||||
if change == "retry" {
|
||||
system, err := sm.GetSystem(sys.Id)
|
||||
require.NoError(t, err)
|
||||
require.Eventually(t, system.monitorsNeedSync.Load, time.Second, time.Millisecond)
|
||||
// A second failed sync must not fail the stats fetch or clear pending state.
|
||||
_, err = system.fetchDataFromAgent(common.DataRequestOptions{})
|
||||
require.NoError(t, err)
|
||||
require.True(t, system.monitorsNeedSync.Load())
|
||||
require.Len(t, client.requests, 1)
|
||||
<-client.requests
|
||||
client.failSync.Store(false)
|
||||
_, err = system.fetchDataFromAgent(common.DataRequestOptions{})
|
||||
require.NoError(t, err)
|
||||
require.False(t, system.monitorsNeedSync.Load())
|
||||
require.Len(t, client.requests, 1)
|
||||
retry := <-client.requests
|
||||
require.Equal(t, monitor.SyncActionReplace, retry.Data.Action)
|
||||
require.Equal(t, initial.Configs, retry.Data.Configs)
|
||||
_, err = system.fetchDataFromAgent(common.DataRequestOptions{})
|
||||
require.NoError(t, err)
|
||||
require.Empty(t, client.requests, "successful sync must not repeat on every fetch")
|
||||
return
|
||||
}
|
||||
require.NoError(t, sm.RemoveSystem(sys.Id))
|
||||
if change == "delete" {
|
||||
require.NoError(t, app.Delete(probe))
|
||||
|
||||
@@ -2,6 +2,7 @@ package systems
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/henrygd/beszel"
|
||||
@@ -9,6 +10,27 @@ import (
|
||||
"github.com/henrygd/beszel/internal/entities/monitor"
|
||||
)
|
||||
|
||||
// syncPendingNetworkMonitors runs on WebSocket connect and after successful stats
|
||||
// fetches. Failed syncs retry on the next update without taking the system down.
|
||||
func (sys *System) syncPendingNetworkMonitors() {
|
||||
if !sys.monitorsNeedSync.Swap(false) {
|
||||
return
|
||||
}
|
||||
if err := sys.syncAllNetworkMonitors(); err != nil {
|
||||
sys.monitorsNeedSync.Store(true)
|
||||
sys.manager.hub.Logger().Warn("failed to sync monitors to agent", "system", sys.Id, "err", err)
|
||||
}
|
||||
}
|
||||
|
||||
func (sys *System) syncAllNetworkMonitors() error {
|
||||
configs, err := sys.manager.GetMonitorConfigsForSystem(sys.Id)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to load monitors: %w", err)
|
||||
}
|
||||
// An empty set must also replace probes retained across a disconnect.
|
||||
return sys.SyncNetworkMonitors(configs)
|
||||
}
|
||||
|
||||
// SyncNetworkMonitors sends monitor configurations to the agent.
|
||||
func (sys *System) SyncNetworkMonitors(configs []monitor.Config) error {
|
||||
_, err := sys.syncNetworkMonitors(monitor.SyncRequest{Action: monitor.SyncActionReplace, Configs: configs})
|
||||
|
||||
@@ -56,6 +56,9 @@ type System struct {
|
||||
smartInterval time.Duration // Interval for periodic SMART data updates
|
||||
zfsFetching atomic.Bool // True if ZFS pools are currently being fetched
|
||||
zfsInterval time.Duration // Interval for periodic ZFS detail data updates
|
||||
|
||||
// A fresh connection needs a full monitor configuration sync.
|
||||
monitorsNeedSync atomic.Bool
|
||||
// Serialize persistence from scheduled updates and resumes through commit.
|
||||
recordsMu sync.Mutex
|
||||
// Protected by recordsMu; realtime reads don't consume probes.
|
||||
@@ -430,6 +433,8 @@ func (sys *System) updateNetworkMonitorsRecords(app core.App, monitorResults map
|
||||
for i, f := range monitorFields {
|
||||
setClauses[i] = fmt.Sprintf("%s={:%s}", f, f)
|
||||
}
|
||||
// Results omit certInfo unless it changed, so keep the stored value.
|
||||
setClauses = append(setClauses, "certInfo=COALESCE({:certInfo}, certInfo)")
|
||||
queryString := fmt.Sprintf("UPDATE %s SET %s WHERE id={:id}", monitorCollectionName, strings.Join(setClauses, ", "))
|
||||
updateQuery = db.NewQuery(queryString)
|
||||
}
|
||||
@@ -450,11 +455,23 @@ func (sys *System) updateNetworkMonitorsRecords(app core.App, monitorResults map
|
||||
var record *core.Record
|
||||
record, err = app.FindRecordById(monitorCollectionName, id)
|
||||
if err == nil {
|
||||
if result.Cert != nil {
|
||||
monitorData["certInfo"] = result.Cert
|
||||
}
|
||||
record.Load(monitorData)
|
||||
err = app.SaveNoValidate(record)
|
||||
}
|
||||
default:
|
||||
_, err = updateQuery.Bind(dbx.Params(monitorData)).Execute()
|
||||
monitorData["certInfo"] = nil
|
||||
if result.Cert != nil {
|
||||
var cert []byte
|
||||
if cert, err = json.Marshal(result.Cert); err == nil {
|
||||
monitorData["certInfo"] = string(cert)
|
||||
}
|
||||
}
|
||||
if err == nil {
|
||||
_, err = updateQuery.Bind(dbx.Params(monitorData)).Execute()
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
app.Logger().Warn("Failed to update monitor", "system", systemId, "monitor", id, "err", err)
|
||||
@@ -630,7 +647,10 @@ func (sys *System) request(ctx context.Context, action common.WebSocketAction, r
|
||||
err := sys.sshTransport.RequestWithRetry(ctx, action, req, dest, 1)
|
||||
// Keep legacy SSH client/version fields in sync for other code paths.
|
||||
if sys.sshTransport != nil {
|
||||
sys.client.Store(sys.sshTransport.GetClient())
|
||||
client := sys.sshTransport.GetClient()
|
||||
if previous := sys.client.Swap(client); client != nil && client != previous {
|
||||
sys.monitorsNeedSync.Store(true)
|
||||
}
|
||||
sys.agentVersion = sys.sshTransport.GetAgentVersion()
|
||||
}
|
||||
return err
|
||||
@@ -688,8 +708,14 @@ func (sys *System) fetchDataFromAgent(options common.DataRequestOptions) (*syste
|
||||
if sys.WsConn != nil && sys.WsConn.IsConnected() {
|
||||
wsData, err := sys.fetchDataViaWebSocket(options)
|
||||
if err == nil {
|
||||
sys.syncPendingNetworkMonitors()
|
||||
return wsData, nil
|
||||
}
|
||||
// A slow collection doesn't mean the connection is broken. Closing it
|
||||
// would force the agent into a reconnect loop, so only report the error.
|
||||
if errors.Is(err, context.DeadlineExceeded) {
|
||||
return nil, err
|
||||
}
|
||||
// close the WebSocket connection if error and try SSH
|
||||
sys.closeWebSocketConnection()
|
||||
}
|
||||
@@ -698,15 +724,23 @@ func (sys *System) fetchDataFromAgent(options common.DataRequestOptions) (*syste
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
sys.syncPendingNetworkMonitors()
|
||||
return sshData, nil
|
||||
}
|
||||
|
||||
// wsDataRequestTimeout bounds how long to wait for stats over WebSocket. Agent
|
||||
// collection can legitimately take several seconds (e.g. a slow `zpool list`),
|
||||
// so this must be well above the request manager's 5s default.
|
||||
var wsDataRequestTimeout = 30 * time.Second
|
||||
|
||||
func (sys *System) fetchDataViaWebSocket(options common.DataRequestOptions) (*system.CombinedData, error) {
|
||||
if sys.WsConn == nil || !sys.WsConn.IsConnected() {
|
||||
return nil, errors.New("no websocket connection")
|
||||
}
|
||||
ctx, cancel := context.WithTimeout(context.Background(), wsDataRequestTimeout)
|
||||
defer cancel()
|
||||
wsTransport := transport.NewWebSocketTransport(sys.WsConn)
|
||||
err := wsTransport.Request(context.Background(), common.GetData, options, sys.data)
|
||||
err := wsTransport.Request(ctx, common.GetData, options, sys.data)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -932,6 +966,7 @@ func (s *System) createSSHClient() error {
|
||||
return err
|
||||
}
|
||||
s.agentVersion, _ = extractAgentVersion(string(client.Conn.ServerVersion()))
|
||||
s.monitorsNeedSync.Store(true)
|
||||
s.manager.resetFailedSmartFetchState(s.Id)
|
||||
s.manager.resetFailedZfsFetchState(s.Id)
|
||||
return nil
|
||||
|
||||
@@ -190,7 +190,9 @@ func (sm *SystemManager) onRecordAfterCreateSuccess(e *core.RecordEvent) error {
|
||||
// It clears system info when the status is changed to paused.
|
||||
func (sm *SystemManager) onRecordUpdate(e *core.RecordEvent) error {
|
||||
if e.Record.GetString("status") == paused {
|
||||
e.Record.Set("info", system.Info{})
|
||||
var prevInfo system.Info
|
||||
e.Record.UnmarshalJSONField("info", &prevInfo)
|
||||
e.Record.Set("info", system.Info{AgentVersion: prevInfo.AgentVersion})
|
||||
}
|
||||
return e.Next()
|
||||
}
|
||||
@@ -217,11 +219,15 @@ func (sm *SystemManager) onRecordAfterUpdateSuccess(e *core.RecordEvent) error {
|
||||
// Pause monitoring but keep system in manager for potential resume
|
||||
system.closeSSHConnection()
|
||||
}
|
||||
_ = deactivateAlerts(e.App, e.Record.Id)
|
||||
_ = deactivateAlerts(e.App, e.Record.Id, false)
|
||||
sm.hub.CancelPendingStatusAlerts(e.Record.Id)
|
||||
sm.hub.CancelPendingContainerAlerts(e.Record.Id)
|
||||
return e.Next()
|
||||
case pending:
|
||||
// Keep an active status alert until connectivity is confirmed. This lets
|
||||
// pending -> up resolve it and send the recovery notification after a
|
||||
// system address or other connection setting is changed.
|
||||
_ = deactivateAlerts(e.App, e.Record.Id, true)
|
||||
// Resume monitoring, preferring existing WebSocket connection
|
||||
if ok && system.WsConn != nil {
|
||||
go system.update()
|
||||
@@ -231,7 +237,6 @@ func (sm *SystemManager) onRecordAfterUpdateSuccess(e *core.RecordEvent) error {
|
||||
if err := sm.AddRecord(e.Record, nil); err != nil {
|
||||
e.App.Logger().Error("Error adding record", "err", err)
|
||||
}
|
||||
_ = deactivateAlerts(e.App, e.Record.Id)
|
||||
return e.Next()
|
||||
case down:
|
||||
// Docker state is unknown while the system is unreachable. Do not let a
|
||||
@@ -254,8 +259,9 @@ func (sm *SystemManager) onRecordAfterUpdateSuccess(e *core.RecordEvent) error {
|
||||
}
|
||||
}
|
||||
|
||||
// Trigger status change alerts for up/down transitions
|
||||
if (newStatus == down && prevStatus == up) || (newStatus == up && prevStatus == down) {
|
||||
// A connection-setting update moves a down system through pending before it
|
||||
// comes up, so recover active status alerts on any non-up -> up transition.
|
||||
if (newStatus == down && prevStatus == up) || (newStatus == up && prevStatus != up) {
|
||||
if err := sm.hub.HandleStatusAlerts(newStatus, e.Record); err != nil {
|
||||
e.App.Logger().Error("Error handling status alerts", "err", err)
|
||||
}
|
||||
@@ -349,23 +355,14 @@ func (sm *SystemManager) AddWebSocketSystem(systemId string, agentVersion semver
|
||||
system := sm.NewSystem(systemId)
|
||||
system.WsConn = wsConn
|
||||
system.agentVersion = agentVersion
|
||||
system.monitorsNeedSync.Store(true)
|
||||
|
||||
if err := sm.AddRecord(systemRecord, system); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Sync network monitors to the newly connected agent
|
||||
go func() {
|
||||
configs, err := sm.GetMonitorConfigsForSystem(systemId)
|
||||
if err != nil {
|
||||
sm.hub.Logger().Warn("failed to load monitors for agent", "system", systemId, "err", err)
|
||||
return
|
||||
}
|
||||
// An empty set must also replace any probes retained across a disconnect.
|
||||
if err := system.SyncNetworkMonitors(configs); err != nil {
|
||||
sm.hub.Logger().Warn("failed to sync monitors to agent", "system", systemId, "err", err)
|
||||
}
|
||||
}()
|
||||
go system.syncPendingNetworkMonitors()
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -422,10 +419,11 @@ func (sm *SystemManager) createSSHClientConfig() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// deactivateAlerts finds all triggered alerts for a system and sets them to inactive.
|
||||
// This is called when a system is paused or goes offline to prevent continued alerts.
|
||||
// deactivateAlerts finds triggered alerts for a system and sets them to inactive.
|
||||
// Status alerts can be preserved while connection changes are pending so that a
|
||||
// confirmed recovery still produces an "up" notification.
|
||||
// Monitor incidents remain open: a missing observation does not establish recovery.
|
||||
func deactivateAlerts(app core.App, systemID string) error {
|
||||
func deactivateAlerts(app core.App, systemID string, preserveStatusAlert bool) error {
|
||||
// Note: Direct SQL updates don't trigger SSE, so we use the PocketBase API
|
||||
// _, err := app.DB().NewQuery(fmt.Sprintf("UPDATE alerts SET triggered = false WHERE system = '%s'", systemID)).Execute()
|
||||
|
||||
@@ -435,6 +433,9 @@ func deactivateAlerts(app core.App, systemID string) error {
|
||||
}
|
||||
|
||||
for _, alert := range alerts {
|
||||
if preserveStatusAlert && alert.GetString("name") == "Status" {
|
||||
continue
|
||||
}
|
||||
alert.Set("triggered", false)
|
||||
if err := app.SaveNoValidate(alert); err != nil {
|
||||
return err
|
||||
|
||||
@@ -18,6 +18,38 @@ import (
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestPauseSystemPreservesAgentVersion(t *testing.T) {
|
||||
hub, user := tests.GetHubWithUser(t)
|
||||
defer hub.Cleanup()
|
||||
|
||||
record, err := tests.CreateRecord(hub, "systems", map[string]any{
|
||||
"name": "pause-info-test",
|
||||
"host": "localhost",
|
||||
"port": "33914",
|
||||
"users": []string{user.Id},
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
record.Set("info", system.Info{
|
||||
AgentVersion: "0.20.0",
|
||||
Cpu: 42.5,
|
||||
MemPct: 60,
|
||||
Uptime: 3600,
|
||||
Services: []uint16{3, 1},
|
||||
})
|
||||
require.NoError(t, hub.Save(record))
|
||||
|
||||
record.Set("status", "paused")
|
||||
require.NoError(t, hub.Save(record))
|
||||
|
||||
pausedRecord, err := hub.FindRecordById("systems", record.Id)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, "paused", pausedRecord.GetString("status"))
|
||||
var info system.Info
|
||||
require.NoError(t, pausedRecord.UnmarshalJSONField("info", &info))
|
||||
assert.Equal(t, system.Info{AgentVersion: "0.20.0"}, info)
|
||||
}
|
||||
|
||||
func TestSystemManagerNew(t *testing.T) {
|
||||
hub, err := tests.NewTestHub(t.TempDir())
|
||||
if err != nil {
|
||||
@@ -133,6 +165,55 @@ func TestSystemManagerNew(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
func TestStatusAlertRecoveryAfterPendingTransition(t *testing.T) {
|
||||
hub, user := tests.GetHubWithUser(t)
|
||||
defer hub.Cleanup()
|
||||
|
||||
userSettings, err := hub.FindFirstRecordByFilter("user_settings", "user={:user}", map[string]any{"user": user.Id})
|
||||
require.NoError(t, err)
|
||||
userSettings.Set("settings", map[string]any{
|
||||
"emails": []string{"test@example.com"},
|
||||
"webhooks": []string{},
|
||||
})
|
||||
require.NoError(t, hub.Save(userSettings))
|
||||
|
||||
record, err := tests.CreateRecord(hub, "systems", map[string]any{
|
||||
"name": "changed-address",
|
||||
"host": "192.0.2.1",
|
||||
"port": "33914",
|
||||
"users": []string{user.Id},
|
||||
})
|
||||
require.NoError(t, err)
|
||||
record.Set("status", "down")
|
||||
require.NoError(t, hub.Save(record))
|
||||
|
||||
alert, err := tests.CreateRecord(hub, "alerts", map[string]any{
|
||||
"name": "Status",
|
||||
"system": record.Id,
|
||||
"user": user.Id,
|
||||
"min": 1,
|
||||
"triggered": true,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
initialEmailCount := hub.TestMailer.TotalSend()
|
||||
|
||||
// The edit dialog temporarily moves the system through pending. The active
|
||||
// status alert must remain active until the new connection is confirmed.
|
||||
record.Set("host", "192.0.2.2")
|
||||
record.Set("status", "pending")
|
||||
require.NoError(t, hub.Save(record))
|
||||
alert, err = hub.FindRecordById("alerts", alert.Id)
|
||||
require.NoError(t, err)
|
||||
assert.True(t, alert.GetBool("triggered"), "pending connection update should preserve the active status alert")
|
||||
|
||||
record.Set("status", "up")
|
||||
require.NoError(t, hub.Save(record))
|
||||
alert, err = hub.FindRecordById("alerts", alert.Id)
|
||||
require.NoError(t, err)
|
||||
assert.False(t, alert.GetBool("triggered"), "pending -> up should resolve the active status alert")
|
||||
assert.Equal(t, initialEmailCount+1, hub.TestMailer.TotalSend(), "recovery should send an up notification")
|
||||
}
|
||||
|
||||
func testOld(t *testing.T, hub *tests.TestHub) {
|
||||
user, err := tests.CreateUser(hub, "test@testy.com", "testtesttest")
|
||||
require.NoError(t, err)
|
||||
|
||||
82
internal/hub/systems/ws_data_timeout_test.go
Normal file
82
internal/hub/systems/ws_data_timeout_test.go
Normal file
@@ -0,0 +1,82 @@
|
||||
//go:build testing
|
||||
|
||||
package systems
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/blang/semver"
|
||||
"github.com/fxamacker/cbor/v2"
|
||||
"github.com/henrygd/beszel/internal/common"
|
||||
esystem "github.com/henrygd/beszel/internal/entities/system"
|
||||
"github.com/henrygd/beszel/internal/hub/ws"
|
||||
"github.com/lxzan/gws"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
// slowDataClient answers GetData only after release is closed, simulating an
|
||||
// agent whose collection outlasts the hub's request timeout.
|
||||
type slowDataClient struct {
|
||||
gws.BuiltinEventHandler
|
||||
release chan struct{}
|
||||
}
|
||||
|
||||
func (c *slowDataClient) OnMessage(conn *gws.Conn, message *gws.Message) {
|
||||
defer message.Close()
|
||||
var req common.HubRequest[cbor.RawMessage]
|
||||
if err := cbor.Unmarshal(message.Bytes(), &req); err != nil || req.Action != common.GetData {
|
||||
return
|
||||
}
|
||||
<-c.release
|
||||
response, _ := cbor.Marshal(common.AgentResponse{Id: req.Id, SystemData: &esystem.CombinedData{}})
|
||||
_ = conn.WriteMessage(gws.OpcodeBinary, response)
|
||||
}
|
||||
|
||||
func TestFetchDataTimeoutKeepsWebSocketOpen(t *testing.T) {
|
||||
originalTimeout := wsDataRequestTimeout
|
||||
wsDataRequestTimeout = 50 * time.Millisecond
|
||||
t.Cleanup(func() { wsDataRequestTimeout = originalTimeout })
|
||||
|
||||
connections := make(chan *ws.WsConn, 1)
|
||||
upgrader := gws.NewUpgrader(&monitorSyncServer{}, nil)
|
||||
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
conn, err := upgrader.Upgrade(w, r)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
wsConn := ws.NewWsConnection(conn, semver.MustParse("0.20.0"))
|
||||
conn.Session().Store("wsConn", wsConn)
|
||||
connections <- wsConn
|
||||
conn.ReadLoop()
|
||||
}))
|
||||
t.Cleanup(server.Close)
|
||||
|
||||
client := &slowDataClient{release: make(chan struct{})}
|
||||
conn, _, err := gws.NewClient(client, &gws.ClientOption{Addr: "ws" + strings.TrimPrefix(server.URL, "http")})
|
||||
require.NoError(t, err)
|
||||
t.Cleanup(func() { _ = conn.NetConn().Close() })
|
||||
go conn.ReadLoop()
|
||||
|
||||
var sys *System
|
||||
select {
|
||||
case wsConn := <-connections:
|
||||
sys = &System{WsConn: wsConn}
|
||||
case <-time.After(3 * time.Second):
|
||||
t.Fatal("websocket connection was not established")
|
||||
}
|
||||
|
||||
_, err = sys.fetchDataFromAgent(common.DataRequestOptions{})
|
||||
require.ErrorIs(t, err, context.DeadlineExceeded)
|
||||
require.True(t, sys.WsConn.IsConnected(), "a slow collection must not close the connection")
|
||||
|
||||
// The late response is discarded and the next request still succeeds.
|
||||
close(client.release)
|
||||
_, err = sys.fetchDataFromAgent(common.DataRequestOptions{})
|
||||
require.NoError(t, err)
|
||||
}
|
||||
@@ -58,36 +58,38 @@ func Update(cmd *cobra.Command, _ []string) {
|
||||
func restartService() {
|
||||
// Check if we're running as a service by looking for systemd
|
||||
if _, err := exec.LookPath("systemctl"); err == nil {
|
||||
// Check if beszel service exists and is active
|
||||
cmd := exec.Command("systemctl", "is-active", "beszel.service")
|
||||
if err := cmd.Run(); err == nil {
|
||||
ghupdate.ColorPrint(ghupdate.ColorYellow, "Restarting beszel service...")
|
||||
restartCmd := exec.Command("systemctl", "restart", "beszel.service")
|
||||
if err := restartCmd.Run(); err != nil {
|
||||
ghupdate.ColorPrintf(ghupdate.ColorYellow, "Warning: Failed to restart service: %v\n", err)
|
||||
ghupdate.ColorPrint(ghupdate.ColorYellow, "Please restart the service manually: sudo systemctl restart beszel")
|
||||
} else {
|
||||
ghupdate.ColorPrint(ghupdate.ColorGreen, "Service restarted successfully")
|
||||
// install-hub.sh names the unit beszel-hub.service. beszel.service is
|
||||
// kept as a fallback for hand written units.
|
||||
for _, unit := range []string{"beszel-hub.service", "beszel.service"} {
|
||||
if err := exec.Command("systemctl", "is-active", unit).Run(); err != nil {
|
||||
continue
|
||||
}
|
||||
reportRestart(exec.Command("systemctl", "restart", unit), "sudo systemctl restart "+unit)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// Check for OpenRC (Alpine Linux)
|
||||
if _, err := exec.LookPath("rc-service"); err == nil {
|
||||
cmd := exec.Command("rc-service", "beszel", "status")
|
||||
if err := cmd.Run(); err == nil {
|
||||
ghupdate.ColorPrint(ghupdate.ColorYellow, "Restarting beszel service...")
|
||||
restartCmd := exec.Command("rc-service", "beszel", "restart")
|
||||
if err := restartCmd.Run(); err != nil {
|
||||
ghupdate.ColorPrintf(ghupdate.ColorYellow, "Warning: Failed to restart service: %v\n", err)
|
||||
ghupdate.ColorPrint(ghupdate.ColorYellow, "Please restart the service manually: sudo rc-service beszel restart")
|
||||
} else {
|
||||
ghupdate.ColorPrint(ghupdate.ColorGreen, "Service restarted successfully")
|
||||
for _, service := range []string{"beszel-hub", "beszel"} {
|
||||
if err := exec.Command("rc-service", service, "status").Run(); err != nil {
|
||||
continue
|
||||
}
|
||||
reportRestart(exec.Command("rc-service", service, "restart"), "sudo rc-service "+service+" restart")
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
ghupdate.ColorPrint(ghupdate.ColorYellow, "Service restart not attempted. If running as a service, restart manually.")
|
||||
}
|
||||
|
||||
// reportRestart runs the restart command and prints the result.
|
||||
func reportRestart(cmd *exec.Cmd, manualCommand string) {
|
||||
ghupdate.ColorPrint(ghupdate.ColorYellow, "Restarting beszel service...")
|
||||
if err := cmd.Run(); err != nil {
|
||||
ghupdate.ColorPrintf(ghupdate.ColorYellow, "Warning: Failed to restart service: %v\n", err)
|
||||
ghupdate.ColorPrint(ghupdate.ColorYellow, "Please restart the service manually: "+manualCommand)
|
||||
} else {
|
||||
ghupdate.ColorPrint(ghupdate.ColorGreen, "Service restarted successfully")
|
||||
}
|
||||
}
|
||||
|
||||
24
internal/migrations/1790193183_network_monitor_cert.go
Normal file
24
internal/migrations/1790193183_network_monitor_cert.go
Normal file
@@ -0,0 +1,24 @@
|
||||
package migrations
|
||||
|
||||
import (
|
||||
"github.com/pocketbase/pocketbase/core"
|
||||
m "github.com/pocketbase/pocketbase/migrations"
|
||||
)
|
||||
|
||||
func init() {
|
||||
m.Register(func(app core.App) error {
|
||||
collection, err := app.FindCollectionByNameOrId("network_monitors")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
collection.Fields.Add(&core.JSONField{Name: "certInfo"})
|
||||
return app.Save(collection)
|
||||
}, func(app core.App) error {
|
||||
collection, err := app.FindCollectionByNameOrId("network_monitors")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
collection.Fields.RemoveByName("certInfo")
|
||||
return app.Save(collection)
|
||||
})
|
||||
}
|
||||
@@ -116,8 +116,6 @@ export const SystemDialog = ({ setOpen, system }: { setOpen: (open: boolean) =>
|
||||
}
|
||||
}
|
||||
|
||||
const systemTranslation = t`System`
|
||||
|
||||
return (
|
||||
<DialogContent
|
||||
className="w-[90%] sm:w-auto sm:ns-dialog max-w-full rounded-lg"
|
||||
@@ -129,9 +127,9 @@ export const SystemDialog = ({ setOpen, system }: { setOpen: (open: boolean) =>
|
||||
<DialogHeader>
|
||||
<DialogTitle className="mb-1 pb-1 max-w-100 truncate pr-8">
|
||||
{system ? (
|
||||
<Trans>Edit {{ foo: systemTranslation }}</Trans>
|
||||
<Trans>Edit System</Trans>
|
||||
) : (
|
||||
<Trans>Add {{ foo: systemTranslation }}</Trans>
|
||||
<Trans>Add System</Trans>
|
||||
)}
|
||||
</DialogTitle>
|
||||
<TabsList className="grid w-full grid-cols-2">
|
||||
@@ -268,9 +266,9 @@ export const SystemDialog = ({ setOpen, system }: { setOpen: (open: boolean) =>
|
||||
{/* Save */}
|
||||
<Button>
|
||||
{system ? (
|
||||
<Trans>Save {{ foo: systemTranslation }}</Trans>
|
||||
<Trans>Save System</Trans>
|
||||
) : (
|
||||
<Trans>Add {{ foo: systemTranslation }}</Trans>
|
||||
<Trans>Add System</Trans>
|
||||
)}
|
||||
</Button>
|
||||
</DialogFooter>
|
||||
|
||||
@@ -59,7 +59,11 @@ export const containerChartCols: ColumnDef<ContainerRecord>[] = [
|
||||
const allSystems = $allSystemsById.get()
|
||||
const systemNameA = allSystems[a.original.system]?.name ?? ""
|
||||
const systemNameB = allSystems[b.original.system]?.name ?? ""
|
||||
return systemNameA.localeCompare(systemNameB)
|
||||
const primary = systemNameA.localeCompare(systemNameB)
|
||||
if (primary !== 0) {
|
||||
return primary
|
||||
}
|
||||
return a.original.name.localeCompare(b.original.name)
|
||||
},
|
||||
header: ({ column }) => <HeaderButton column={column} name={t`System`} Icon={ServerIcon} />,
|
||||
cell: ({ getValue }) => {
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import { t } from "@lingui/core/macro"
|
||||
import { Trans } from "@lingui/react/macro"
|
||||
import { getPagePath } from "@nanostores/router"
|
||||
import {
|
||||
@@ -48,8 +47,6 @@ export default function Navbar() {
|
||||
|
||||
const AdminLinks = AdminDropdownGroup()
|
||||
|
||||
const systemTranslation = t`System`
|
||||
|
||||
return (
|
||||
<div className="flex items-center h-14 md:h-16 bg-card px-4 pe-3 sm:px-6 border border-border/60 bt-0 rounded-md my-4">
|
||||
<Suspense>
|
||||
@@ -140,7 +137,7 @@ export default function Navbar() {
|
||||
}}
|
||||
>
|
||||
<PlusIcon className="h-4 w-4 me-2.5" />
|
||||
<Trans>Add {{ foo: systemTranslation }}</Trans>
|
||||
<Trans>Add System</Trans>
|
||||
</DropdownMenuItem>
|
||||
)}
|
||||
</DropdownMenuGroup>
|
||||
@@ -243,7 +240,7 @@ export default function Navbar() {
|
||||
{!isReadOnlyUser() && (
|
||||
<Button variant="outline" className="flex gap-1 ms-2" onClick={() => setAddSystemDialogOpen(true)}>
|
||||
<PlusIcon className="h-4 w-4 -ms-1" />
|
||||
<Trans>Add {{ foo: systemTranslation }}</Trans>
|
||||
<Trans>Add System</Trans>
|
||||
</Button>
|
||||
)}
|
||||
</div>
|
||||
|
||||
@@ -23,7 +23,7 @@ import { Input } from "@/components/ui/input"
|
||||
import { Label } from "@/components/ui/label"
|
||||
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
|
||||
import { Textarea } from "@/components/ui/textarea"
|
||||
import { ChevronDownIcon, ListIcon, SearchIcon, ServerIcon } from "lucide-react"
|
||||
import { ChevronDownIcon, ListIcon, PlusIcon, SearchIcon, ServerIcon } from "lucide-react"
|
||||
import { useToast } from "@/components/ui/use-toast"
|
||||
import { $systems } from "@/lib/stores"
|
||||
import { cn, supportsNetworkMonitors } from "@/lib/utils"
|
||||
@@ -353,6 +353,8 @@ export function AddMonitorDialog({ systemId, monitors }: { systemId?: string; mo
|
||||
const bulkFormRef = useRef<HTMLFormElement>(null)
|
||||
const { toast } = useToast()
|
||||
const { t } = useLingui()
|
||||
const systems = useStore($systems)
|
||||
const hasEligibleSystems = systemId ? true : systems.some(supportsNetworkMonitors)
|
||||
|
||||
const resetBulkForm = () => {
|
||||
setBulkInput("")
|
||||
@@ -443,14 +445,24 @@ export function AddMonitorDialog({ systemId, monitors }: { systemId?: string; mo
|
||||
return (
|
||||
<>
|
||||
<div className="flex gap-0 rounded-lg">
|
||||
<Button variant="outline" onClick={openAdd} className="rounded-e-none grow">
|
||||
{/* <PlusIcon className="size-4 me-1" /> */}
|
||||
<Trans>Add {{ foo: t`Monitor` }}</Trans>
|
||||
<Button variant="outline" onClick={openAdd} className="rounded-e-none grow" disabled={!hasEligibleSystems}>
|
||||
<PlusIcon className="size-4 me-1" />
|
||||
<span className="sm:hidden">
|
||||
<Trans>Add</Trans>
|
||||
</span>
|
||||
<span className="hidden sm:inline">
|
||||
<Trans>Add {{ foo: t`Monitor` }}</Trans>
|
||||
</span>
|
||||
</Button>
|
||||
<div className="w-px h-full bg-muted"></div>
|
||||
<DropdownMenu>
|
||||
<DropdownMenuTrigger asChild>
|
||||
<Button variant="outline" className="px-2 rounded-s-none border-s-0" aria-label={`More actions`}>
|
||||
<Button
|
||||
variant="outline"
|
||||
className="px-2 rounded-s-none border-s-0"
|
||||
aria-label={`More actions`}
|
||||
disabled={!hasEligibleSystems}
|
||||
>
|
||||
<ChevronDownIcon className="size-4" />
|
||||
</Button>
|
||||
</DropdownMenuTrigger>
|
||||
@@ -485,7 +497,9 @@ export function AddMonitorDialog({ systemId, monitors }: { systemId?: string; mo
|
||||
<SheetTitle>
|
||||
<Trans>Bulk Add {{ foo: t`Network Monitors` }}</Trans>
|
||||
</SheetTitle>
|
||||
<SheetDescription>target[,protocol[,port[,interval]]]</SheetDescription>
|
||||
<SheetDescription>
|
||||
<Trans>target[,protocol[,port[,interval]]]</Trans>
|
||||
</SheetDescription>
|
||||
</SheetHeader>
|
||||
<form ref={bulkFormRef} onSubmit={handleBulkSubmit} className="flex h-full flex-col overflow-hidden">
|
||||
<div className="flex-1 flex flex-col space-y-4 overflow-auto p-4">
|
||||
@@ -521,7 +535,9 @@ export function AddMonitorDialog({ systemId, monitors }: { systemId?: string; mo
|
||||
placeholder={["1.1.1.1", "example.com,tcp", "https://example.com,http,,60"].join("\n")}
|
||||
required
|
||||
/>
|
||||
<p className="text-xs text-muted-foreground">target[,protocol[,port[,interval]]]</p>
|
||||
<p className="text-xs text-muted-foreground">
|
||||
<Trans>target[,protocol[,port[,interval]]]</Trans>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<SheetFooter className="border-t">
|
||||
|
||||
@@ -16,6 +16,7 @@ import {
|
||||
PlayCircleIcon,
|
||||
CopyIcon,
|
||||
CopyPlusIcon,
|
||||
ShieldCheckIcon,
|
||||
} from "lucide-react"
|
||||
import { t } from "@lingui/core/macro"
|
||||
import type { NetworkMonitorRecord, SystemRecord } from "@/types"
|
||||
@@ -29,7 +30,7 @@ import {
|
||||
DropdownMenuSubTrigger,
|
||||
DropdownMenuTrigger,
|
||||
} from "@/components/ui/dropdown-menu"
|
||||
import { Trans } from "@lingui/react/macro"
|
||||
import { Plural, Trans } from "@lingui/react/macro"
|
||||
import { $allSystemsById, $longestSystemName } from "@/lib/stores"
|
||||
import { useStore } from "@nanostores/react"
|
||||
import { SystemStatus } from "@/lib/enums"
|
||||
@@ -37,9 +38,17 @@ import { Checkbox } from "@/components/ui/checkbox"
|
||||
import { useMemo } from "react"
|
||||
import { formatBulkMonitorLine } from "@/components/network-monitors-table/monitor-dialog"
|
||||
import { Badge } from "../ui/badge"
|
||||
import { getMonitorTarget } from "@/lib/network-monitor-utils"
|
||||
import { getCertDaysLeft, getCertExpiryLevel, getMonitorTarget } from "@/lib/network-monitor-utils"
|
||||
import { pb } from "@/lib/api"
|
||||
|
||||
const certExpiryDotColors = { ok: "bg-green-500", warning: "bg-yellow-500", critical: "bg-red-500" }
|
||||
|
||||
declare module "@tanstack/react-table" {
|
||||
interface ColumnMeta<TData, TValue> {
|
||||
label?: string
|
||||
}
|
||||
}
|
||||
|
||||
const protocolColors: Record<string, string> = {
|
||||
icmp: "bg-blue-500/15! text-blue-600 dark:text-blue-400",
|
||||
tcp: "bg-purple-500/15! text-purple-600 dark:text-purple-400",
|
||||
@@ -98,6 +107,7 @@ export function getMonitorColumns(
|
||||
},
|
||||
{
|
||||
id: "system",
|
||||
meta: { label: t`System` },
|
||||
accessorFn: (record) => record.system,
|
||||
sortingFn: (a, b) => {
|
||||
const allSystems = $allSystemsById.get()
|
||||
@@ -128,12 +138,13 @@ export function getMonitorColumns(
|
||||
</div>
|
||||
</div>
|
||||
),
|
||||
[status, name]
|
||||
[status, name, longestSystemName]
|
||||
)
|
||||
},
|
||||
},
|
||||
{
|
||||
id: "target",
|
||||
meta: { label: t`Target` },
|
||||
sortingFn: (a, b) => a.original.target.localeCompare(b.original.target),
|
||||
accessorFn: (record) => getMonitorTarget(record),
|
||||
header: ({ column }) => <HeaderButton column={column} name={t`Target`} Icon={GlobeIcon} />,
|
||||
@@ -146,6 +157,8 @@ export function getMonitorColumns(
|
||||
color = "bg-primary/40"
|
||||
} else if (status === SystemStatus.Down || status === SystemStatus.Pending) {
|
||||
color = "bg-yellow-500"
|
||||
} else if (monitor.updated && !monitor.res) {
|
||||
color = "bg-red-500"
|
||||
}
|
||||
return (
|
||||
<div className="ms-1.5 max-w-64 flex gap-2 items-center tabular-nums">
|
||||
@@ -162,6 +175,7 @@ export function getMonitorColumns(
|
||||
},
|
||||
{
|
||||
id: "protocol",
|
||||
meta: { label: t`Protocol` },
|
||||
accessorFn: (record) => record.protocol,
|
||||
header: ({ column }) => <HeaderButton column={column} name={t`Protocol`} Icon={ArrowLeftRightIcon} />,
|
||||
cell: ({ getValue }) => {
|
||||
@@ -171,6 +185,7 @@ export function getMonitorColumns(
|
||||
},
|
||||
{
|
||||
id: "interval",
|
||||
meta: { label: t`Interval` },
|
||||
accessorFn: (record) => record.interval,
|
||||
invertSorting: true,
|
||||
header: ({ column }) => <HeaderButton column={column} name={t`Interval`} Icon={RefreshCwIcon} />,
|
||||
@@ -178,6 +193,7 @@ export function getMonitorColumns(
|
||||
},
|
||||
{
|
||||
id: "res",
|
||||
meta: { label: t`Response` },
|
||||
accessorFn: (record) => record.res,
|
||||
invertSorting: true,
|
||||
header: ({ column }) => <HeaderButton column={column} name={t`Response`} Icon={TimerIcon} />,
|
||||
@@ -185,6 +201,7 @@ export function getMonitorColumns(
|
||||
},
|
||||
{
|
||||
id: "res1h",
|
||||
meta: { label: t`Avg 1h` },
|
||||
accessorFn: (record) => record.resAvg1h,
|
||||
invertSorting: true,
|
||||
header: ({ column }) => <HeaderButton column={column} name={t`Avg 1h`} Icon={TimerIcon} />,
|
||||
@@ -192,6 +209,7 @@ export function getMonitorColumns(
|
||||
},
|
||||
{
|
||||
id: "max1h",
|
||||
meta: { label: t`Max 1h` },
|
||||
accessorFn: (record) => record.resMax1h,
|
||||
invertSorting: true,
|
||||
header: ({ column }) => <HeaderButton column={column} name={t`Max 1h`} Icon={TimerIcon} />,
|
||||
@@ -199,6 +217,7 @@ export function getMonitorColumns(
|
||||
},
|
||||
{
|
||||
id: "min1h",
|
||||
meta: { label: t`Min 1h` },
|
||||
accessorFn: (record) => record.resMin1h,
|
||||
invertSorting: true,
|
||||
header: ({ column }) => <HeaderButton column={column} name={t`Min 1h`} Icon={TimerIcon} />,
|
||||
@@ -206,6 +225,7 @@ export function getMonitorColumns(
|
||||
},
|
||||
{
|
||||
id: "loss",
|
||||
meta: { label: t`Loss 1h` },
|
||||
accessorFn: (record) => record.loss1h,
|
||||
invertSorting: true,
|
||||
header: ({ column }) => <HeaderButton column={column} name={t`Loss 1h`} Icon={WifiOffIcon} />,
|
||||
@@ -232,8 +252,34 @@ export function getMonitorColumns(
|
||||
)
|
||||
},
|
||||
},
|
||||
{
|
||||
id: "cert",
|
||||
meta: { label: t`Certificate` },
|
||||
accessorFn: (record) => record.certInfo?.expires,
|
||||
header: ({ column }) => <HeaderButton column={column} name={t`Certificate`} Icon={ShieldCheckIcon} />,
|
||||
cell: ({ row }) => {
|
||||
const { certInfo, system } = row.original
|
||||
const systemRecord = useStore($allSystemsById)[system]
|
||||
|
||||
if (!certInfo?.expires) {
|
||||
return <span className="ms-1.5 text-muted-foreground">-</span>
|
||||
}
|
||||
|
||||
const daysLeft = getCertDaysLeft(certInfo)
|
||||
const color = isMuted(row.original, systemRecord)
|
||||
? "bg-muted-foreground/50"
|
||||
: certExpiryDotColors[getCertExpiryLevel(daysLeft)]
|
||||
return (
|
||||
<span className="ms-1.5 tabular-nums flex gap-2 items-center">
|
||||
<span className={cn("shrink-0 size-2 rounded-full", color)} />
|
||||
{daysLeft < 0 ? <Trans>Expired</Trans> : <Plural value={daysLeft} one="# day" other="# days" />}
|
||||
</span>
|
||||
)
|
||||
},
|
||||
},
|
||||
{
|
||||
id: "updated",
|
||||
meta: { label: t`Updated` },
|
||||
invertSorting: true,
|
||||
accessorFn: (record) => record.updated,
|
||||
header: ({ column }) => <HeaderButton column={column} name={t`Updated`} Icon={ClockIcon} />,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { getMonitorTarget } from "@/lib/network-monitor-utils"
|
||||
import { getCertDaysLeft, getCertExpiryLevel, getMonitorTarget } from "@/lib/network-monitor-utils"
|
||||
import { t } from "@lingui/core/macro"
|
||||
import { Trans } from "@lingui/react/macro"
|
||||
import { Plural, Trans } from "@lingui/react/macro"
|
||||
import {
|
||||
type ColumnFiltersState,
|
||||
flexRender,
|
||||
@@ -26,26 +26,43 @@ import {
|
||||
AlertDialogTitle,
|
||||
} from "@/components/ui/alert-dialog"
|
||||
import { Button, buttonVariants } from "@/components/ui/button"
|
||||
import { memo, useCallback, useMemo, useRef, useState } from "react"
|
||||
import { memo, useCallback, useEffect, useMemo, useRef, useState } from "react"
|
||||
import { subscribeKeys } from "nanostores"
|
||||
import { getMonitorColumns } from "@/components/network-monitors-table/network-monitors-columns"
|
||||
import { Card, CardHeader, CardTitle } from "@/components/ui/card"
|
||||
import { Input } from "@/components/ui/input"
|
||||
import { TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
|
||||
import { useToast } from "@/components/ui/use-toast"
|
||||
import { isReadOnlyUser } from "@/lib/api"
|
||||
import { isReadOnlyUser, queueUserSettings } from "@/lib/api"
|
||||
import { pb } from "@/lib/api"
|
||||
import { $allSystemsById, $direction, $userSettings } from "@/lib/stores"
|
||||
import {
|
||||
cn,
|
||||
isVisuallyLonger,
|
||||
matchesFilterGroups,
|
||||
parseFilterGroups,
|
||||
parseSemVer,
|
||||
useBrowserStorage,
|
||||
} from "@/lib/utils"
|
||||
import type { ChartData, NetworkMonitorRecord } from "@/types"
|
||||
import { SystemStatus } from "@/lib/enums"
|
||||
import { $allSystemsById, $direction, $textMeasureVersion, $userSettings, getUserChartTime } from "@/lib/stores"
|
||||
import { cn, formatShortDate, isVisuallyLonger, matchesFilterGroups, parseFilterGroups, parseSemVer } from "@/lib/utils"
|
||||
import type { ChartData, MonitorCertInfo, NetworkMonitorRecord } from "@/types"
|
||||
import { AddMonitorDialog, EditMonitorDialog } from "./monitor-dialog"
|
||||
import { ArrowLeftRightIcon, EthernetPortIcon, LoaderCircleIcon, ServerIcon, XIcon } from "lucide-react"
|
||||
import {
|
||||
ArrowDownIcon,
|
||||
ArrowLeftRightIcon,
|
||||
ArrowUpDownIcon,
|
||||
ArrowUpIcon,
|
||||
EthernetPortIcon,
|
||||
EyeIcon,
|
||||
LandmarkIcon,
|
||||
LoaderCircleIcon,
|
||||
ServerIcon,
|
||||
Settings2Icon,
|
||||
ShieldCheckIcon,
|
||||
XIcon,
|
||||
} from "lucide-react"
|
||||
import {
|
||||
DropdownMenu,
|
||||
DropdownMenuCheckboxItem,
|
||||
DropdownMenuContent,
|
||||
DropdownMenuItem,
|
||||
DropdownMenuLabel,
|
||||
DropdownMenuSeparator,
|
||||
DropdownMenuTrigger,
|
||||
} from "@/components/ui/dropdown-menu"
|
||||
import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from "@/components/ui/sheet"
|
||||
import ChartTimeSelect from "@/components/charts/chart-time-select"
|
||||
import { LossChart, AvgMinMaxResponseChart } from "@/components/routes/system/charts/monitors-charts"
|
||||
@@ -65,13 +82,19 @@ export default function NetworkMonitorsTableNew({
|
||||
monitors: NetworkMonitorRecord[]
|
||||
isLoading: boolean
|
||||
}) {
|
||||
const [sorting, setSorting] = useBrowserStorage<SortingState>(
|
||||
`sort-np-target-${systemId ? 1 : 0}`,
|
||||
[{ id: systemId ? "target" : "system", desc: false }],
|
||||
sessionStorage
|
||||
const sortSettingsKey = systemId ? "monitorSortModeSystem" : "monitorSortMode"
|
||||
const sortStorageKey = `besz-sort-np-target-${systemId ? 1 : 0}`
|
||||
const [sorting, setSorting] = useState<SortingState>(
|
||||
() =>
|
||||
$userSettings.get()[sortSettingsKey] ??
|
||||
JSON.parse(sessionStorage.getItem(sortStorageKey) || "null") ?? [
|
||||
{ id: systemId ? "target" : "system", desc: false },
|
||||
]
|
||||
)
|
||||
const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([])
|
||||
const [columnVisibility, setColumnVisibility] = useState<VisibilityState>({})
|
||||
const [columnVisibility, setColumnVisibility] = useState<VisibilityState>(
|
||||
() => $userSettings.get().monitorCols ?? JSON.parse(localStorage.getItem("besz-monitor-cols") || "{}")
|
||||
)
|
||||
const [rowSelection, setRowSelection] = useState<RowSelectionState>({})
|
||||
const [globalFilter, setGlobalFilter] = useState("")
|
||||
const [deleteOpen, setDeleteOpen] = useState(false)
|
||||
@@ -81,6 +104,49 @@ export default function NetworkMonitorsTableNew({
|
||||
const { toast } = useToast()
|
||||
const canManageMonitors = !isReadOnlyUser()
|
||||
|
||||
// Apply settings from server once they load (handles incognito / new devices)
|
||||
const appliedSettings = useRef(new Set<string>())
|
||||
useEffect(() => {
|
||||
return subscribeKeys($userSettings, ["monitorCols", sortSettingsKey], (vals) => {
|
||||
if (!appliedSettings.current.has("monitorCols") && vals.monitorCols !== undefined) {
|
||||
appliedSettings.current.add("monitorCols")
|
||||
setColumnVisibility(vals.monitorCols)
|
||||
}
|
||||
if (!appliedSettings.current.has(sortSettingsKey) && vals[sortSettingsKey] !== undefined) {
|
||||
appliedSettings.current.add(sortSettingsKey)
|
||||
setSorting(vals[sortSettingsKey] as SortingState)
|
||||
}
|
||||
})
|
||||
}, [sortSettingsKey])
|
||||
|
||||
const handleColumnVisibilityChange = useCallback(
|
||||
(updater: VisibilityState | ((prev: VisibilityState) => VisibilityState)) => {
|
||||
setColumnVisibility((prev) => {
|
||||
const next = typeof updater === "function" ? updater(prev) : updater
|
||||
localStorage.setItem("besz-monitor-cols", JSON.stringify(next))
|
||||
$userSettings.setKey("monitorCols", next)
|
||||
queueUserSettings({ monitorCols: next })
|
||||
return next
|
||||
})
|
||||
},
|
||||
[]
|
||||
)
|
||||
|
||||
const handleSortingChange = useCallback(
|
||||
(updater: SortingState | ((prev: SortingState) => SortingState)) => {
|
||||
setSorting((prev) => {
|
||||
const next = typeof updater === "function" ? updater(prev) : updater
|
||||
sessionStorage.setItem(sortStorageKey, JSON.stringify(next))
|
||||
$userSettings.setKey(sortSettingsKey, next)
|
||||
queueUserSettings({ [sortSettingsKey]: next })
|
||||
return next
|
||||
})
|
||||
},
|
||||
[sortSettingsKey, sortStorageKey]
|
||||
)
|
||||
|
||||
// recompute when measured widths are invalidated (e.g. web font finished loading)
|
||||
const textMeasureVersion = useStore($textMeasureVersion)
|
||||
const longestTarget = useMemo(() => {
|
||||
let longestTarget = ""
|
||||
for (const p of monitors) {
|
||||
@@ -89,7 +155,7 @@ export default function NetworkMonitorsTableNew({
|
||||
}
|
||||
}
|
||||
return longestTarget
|
||||
}, [monitors])
|
||||
}, [monitors, textMeasureVersion])
|
||||
|
||||
const runMonitorBatch = useCallback(
|
||||
async (ids: string[], enqueue: (batch: ReturnType<typeof pb.createBatch>, id: string) => void) => {
|
||||
@@ -207,9 +273,9 @@ export default function NetworkMonitorsTableNew({
|
||||
getCoreRowModel: getCoreRowModel(),
|
||||
getSortedRowModel: getSortedRowModel(),
|
||||
getFilteredRowModel: getFilteredRowModel(),
|
||||
onSortingChange: setSorting,
|
||||
onSortingChange: handleSortingChange,
|
||||
onColumnFiltersChange: setColumnFilters,
|
||||
onColumnVisibilityChange: setColumnVisibility,
|
||||
onColumnVisibilityChange: handleColumnVisibilityChange,
|
||||
onRowSelectionChange: setRowSelection,
|
||||
defaultColumn: {
|
||||
sortUndefined: "last",
|
||||
@@ -236,11 +302,12 @@ export default function NetworkMonitorsTableNew({
|
||||
|
||||
const rows = table.getRowModel().rows
|
||||
const visibleColumns = table.getVisibleLeafColumns()
|
||||
const visibleColumnsKey = visibleColumns.map((column) => column.id).join(",")
|
||||
|
||||
return (
|
||||
<Card className="@container w-full px-3 py-5 sm:py-6 sm:px-6">
|
||||
<CardHeader className="p-0 mb-3 sm:mb-4">
|
||||
<div className="grid md:flex gap-x-5 gap-y-3 w-full items-end">
|
||||
<div className="grid md-lg:flex gap-x-5 gap-y-3 w-full items-end">
|
||||
<div className="px-2 sm:px-1">
|
||||
<CardTitle className="mb-2">
|
||||
<Trans>Network Monitors</Trans>
|
||||
@@ -249,14 +316,14 @@ export default function NetworkMonitorsTableNew({
|
||||
<Trans>Response time monitoring from agents.</Trans>
|
||||
</div>
|
||||
</div>
|
||||
<div className="md:ms-auto flex items-center gap-2">
|
||||
<div className="md-lg:ms-auto flex items-center gap-2">
|
||||
{monitors.length > 0 && (
|
||||
<div className="relative">
|
||||
<div className="relative grow">
|
||||
<Input
|
||||
placeholder={t`Filter...`}
|
||||
value={globalFilter}
|
||||
onChange={(e) => setGlobalFilter(e.target.value)}
|
||||
className="ms-auto px-4 w-full max-w-full md:w-50"
|
||||
className="ms-auto px-4 w-full max-w-full md-lg:w-50"
|
||||
/>
|
||||
{globalFilter && (
|
||||
<Button
|
||||
@@ -272,6 +339,74 @@ export default function NetworkMonitorsTableNew({
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
<DropdownMenu>
|
||||
<DropdownMenuTrigger asChild>
|
||||
<Button variant="outline">
|
||||
<Settings2Icon className="me-1.5 size-4 opacity-80" />
|
||||
<Trans>View</Trans>
|
||||
</Button>
|
||||
</DropdownMenuTrigger>
|
||||
<DropdownMenuContent className="h-72 md:h-auto min-w-48 md:min-w-auto overflow-y-auto">
|
||||
<div className="grid grid-cols-2 divide-y md:divide-s md:divide-y-0">
|
||||
<div className="border-r">
|
||||
<DropdownMenuLabel className="pt-2 px-3.5 flex items-center gap-2">
|
||||
<ArrowUpDownIcon className="size-4" />
|
||||
<Trans>Sort By</Trans>
|
||||
</DropdownMenuLabel>
|
||||
<DropdownMenuSeparator />
|
||||
<div className="px-1 pb-1">
|
||||
{table.getAllColumns().map((column) => {
|
||||
if (!column.getCanSort()) return null
|
||||
let Icon = <span className="w-6"></span>
|
||||
if (sorting[0]?.id === column.id) {
|
||||
Icon = sorting[0]?.desc ? (
|
||||
<ArrowUpIcon className="me-2 size-4" />
|
||||
) : (
|
||||
<ArrowDownIcon className="me-2 size-4" />
|
||||
)
|
||||
}
|
||||
return (
|
||||
<DropdownMenuItem
|
||||
onSelect={(e) => {
|
||||
e.preventDefault()
|
||||
handleSortingChange([
|
||||
{ id: column.id, desc: sorting[0]?.id === column.id && !sorting[0]?.desc },
|
||||
])
|
||||
}}
|
||||
key={column.id}
|
||||
>
|
||||
{Icon}
|
||||
{column.columnDef.meta?.label ?? column.id}
|
||||
</DropdownMenuItem>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<DropdownMenuLabel className="pt-2 px-3.5 flex items-center gap-2">
|
||||
<EyeIcon className="size-4" />
|
||||
<Trans>Visible Fields</Trans>
|
||||
</DropdownMenuLabel>
|
||||
<DropdownMenuSeparator />
|
||||
<div className="px-1.5 pb-1">
|
||||
{table
|
||||
.getAllColumns()
|
||||
.filter((column) => column.getCanHide())
|
||||
.map((column) => (
|
||||
<DropdownMenuCheckboxItem
|
||||
key={column.id}
|
||||
onSelect={(e) => e.preventDefault()}
|
||||
checked={column.getIsVisible()}
|
||||
onCheckedChange={(value) => column.toggleVisibility(!!value)}
|
||||
>
|
||||
{column.columnDef.meta?.label ?? column.id}
|
||||
</DropdownMenuCheckboxItem>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</DropdownMenuContent>
|
||||
</DropdownMenu>
|
||||
{canManageMonitors ? <AddMonitorDialog systemId={systemId} monitors={monitors} /> : null}
|
||||
{canManageMonitors ? (
|
||||
<EditMonitorDialog
|
||||
@@ -324,6 +459,7 @@ export default function NetworkMonitorsTableNew({
|
||||
table={table}
|
||||
rows={rows}
|
||||
colLength={visibleColumns.length}
|
||||
visibleColumnsKey={visibleColumnsKey}
|
||||
rowSelection={rowSelection}
|
||||
isLoading={isLoading}
|
||||
/>
|
||||
@@ -336,12 +472,14 @@ const NetworkMonitorsTable = memo(function NetworkMonitorTable({
|
||||
table,
|
||||
rows,
|
||||
colLength,
|
||||
visibleColumnsKey,
|
||||
rowSelection,
|
||||
isLoading,
|
||||
}: {
|
||||
table: TableType<NetworkMonitorRecord>
|
||||
rows: Row<NetworkMonitorRecord>[]
|
||||
colLength: number
|
||||
visibleColumnsKey: string
|
||||
rowSelection: RowSelectionState
|
||||
isLoading: boolean
|
||||
}) {
|
||||
@@ -389,6 +527,7 @@ const NetworkMonitorsTable = memo(function NetworkMonitorTable({
|
||||
virtualRow={virtualRow}
|
||||
isSelected={row.getIsSelected()}
|
||||
rowSelection={rowSelection}
|
||||
visibleColumnsKey={visibleColumnsKey}
|
||||
openSheet={openSheet}
|
||||
/>
|
||||
)
|
||||
@@ -441,6 +580,9 @@ const NetworkMonitorTableRow = memo(function NetworkMonitorTableRow({
|
||||
virtualRow,
|
||||
isSelected,
|
||||
rowSelection: _rowSelection,
|
||||
// Column visibility doesn't change the row object identity, so this prop exists only
|
||||
// to force a re-render (and a fresh row.getVisibleCells() read) when columns are toggled.
|
||||
visibleColumnsKey: _visibleColumnsKey,
|
||||
openSheet,
|
||||
}: {
|
||||
row: Row<NetworkMonitorRecord>
|
||||
@@ -448,12 +590,16 @@ const NetworkMonitorTableRow = memo(function NetworkMonitorTableRow({
|
||||
isSelected: boolean
|
||||
// Menus depend on the entire selection, including changes to other rows.
|
||||
rowSelection: RowSelectionState
|
||||
visibleColumnsKey: string
|
||||
openSheet: (monitor: NetworkMonitorRecord) => void
|
||||
}) {
|
||||
const system = useStore($allSystemsById)[row.original.system]
|
||||
return (
|
||||
<TableRow
|
||||
data-state={isSelected && "selected"}
|
||||
className="cursor-pointer transition-opacity"
|
||||
className={cn("cursor-pointer transition-opacity", {
|
||||
"opacity-50": system?.status === SystemStatus.Paused,
|
||||
})}
|
||||
onClick={() => openSheet(row.original)}
|
||||
>
|
||||
{row.getVisibleCells().map((cell) => (
|
||||
@@ -488,6 +634,36 @@ function NetworkMonitorSheet({
|
||||
return <NetworkMonitorSheetContent key={monitor.system} open={open} onOpenChange={onOpenChange} monitor={monitor} />
|
||||
}
|
||||
|
||||
const certExpiryTextColors = { ok: "", warning: "text-yellow-600 dark:text-yellow-500", critical: "text-red-500" }
|
||||
|
||||
function CertExpiry({ cert }: { cert: MonitorCertInfo }) {
|
||||
const daysLeft = getCertDaysLeft(cert)
|
||||
const expires = formatShortDate(new Date(cert.expires).toISOString())
|
||||
const level = getCertExpiryLevel(daysLeft)
|
||||
return (
|
||||
<>
|
||||
<Separator orientation="vertical" className="h-2.5 bg-muted-foreground opacity-70" />
|
||||
<ShieldCheckIcon className={cn("size-3.5 text-muted-foreground -me-1", certExpiryTextColors[level])} />
|
||||
<span className={certExpiryTextColors[level]}>
|
||||
{daysLeft < 0 ? (
|
||||
<Trans>Certificate expired {expires}</Trans>
|
||||
) : (
|
||||
<Trans>
|
||||
Certificate expires {expires}
|
||||
</Trans>
|
||||
)}
|
||||
</span>
|
||||
{cert.issuer && (
|
||||
<>
|
||||
<Separator orientation="vertical" className="h-2.5 bg-muted-foreground opacity-70" />
|
||||
<LandmarkIcon className="size-3.5 text-muted-foreground -me-0.5" />
|
||||
<span>{cert.issuer}</span>
|
||||
</>
|
||||
)}
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
function NetworkMonitorSheetContent({
|
||||
open,
|
||||
onOpenChange,
|
||||
@@ -499,7 +675,7 @@ function NetworkMonitorSheetContent({
|
||||
}) {
|
||||
// Keep monitor exploration independent of the system charts' time range.
|
||||
const [chartTimeStore] = useState(() => {
|
||||
const defaultTime = $userSettings.get().chartTime
|
||||
const defaultTime = getUserChartTime()
|
||||
return atom(defaultTime === "1m" ? "1h" : defaultTime)
|
||||
})
|
||||
const chartTime = useStore(chartTimeStore)
|
||||
@@ -535,7 +711,7 @@ function NetworkMonitorSheetContent({
|
||||
{system?.name ?? ""}
|
||||
</Link>
|
||||
<Separator orientation="vertical" className="h-2.5 bg-muted-foreground opacity-70" />
|
||||
<ArrowLeftRightIcon className="size-3.5 text-muted-foreground" />
|
||||
<ArrowLeftRightIcon className="size-3.5 text-muted-foreground -me-0.5" />
|
||||
{monitor.protocol.toUpperCase()}
|
||||
{monitor.protocol === "tcp" && monitor.port > 0 && (
|
||||
<>
|
||||
@@ -544,6 +720,7 @@ function NetworkMonitorSheetContent({
|
||||
<span>{monitor.port}</span>
|
||||
</>
|
||||
)}
|
||||
{monitor.certInfo?.expires ? <CertExpiry cert={monitor.certInfo} /> : null}
|
||||
</SheetDescription>
|
||||
</SheetHeader>
|
||||
<div className="grid gap-4">
|
||||
|
||||
@@ -12,7 +12,7 @@ import Slider from "@/components/ui/slider"
|
||||
import { HourFormat, Unit } from "@/lib/enums"
|
||||
import { dynamicActivate } from "@/lib/i18n"
|
||||
import languages from "@/lib/languages"
|
||||
import { $userSettings, defaultLayoutWidth } from "@/lib/stores"
|
||||
import { $chartTime, $userSettings, defaultLayoutWidth, getUserChartTime } from "@/lib/stores"
|
||||
import { chartTimeData, currentHour12 } from "@/lib/utils"
|
||||
import type { UserSettings } from "@/types"
|
||||
import { saveSettings } from "./layout"
|
||||
@@ -22,6 +22,9 @@ export default function SettingsProfilePage({ userSettings }: { userSettings: Us
|
||||
const { i18n } = useLingui()
|
||||
const currentUserSettings = useStore($userSettings)
|
||||
const layoutWidth = currentUserSettings.layoutWidth ?? defaultLayoutWidth
|
||||
// without a value the hidden select submits an empty string, which would persist
|
||||
// a chart time that no longer loads any data (#2104)
|
||||
const chartTime = getUserChartTime(userSettings)
|
||||
|
||||
async function handleSubmit(e: React.FormEvent<HTMLFormElement>) {
|
||||
e.preventDefault()
|
||||
@@ -29,6 +32,8 @@ export default function SettingsProfilePage({ userSettings }: { userSettings: Us
|
||||
const formData = new FormData(e.target as HTMLFormElement)
|
||||
const data = Object.fromEntries(formData) as Partial<UserSettings>
|
||||
await saveSettings(data)
|
||||
// apply the saved default time period to the active charts
|
||||
$chartTime.set(getUserChartTime())
|
||||
setIsLoading(false)
|
||||
}
|
||||
|
||||
@@ -122,7 +127,7 @@ export default function SettingsProfilePage({ userSettings }: { userSettings: Us
|
||||
<Label className="block" htmlFor="chartTime">
|
||||
<Trans>Default time period</Trans>
|
||||
</Label>
|
||||
<Select name="chartTime" key={userSettings.chartTime} defaultValue={userSettings.chartTime}>
|
||||
<Select name="chartTime" key={chartTime} defaultValue={chartTime}>
|
||||
<SelectTrigger id="chartTime">
|
||||
<SelectValue />
|
||||
</SelectTrigger>
|
||||
|
||||
@@ -211,7 +211,6 @@ export default memo(function SystemDetail({ id }: { id: string }) {
|
||||
<TemperatureChart {...coreProps} setPageBottomExtraMargin={setPageBottomExtraMargin} />
|
||||
<FanChart {...coreProps} />
|
||||
<BatteryChart system={system} {...coreProps} />
|
||||
<SwapChart chartData={chartData} grid={grid} dataEmpty={dataEmpty} systemStats={systemStats} />
|
||||
{pageBottomExtraMargin > 0 && <div style={{ marginBottom: pageBottomExtraMargin }}></div>}
|
||||
</div>
|
||||
</TabsContent>
|
||||
|
||||
@@ -27,6 +27,8 @@ type MonitorChartBaseProps = MonitorChartProps & {
|
||||
tickFormatter: (value: number) => string
|
||||
contentFormatter: ({ value }: { value: number | string }) => string | number
|
||||
domain?: [number | "auto", number | "auto"]
|
||||
/** Overrides the per-monitor line colors (e.g. a fixed color for single-monitor charts). */
|
||||
color?: string
|
||||
}
|
||||
|
||||
function MonitorChart({
|
||||
@@ -41,6 +43,7 @@ function MonitorChart({
|
||||
tickFormatter,
|
||||
contentFormatter,
|
||||
domain,
|
||||
color,
|
||||
showFilter = monitors.length > 1,
|
||||
}: MonitorChartBaseProps) {
|
||||
const storedFilter = useStore($monitorFilter)
|
||||
@@ -67,11 +70,12 @@ function MonitorChart({
|
||||
label,
|
||||
dataKey: (record: NetworkMonitorStatsRecord) => record.stats?.[p.id]?.[metric] ?? null,
|
||||
dot,
|
||||
color: count <= 5 ? i + 1 : `hsl(${(i * 360) / count}, var(--chart-saturation), var(--chart-lightness))`,
|
||||
color:
|
||||
color ?? (count <= 5 ? i + 1 : `hsl(${(i * 360) / count}, var(--chart-saturation), var(--chart-lightness))`),
|
||||
})
|
||||
}
|
||||
return { dataPoints: points, visibleKeys: visibleIDs }
|
||||
}, [monitors, filter, metric, chartData.chartTime])
|
||||
}, [monitors, filter, metric, chartData.chartTime, color])
|
||||
|
||||
const filteredMonitorStats = useMemo(() => {
|
||||
if (!visibleKeys.length) return monitorStats
|
||||
@@ -200,6 +204,7 @@ export function LossChart({ monitorStats, grid, monitors, chartData, empty, titl
|
||||
title={title}
|
||||
description={t`Packet loss (%)`}
|
||||
domain={[0, 100]}
|
||||
color="var(--destructive)"
|
||||
tickFormatter={(value) => `${toFixedFloat(value, value >= 10 ? 0 : 1)}%`}
|
||||
contentFormatter={({ value }) => {
|
||||
if (typeof value !== "number") {
|
||||
|
||||
@@ -14,6 +14,7 @@ import {
|
||||
$maxValues,
|
||||
$systems,
|
||||
$userSettings,
|
||||
getUserChartTime,
|
||||
} from "@/lib/stores"
|
||||
import { chartTimeData, listen, parseSemVer } from "@/lib/utils"
|
||||
import type {
|
||||
@@ -90,7 +91,7 @@ export function useSystemData(id: string) {
|
||||
useEffect(() => {
|
||||
return () => {
|
||||
if (!persistChartTime.current) {
|
||||
$chartTime.set($userSettings.get().chartTime)
|
||||
$chartTime.set(getUserChartTime())
|
||||
}
|
||||
persistChartTime.current = false
|
||||
setSystemStats([])
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/** biome-ignore-all lint/correctness/useHookAtTopLevel: Hooks live inside memoized column definitions */
|
||||
import { t } from "@lingui/core/macro"
|
||||
import { plural, t } from "@lingui/core/macro"
|
||||
import { Trans, useLingui } from "@lingui/react/macro"
|
||||
import { useStore } from "@nanostores/react"
|
||||
import { getPagePath } from "@nanostores/router"
|
||||
@@ -345,11 +345,13 @@ export function SystemsTableColumns(viewMode: "table" | "grid"): ColumnDef<Syste
|
||||
header: sortableHeader,
|
||||
hideSort: true,
|
||||
sortingFn: (a, b) => {
|
||||
// sort priorities: 1) failed services, 2) total services
|
||||
// sort priorities: 1) has failed services (dot color), 2) total services
|
||||
const [totalCountA, numFailedA] = a.original.info.sv ?? [0, 0]
|
||||
const [totalCountB, numFailedB] = b.original.info.sv ?? [0, 0]
|
||||
if (numFailedA !== numFailedB) {
|
||||
return numFailedA - numFailedB
|
||||
const hasFailedA = numFailedA > 0 ? 1 : 0
|
||||
const hasFailedB = numFailedB > 0 ? 1 : 0
|
||||
if (hasFailedA !== hasFailedB) {
|
||||
return hasFailedA - hasFailedB
|
||||
}
|
||||
return totalCountA - totalCountB
|
||||
},
|
||||
@@ -359,20 +361,36 @@ export function SystemsTableColumns(viewMode: "table" | "grid"): ColumnDef<Syste
|
||||
if (sys.status !== SystemStatus.Up || totalCount === 0) {
|
||||
return null
|
||||
}
|
||||
return (
|
||||
const content = (
|
||||
<span className="tabular-nums whitespace-nowrap flex gap-1.5 items-center">
|
||||
<span
|
||||
className={cn("block size-2 rounded-full", {
|
||||
[STATUS_COLORS[SystemStatus.Down]]: numFailed > 0,
|
||||
[STATUS_COLORS[SystemStatus.Up]]: numFailed === 0,
|
||||
[STATUS_COLORS.pending]: numFailed > 0,
|
||||
[STATUS_COLORS.up]: numFailed === 0,
|
||||
})}
|
||||
/>
|
||||
{totalCount}{" "}
|
||||
<span className="text-muted-foreground text-sm -ms-0.5">
|
||||
({t`Failed`.toLowerCase()}: {numFailed})
|
||||
</span>
|
||||
{plural(totalCount, { one: "# service", other: "# services" })}
|
||||
</span>
|
||||
)
|
||||
if (numFailed === 0) {
|
||||
return content
|
||||
}
|
||||
return (
|
||||
<Tooltip>
|
||||
<TooltipTrigger asChild>
|
||||
<Link
|
||||
href={getPagePath($router, "system", { id: sys.id })}
|
||||
tabIndex={-1}
|
||||
className="relative z-10 w-fit block"
|
||||
>
|
||||
{content}
|
||||
</Link>
|
||||
</TooltipTrigger>
|
||||
<TooltipContent>
|
||||
{plural(numFailed, { one: "# failed service", other: "# failed services" })}
|
||||
</TooltipContent>
|
||||
</Tooltip>
|
||||
)
|
||||
},
|
||||
},
|
||||
{
|
||||
|
||||
@@ -68,6 +68,7 @@
|
||||
|
||||
--breakpoint-xs: 26.6rem;
|
||||
--breakpoint-450: 28rem;
|
||||
--breakpoint-md-lg: 53rem;
|
||||
--breakpoint-2xl: 90rem;
|
||||
|
||||
--radius-sm: calc(var(--radius) - 4px);
|
||||
@@ -117,6 +118,7 @@
|
||||
}
|
||||
|
||||
@layer utilities {
|
||||
|
||||
/* Fonts */
|
||||
@supports (font-variation-settings: normal) {
|
||||
:root {
|
||||
@@ -147,11 +149,11 @@
|
||||
button {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
|
||||
/* cosmetic patch for half pixel gap in table headers when scrolling content shows at top */
|
||||
thead.sticky:before {
|
||||
content: "";
|
||||
@apply absolute -top-2 left-0 w-full h-4 bg-table-header z-50
|
||||
@apply absolute -top-2 left-0 w-full h-4 bg-table-header z-50
|
||||
}
|
||||
}
|
||||
|
||||
@@ -172,6 +174,7 @@
|
||||
@utility scrollbar-hide {
|
||||
-ms-overflow-style: none;
|
||||
scrollbar-width: none;
|
||||
|
||||
&::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
@@ -188,4 +191,4 @@
|
||||
|
||||
.recharts-yAxis {
|
||||
@apply tabular-nums;
|
||||
}
|
||||
}
|
||||
@@ -4,7 +4,7 @@ import { basePath } from "@/components/router"
|
||||
import { toast } from "@/components/ui/use-toast"
|
||||
import { dynamicActivate, getLocale } from "@/lib/i18n"
|
||||
import type { ChartTimes, UserSettings } from "@/types"
|
||||
import { $alerts, $allSystemsById, $allSystemsByName, $userSettings } from "./stores"
|
||||
import { $alerts, $allSystemsById, $allSystemsByName, $userSettings, hydrateUserSettings } from "./stores"
|
||||
import { chartTimeData, debounce } from "./utils"
|
||||
|
||||
/** PocketBase JS Client */
|
||||
@@ -90,7 +90,7 @@ export function queueUserSettings(newSettings: Partial<UserSettings>) {
|
||||
export async function updateUserSettings() {
|
||||
try {
|
||||
const req = await pb.collection("user_settings").getFirstListItem("", { fields: "settings" })
|
||||
$userSettings.set(req.settings)
|
||||
hydrateUserSettings(req.settings)
|
||||
dynamicActivate(req.settings.lang || getLocale())
|
||||
return
|
||||
} catch (e) {
|
||||
@@ -99,7 +99,7 @@ export async function updateUserSettings() {
|
||||
// create user settings if error fetching existing
|
||||
try {
|
||||
const createdSettings = await pb.collection("user_settings").create({ user: pb.authStore.record?.id })
|
||||
$userSettings.set(createdSettings.settings)
|
||||
hydrateUserSettings(createdSettings.settings)
|
||||
dynamicActivate(createdSettings.settings.lang || getLocale())
|
||||
} catch (e) {
|
||||
console.error("create settings", e)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import type { MonitorStats, NetworkMonitorRecord, RawMonitorStatsRecord } from "@/types"
|
||||
import type { MonitorCertInfo, MonitorStats, NetworkMonitorRecord, RawMonitorStatsRecord } from "@/types"
|
||||
|
||||
/** Derive chart metrics from the counts and response sum stored at every retention tier. */
|
||||
export function getMonitorStats(record: RawMonitorStatsRecord): MonitorStats {
|
||||
@@ -15,3 +15,15 @@ export function getMonitorTarget(monitor: Pick<NetworkMonitorRecord, "target" |
|
||||
const host = monitor.target.includes(":") && !monitor.target.startsWith("[") ? `[${monitor.target}]` : monitor.target
|
||||
return `${host}:${monitor.port}`
|
||||
}
|
||||
|
||||
/** Whole days until the certificate expires; negative once expired. */
|
||||
export function getCertDaysLeft(cert: Pick<MonitorCertInfo, "expires">, now = Date.now()) {
|
||||
return Math.floor((cert.expires - now) / 86_400_000)
|
||||
}
|
||||
|
||||
/** Expiry severity used for certificate colors. */
|
||||
export function getCertExpiryLevel(daysLeft: number): "ok" | "warning" | "critical" {
|
||||
if (daysLeft < 7) return "critical"
|
||||
if (daysLeft < 14) return "warning"
|
||||
return "ok"
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { atom, computed, listenKeys, map, type ReadableAtom } from "nanostores"
|
||||
import { atom, computed, map, type ReadableAtom } from "nanostores"
|
||||
import type { AlertMap, ChartTimes, SystemRecord, UpdateInfo, UserSettings } from "@/types"
|
||||
import { pb } from "./api"
|
||||
import { Unit } from "./enums"
|
||||
@@ -31,8 +31,11 @@ export const $publicKey = atom("")
|
||||
/** New version info if an update is available, otherwise undefined */
|
||||
export const $newVersion = atom<UpdateInfo | undefined>()
|
||||
|
||||
/** Chart time period used when user settings don't provide one */
|
||||
export const defaultChartTime: ChartTimes = "1h"
|
||||
|
||||
/** Chart time period */
|
||||
export const $chartTime = atom<ChartTimes>("1h")
|
||||
export const $chartTime = atom<ChartTimes>(defaultChartTime)
|
||||
|
||||
/** Whether to display average or max chart values */
|
||||
export const $maxValues = atom(false)
|
||||
@@ -50,13 +53,25 @@ export const $maxValues = atom(false)
|
||||
|
||||
/** User settings */
|
||||
export const $userSettings = map<UserSettings>({
|
||||
chartTime: "1h",
|
||||
chartTime: defaultChartTime,
|
||||
emails: [pb.authStore.record?.email || ""],
|
||||
unitNet: Unit.Bytes,
|
||||
unitTemp: Unit.Celsius,
|
||||
})
|
||||
// update chart time on change
|
||||
listenKeys($userSettings, ["chartTime"], ({ chartTime }) => $chartTime.set(chartTime))
|
||||
|
||||
/** Chart time period stored in user settings, or the default if it's missing */
|
||||
export function getUserChartTime(settings: UserSettings = $userSettings.get()): ChartTimes {
|
||||
return settings.chartTime || defaultChartTime
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply settings loaded from the database, including the default chart time.
|
||||
* Other settings writes don't touch $chartTime so they can't reset the active chart range.
|
||||
*/
|
||||
export function hydrateUserSettings(settings: UserSettings) {
|
||||
$userSettings.set(settings)
|
||||
$chartTime.set(getUserChartTime(settings))
|
||||
}
|
||||
|
||||
/** Container chart filter */
|
||||
export const $containerFilter = atom("")
|
||||
@@ -78,3 +93,8 @@ export const $direction = atom<"ltr" | "rtl">("ltr")
|
||||
|
||||
/** Longest system name string. Used to reserve width in virtualized tables. */
|
||||
export const $longestSystemName = atom("")
|
||||
|
||||
/** Incremented when measured text widths are invalidated (e.g. web font finished loading).
|
||||
* Anything that caches a comparison from isVisuallyLonger should recompute when this changes.
|
||||
*/
|
||||
export const $textMeasureVersion = atom(0)
|
||||
|
||||
@@ -7,6 +7,7 @@ import {
|
||||
$downSystems,
|
||||
$longestSystemName,
|
||||
$pausedSystems,
|
||||
$textMeasureVersion,
|
||||
$upSystems,
|
||||
} from "@/lib/stores"
|
||||
import { isVisuallyLonger, updateFavicon } from "@/lib/utils"
|
||||
@@ -67,6 +68,11 @@ export function init() {
|
||||
// run things that need to be done when systems change
|
||||
onSystemsChanged(newSystems, newSystem, oldSystem)
|
||||
})
|
||||
|
||||
// widths measured with the fallback font may rank names differently, so recompute once they're invalidated
|
||||
$textMeasureVersion.listen(() => {
|
||||
$longestSystemName.set(findLongestName($allSystemsById.get()))
|
||||
})
|
||||
}
|
||||
|
||||
/** Update the longest system name string and favicon based on system status */
|
||||
@@ -78,13 +84,7 @@ function onSystemsChanged(systems: Record<string, SystemRecord>, newSystem?: Sys
|
||||
// otherwise, if the changed system's new name is longer than the current longest, update it
|
||||
const longestName = $longestSystemName.get()
|
||||
if (oldSystem?.name === longestName && oldSystem.name !== newSystem?.name) {
|
||||
let newLongest = ""
|
||||
for (const id in systems) {
|
||||
if (isVisuallyLonger(systems[id].name, newLongest)) {
|
||||
newLongest = systems[id].name
|
||||
}
|
||||
}
|
||||
$longestSystemName.set(newLongest)
|
||||
$longestSystemName.set(findLongestName(systems))
|
||||
} else if (newSystem && newSystem.name !== longestName && isVisuallyLonger(newSystem.name, longestName)) {
|
||||
$longestSystemName.set(newSystem.name)
|
||||
}
|
||||
@@ -92,6 +92,17 @@ function onSystemsChanged(systems: Record<string, SystemRecord>, newSystem?: Sys
|
||||
updateFavicon(downSystems.length)
|
||||
}
|
||||
|
||||
/** Find the visually longest system name */
|
||||
function findLongestName(systems: Record<string, SystemRecord>): string {
|
||||
let longest = ""
|
||||
for (const id in systems) {
|
||||
if (isVisuallyLonger(systems[id].name, longest)) {
|
||||
longest = systems[id].name
|
||||
}
|
||||
}
|
||||
return longest
|
||||
}
|
||||
|
||||
/** Fetch systems from collection */
|
||||
async function fetchSystems(): Promise<SystemRecord[]> {
|
||||
try {
|
||||
|
||||
@@ -74,7 +74,7 @@ async function fetchMonitorStats(
|
||||
}
|
||||
|
||||
const NETWORK_MONITOR_FIELDS =
|
||||
"id,system,target,protocol,port,interval,res,resMin1h,resMax1h,resAvg1h,loss1h,enabled,updated"
|
||||
"id,system,target,protocol,port,interval,res,resMin1h,resMax1h,resAvg1h,loss1h,enabled,certInfo,updated"
|
||||
|
||||
interface UseNetworkMonitorsProps {
|
||||
systemId?: string
|
||||
|
||||
@@ -7,7 +7,7 @@ import { twMerge } from "tailwind-merge"
|
||||
import { toast } from "@/components/ui/use-toast"
|
||||
import type { ChartTimeData, FingerprintRecord, SemVer, SystemRecord } from "@/types"
|
||||
import { HourFormat, Unit } from "./enums"
|
||||
import { $copyContent, $userSettings } from "./stores"
|
||||
import { $copyContent, $textMeasureVersion, $userSettings } from "./stores"
|
||||
|
||||
export function cn(...inputs: ClassValue[]) {
|
||||
return twMerge(clsx(inputs))
|
||||
@@ -451,6 +451,45 @@ export function runOnce<T extends (...args: any[]) => any>(fn: T): T {
|
||||
|
||||
const visualWidthCache = new Map<string, number>()
|
||||
|
||||
let measureContext: CanvasRenderingContext2D | null | undefined
|
||||
let measureFont = ""
|
||||
|
||||
/** Canvas context for measuring text in the font the app renders with, or null where canvas is unavailable.
|
||||
* Only relative widths matter here, so the font size is arbitrary.
|
||||
*/
|
||||
function getMeasureContext(): CanvasRenderingContext2D | null {
|
||||
if (measureContext === undefined) {
|
||||
measureContext = document.createElement("canvas").getContext("2d")
|
||||
// the fallback font has different metrics, so re-measure whenever a font finishes loading.
|
||||
// loadingdone also covers fonts that start loading after the first measurement,
|
||||
// which fonts.ready does not if it has already resolved.
|
||||
if (measureContext && "fonts" in document) {
|
||||
document.fonts.addEventListener("loadingdone", invalidateVisualWidths)
|
||||
}
|
||||
}
|
||||
if (measureContext) {
|
||||
const { fontFamily, fontWeight } = getComputedStyle(document.body)
|
||||
const font = `${fontWeight} 16px ${fontFamily}`
|
||||
if (font !== measureFont) {
|
||||
const isFirstFont = !measureFont
|
||||
measureFont = font
|
||||
measureContext.font = font
|
||||
visualWidthCache.clear()
|
||||
// defer so stores aren't updated in the middle of a comparison or a render
|
||||
if (!isFirstFont) {
|
||||
queueMicrotask(invalidateVisualWidths)
|
||||
}
|
||||
}
|
||||
}
|
||||
return measureContext
|
||||
}
|
||||
|
||||
/** Drop cached widths and notify anything holding a result from isVisuallyLonger */
|
||||
function invalidateVisualWidths() {
|
||||
visualWidthCache.clear()
|
||||
$textMeasureVersion.set($textMeasureVersion.get() + 1)
|
||||
}
|
||||
|
||||
/** Get the visual width of a string, accounting for full-width and narrow punctuation characters.
|
||||
* Don't use for monospaced fonts, use .length instead
|
||||
*/
|
||||
@@ -459,6 +498,11 @@ function getVisualStringWidth(str: string): number {
|
||||
if (cached !== undefined) {
|
||||
return cached
|
||||
}
|
||||
const measured = getMeasureContext()?.measureText(str).width
|
||||
if (measured !== undefined) {
|
||||
visualWidthCache.set(str, measured)
|
||||
return measured
|
||||
}
|
||||
let width = 0
|
||||
for (const char of str) {
|
||||
if (char === ".") {
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: ar\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:22\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:29\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"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, one {{countString} ساعة} other {{countString} ساع
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} دقيقة} few {{countString} دقائق} many {{countString} دقيقة} other {{countString} دقيقة}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "{diskName} إدخال/إخراج"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# خيط} other {# خيط}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1 ساعة"
|
||||
@@ -123,10 +135,10 @@ msgstr "التنبيهات النشطة"
|
||||
msgid "Active state"
|
||||
msgstr "الحالة النشطة"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "الحالة النشطة"
|
||||
msgid "Add {foo}"
|
||||
msgstr "إضافة {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "إضافة النظام"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "إضافة رابط"
|
||||
@@ -260,6 +279,7 @@ msgstr "متوسط استغلال محركات GPU"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "متوسط زمن الاستجابة والأدنى والأقصى"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "متوسط 1h"
|
||||
@@ -383,6 +403,19 @@ msgstr "تحذير - فقدان محتمل للبيانات"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "درجة مئوية (°م)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "تغيير وحدات عرض المقاييس."
|
||||
@@ -776,12 +809,15 @@ msgstr "المدة"
|
||||
msgid "Edit"
|
||||
msgstr "تعديل"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "إضافة {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "إضافة النظام"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "سيتم حذف الأنظمة الحالية غير المعرفة في
|
||||
msgid "Exited active"
|
||||
msgstr "خرج نشطًا"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "ينتهي بعد ساعة واحدة أو عند إعادة تشغيل المحور."
|
||||
@@ -887,10 +927,6 @@ msgstr "تصدير تكوين الأنظمة الحالية الخاصة بك."
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "فهرنهايت (°ف)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "فشل"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "السمات الفاشلة:"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "يتوفر تحديث للصورة"
|
||||
msgid "Inactive"
|
||||
msgstr "غير نشط"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "الفقد"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "الفقد 1h"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "تعليمات الإعداد اليدوي"
|
||||
msgid "Max 1 min"
|
||||
msgstr "الحد الأقصى دقيقة"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "الأقصى 1h"
|
||||
@@ -1234,6 +1273,7 @@ msgstr "استخدام الذاكرة"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "استخدام الذاكرة للحاويات"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr "الأدنى 1h"
|
||||
@@ -1565,6 +1605,7 @@ msgstr "تم بدء العملية"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "البروتوكول"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "إعادة تعيين كلمة المرور"
|
||||
msgid "Resolved"
|
||||
msgstr "تم حلها"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "تفاصيل S.M.A.R.T."
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "اختبار S.M.A.R.T. الذاتي"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "حفظ {foo}"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "احفظ العنوان باستخدام مفتاح الإدخال أو
|
||||
msgid "Save Settings"
|
||||
msgstr "حفظ الإعدادات"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "حفظ النظام"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "محفوظ في قاعدة البيانات ولا ينتهي حتى تقوم بتعطيله."
|
||||
@@ -1833,6 +1878,7 @@ msgstr "تسجيل الدخول"
|
||||
msgid "SMTP settings"
|
||||
msgstr "إعدادات SMTP"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "الترتيب حسب"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "استخدام التبديل"
|
||||
msgid "Switch theme"
|
||||
msgstr "تبديل السمة"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "تبويبات"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "الهدف"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "المهام"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "تحديث"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "الاستخدام"
|
||||
msgid "Value"
|
||||
msgstr "القيمة"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "عرض"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "عرض المزيد"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "عرض أحدث 200 تنبيه."
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "الأعمدة الظاهرة"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "نعم"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "تم تحديث إعدادات المستخدم الخاصة بك."
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: bg\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:21\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:28\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Bulgarian\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, one {{countString} час} other {{countString} часа
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} минута} few {{countString} минути} many {{countString} минути} other {{countString} минути}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "В/И на {diskName}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# нишка} other {# нишки}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1 час"
|
||||
@@ -123,10 +135,10 @@ msgstr "Активни тревоги"
|
||||
msgid "Active state"
|
||||
msgstr "Активно състояние"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "Активно състояние"
|
||||
msgid "Add {foo}"
|
||||
msgstr "Добави {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "Добави Система"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "Добави URL"
|
||||
@@ -260,6 +279,7 @@ msgstr "Средно използване на GPU двигатели"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "Средно, минимално и максимално време за отговор"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "Средно 1h"
|
||||
@@ -383,6 +403,19 @@ msgstr "Внимание - възможност за загуба на данн
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "Целзий (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "Промяна на единиците за показване на метриките."
|
||||
@@ -776,12 +809,15 @@ msgstr "Продължителност"
|
||||
msgid "Edit"
|
||||
msgstr "Редактирай"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "Редактиране на {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "Редактиране на Система"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "Съществуващи системи които не са дефин
|
||||
msgid "Exited active"
|
||||
msgstr "Излезе активно"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "Изтича след един час или при рестартиране на хъба."
|
||||
@@ -887,10 +927,6 @@ msgstr "Експортирай конфигурацията на системи
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "Фаренхайт (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "Неуспешно"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "Неуспешни атрибути:"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "Налична актуализация на образа"
|
||||
msgid "Inactive"
|
||||
msgstr "Неактивен"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "Загуба"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "Загуба 1h"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "Инструкции за ръчна настройка"
|
||||
msgid "Max 1 min"
|
||||
msgstr "Максимум 1 минута"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "Макс. 1h"
|
||||
@@ -1234,6 +1273,7 @@ msgstr "Употреба на паметта"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "Използване на паметта от контейнерите"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr "Мин. 1h"
|
||||
@@ -1565,6 +1605,7 @@ msgstr "Процесът стартира"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "Протокол"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "Нулиране на парола"
|
||||
msgid "Resolved"
|
||||
msgstr "Решен"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "S.M.A.R.T. Детайли"
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "S.M.A.R.T. Самотест"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "Запази {foo}"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "Запази адреса с enter или запетая. Остави
|
||||
msgid "Save Settings"
|
||||
msgstr "Запази настройките"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "Запази Система"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "Запазен е в базата данни и не изтича, докато не го деактивирате."
|
||||
@@ -1833,6 +1878,7 @@ msgstr "Влез"
|
||||
msgid "SMTP settings"
|
||||
msgstr "Настройки за SMTP"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "Сортиране по"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "Използване на swap"
|
||||
msgid "Switch theme"
|
||||
msgstr "Смени темата"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "Табове"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "Цел"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "Задачи"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "Актуализирай"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "Натоварване"
|
||||
msgid "Value"
|
||||
msgstr "Стойност"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "Изглед"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "Виж повече"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "Прегледайте последните си 200 сигнала."
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "Видими полета"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "Да"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "Настройките за потребителя ти са обновени."
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: cs\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:21\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:28\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Czech\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, one {{countString} Hodina} few {{countString} Hodiny} ma
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} minuta} few {{countString} minuty} many {{countString} minut} other {{countString} minut}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "I/O {diskName}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# vlákno} few {# vlákna} many {# vláken} other {# vláken}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1 hodina"
|
||||
@@ -123,10 +135,10 @@ msgstr "Aktivní výstrahy"
|
||||
msgid "Active state"
|
||||
msgstr "Aktivní stav"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "Aktivní stav"
|
||||
msgid "Add {foo}"
|
||||
msgstr "Přidat {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "Přidat Systém"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "Přidat URL"
|
||||
@@ -260,6 +279,7 @@ msgstr "Průměrné využití GPU engine"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "Průměrná, minimální a maximální doba odezvy"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "Prům. 1h"
|
||||
@@ -383,6 +403,19 @@ msgstr "Upozornění - možná ztráta dat"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "Celsia (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "Změnit jednotky zobrazení metrik."
|
||||
@@ -776,12 +809,15 @@ msgstr "Doba trvání"
|
||||
msgid "Edit"
|
||||
msgstr "Upravit"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "Upravit {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "Upravit Systém"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "Stávající systémy, které nejsou definovány v <0>config.yml</0>, bu
|
||||
msgid "Exited active"
|
||||
msgstr "Ukončeno aktivně"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "Vyprší po jedné hodině nebo při restartu hubu."
|
||||
@@ -887,10 +927,6 @@ msgstr "Exportovat aktuální konfiguraci systémů."
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "Fahrenheita (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "Selhalo"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "Neúspěšné atributy:"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "K dispozici je aktualizace obrazu"
|
||||
msgid "Inactive"
|
||||
msgstr "Neaktivní"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "Ztráta"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "Ztráta 1h"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "Pokyny k manuálnímu nastavení"
|
||||
msgid "Max 1 min"
|
||||
msgstr "Max. 1 min"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "Max. 1h"
|
||||
@@ -1234,6 +1273,7 @@ msgstr "Využití paměti"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "Využití paměti kontejnery"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr "Min. 1h"
|
||||
@@ -1565,6 +1605,7 @@ msgstr "Proces spuštěn"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "Protokol"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "Obnovit heslo"
|
||||
msgid "Resolved"
|
||||
msgstr "Vyřešeno"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "S.M.A.R.T. Detaily"
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "S.M.A.R.T. Vlastní test"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "Uložit {foo}"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "Adresu uložte pomocí klávesy enter nebo čárky. Pro deaktivaci e-mai
|
||||
msgid "Save Settings"
|
||||
msgstr "Uložit nastavení"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "Uložit Systém"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "Uložen v databázi a nevyprší, dokud jej nezablokujete."
|
||||
@@ -1833,6 +1878,7 @@ msgstr "Přihlásit se"
|
||||
msgid "SMTP settings"
|
||||
msgstr "Nastavení SMTP"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "Seřadit podle"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "Swap využití"
|
||||
msgid "Switch theme"
|
||||
msgstr "Přepnout motiv"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "Karty"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "Cíl"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "Úlohy"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "Aktualizovat"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "Využití"
|
||||
msgid "Value"
|
||||
msgstr "Hodnota"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "Zobrazení"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "Zobrazit více"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "Zobrazit vašich 200 nejnovějších upozornění."
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "Viditelné sloupce"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "Ano"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "Vaše uživatelská nastavení byla aktualizována."
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: da\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:21\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:28\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Danish\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, one {{countString} time} other {{countString} timer}}"
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} minut} other {{countString} minutter}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "{diskName} I/O"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# tråd} other {# tråde}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1 time"
|
||||
@@ -123,10 +135,10 @@ msgstr "Aktive Alarmer"
|
||||
msgid "Active state"
|
||||
msgstr "Aktiv tilstand"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "Aktiv tilstand"
|
||||
msgid "Add {foo}"
|
||||
msgstr "Tilføj {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "Tilføj System"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "Tilføj URL"
|
||||
@@ -260,6 +279,7 @@ msgstr "Gennemsnitlig udnyttelse af GPU-enheder"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "Gennemsnitlig, minimum og maksimum svartid"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "Gns 1h"
|
||||
@@ -383,6 +403,19 @@ msgstr "Forsigtig - muligt tab af data"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "Celsius (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "Ændre viste enheder for målinger."
|
||||
@@ -776,12 +809,15 @@ msgstr "Varighed"
|
||||
msgid "Edit"
|
||||
msgstr "Rediger"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "Rediger {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "Rediger System"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "Eksisterende systemer ikke defineret i <0>config.yml</0> vil blive slett
|
||||
msgid "Exited active"
|
||||
msgstr "Afsluttet aktiv"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "Udløber efter en time eller ved hub-genstart."
|
||||
@@ -887,10 +927,6 @@ msgstr "Eksporter din nuværende systemkonfiguration."
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "Fahrenheit (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "Mislykkedes"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "Mislykkede attributter:"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "Imageopdatering tilgængelig"
|
||||
msgid "Inactive"
|
||||
msgstr "Inaktiv"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "Tab"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "Tab 1h"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "Manuel opsætningsvejledning"
|
||||
msgid "Max 1 min"
|
||||
msgstr "Maks. 1 min"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "Maks 1h"
|
||||
@@ -1234,6 +1273,7 @@ msgstr "Hukommelsesforbrug"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "Containeres hukommelsesforbrug"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr ""
|
||||
@@ -1565,6 +1605,7 @@ msgstr "Proces startet"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "Protokol"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "Nulstil adgangskode"
|
||||
msgid "Resolved"
|
||||
msgstr "Løst"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "S.M.A.R.T.-detaljer"
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "S.M.A.R.T. selvtest"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "Gem {foo}"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "Gem adresse ved hjælp af enter eller komma. Lad feltet stå tomt for at
|
||||
msgid "Save Settings"
|
||||
msgstr "Gem indstillinger"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "Gem System"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "Gemt i databasen og udløber ikke, før du deaktiverer det."
|
||||
@@ -1833,6 +1878,7 @@ msgstr "Log ind"
|
||||
msgid "SMTP settings"
|
||||
msgstr "SMTP-indstillinger"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "Sorter efter"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "Swap forbrug"
|
||||
msgid "Switch theme"
|
||||
msgstr "Skift tema"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "Faner"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "Mål"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "Opgaver"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "Opdater"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "Udnyttelse"
|
||||
msgid "Value"
|
||||
msgstr "Værdi"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "Vis"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "Se mere"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "Se dine 200 nyeste alarmer."
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "Synlige felter"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "Ja"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "Dine brugerindstillinger er opdateret."
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: de\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:22\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:29\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: German\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, one {{countString} Stunde} other {{countString} Stunden}
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} Minute} other {{countString} Minuten}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "{diskName} E/A"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# Thread} other {# Threads}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1 Stunde"
|
||||
@@ -123,10 +135,10 @@ msgstr "Aktive Warnungen"
|
||||
msgid "Active state"
|
||||
msgstr "Aktiver Zustand"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "Aktiver Zustand"
|
||||
msgid "Add {foo}"
|
||||
msgstr "{foo} hinzufügen"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "System hinzufügen"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "URL hinzufügen"
|
||||
@@ -260,6 +279,7 @@ msgstr "Durchschnittliche Auslastung der GPU-Engines"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "Durchschnittliche, minimale und maximale Antwortzeit"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "Ø 1h"
|
||||
@@ -383,6 +403,19 @@ msgstr "Vorsicht - potenzieller Datenverlust"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "Celsius (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "Anzeigeeinheiten der Werte ändern."
|
||||
@@ -776,12 +809,15 @@ msgstr "Dauer"
|
||||
msgid "Edit"
|
||||
msgstr "Bearbeiten"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "{foo} bearbeiten"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "System bearbeiten"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "Bestehende Systeme, die nicht in der <0>config.yml</0> definiert sind, w
|
||||
msgid "Exited active"
|
||||
msgstr "Beendet aktiv"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "Läuft nach einer Stunde oder bei Hub-Neustart ab."
|
||||
@@ -887,10 +927,6 @@ msgstr "Exportiere die aktuelle Systemkonfiguration."
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "Fahrenheit (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "Fehlgeschlagen"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "Fehlgeschlagene Attribute:"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "Image-Update verfügbar"
|
||||
msgid "Inactive"
|
||||
msgstr "Inaktiv"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "Verlust"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "Verlust 1h"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "Anleitung zur manuellen Einrichtung"
|
||||
msgid "Max 1 min"
|
||||
msgstr "Max 1 Min"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr ""
|
||||
@@ -1234,6 +1273,7 @@ msgstr "Arbeitsspeichernutzung"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "Speichernutzung der Container"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr ""
|
||||
@@ -1565,6 +1605,7 @@ msgstr "Prozess gestartet"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "Protokoll"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "Passwort zurücksetzen"
|
||||
msgid "Resolved"
|
||||
msgstr "Gelöst"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "S.M.A.R.T.-Details"
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "S.M.A.R.T.-Selbsttest"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "{foo} speichern"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "Adresse mit der Enter-Taste oder Komma speichern. Leer lassen, um E-Mail
|
||||
msgid "Save Settings"
|
||||
msgstr "Einstellungen speichern"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "System speichern"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "In der Datenbank gespeichert und läuft nicht ab, bis Sie es deaktivieren."
|
||||
@@ -1833,6 +1878,7 @@ msgstr "Anmelden"
|
||||
msgid "SMTP settings"
|
||||
msgstr "SMTP-Einstellungen"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "Sortieren nach"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "Swap-Nutzung"
|
||||
msgid "Switch theme"
|
||||
msgstr "Design wechseln"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "Tabs"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "Ziel"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "Aufgaben"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "Aktualisieren"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "Auslastung"
|
||||
msgid "Value"
|
||||
msgstr "Wert"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "Ansicht"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "Mehr anzeigen"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "Sieh dir die neusten 200 Alarme an."
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "Sichtbare Spalten"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "Ja"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "Deine Benutzereinstellungen wurden aktualisiert."
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: el\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:21\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:29\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Greek\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, one {{countString} ώρα} other {{countString} ώρες
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} λεπτό} other {{countString} λεπτά}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "I/O {diskName}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# thread} other {# threads}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1 ώρα"
|
||||
@@ -123,10 +135,10 @@ msgstr "Ενεργές ειδοποιήσεις"
|
||||
msgid "Active state"
|
||||
msgstr "Ενεργή κατάσταση"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "Ενεργή κατάσταση"
|
||||
msgid "Add {foo}"
|
||||
msgstr "Προσθήκη {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "Προσθήκη Σύστημα"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "Προσθήκη URL"
|
||||
@@ -260,6 +279,7 @@ msgstr "Μέση χρήση των μηχανών GPU"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "Μέσος, ελάχιστος και μέγιστος χρόνος απόκρισης"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "Μέσος όρος 1ώρου"
|
||||
@@ -383,6 +403,19 @@ msgstr "Προσοχή - πιθανή απώλεια δεδομένων"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "Κελσίου (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "Αλλάξτε τις μονάδες εμφάνισης των μετρήσεων."
|
||||
@@ -776,12 +809,15 @@ msgstr "Διάρκεια"
|
||||
msgid "Edit"
|
||||
msgstr "Επεξεργασία"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "Επεξεργασία {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "Επεξεργασία Σύστημα"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "Τα υπάρχοντα συστήματα που δεν ορίζοντ
|
||||
msgid "Exited active"
|
||||
msgstr "Ενεργό μετά την έξοδο"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "Λήγει μετά από μία ώρα ή με επανεκκίνηση του κόμβου."
|
||||
@@ -887,10 +927,6 @@ msgstr "Εξαγάγετε την τρέχουσα διαμόρφωση των
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "Φαρενάιτ (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "Απέτυχε"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "Αποτυχημένα χαρακτηριστικά:"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "Διατίθεται ενημέρωση εικόνας"
|
||||
msgid "Inactive"
|
||||
msgstr "Ανενεργό"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "Απώλεια"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "Απώλεια 1ώρου"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "Οδηγίες χειροκίνητης εγκατάστασης"
|
||||
msgid "Max 1 min"
|
||||
msgstr "Μέγ. 1 λ"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "Μέγιστο 1ώρου"
|
||||
@@ -1234,6 +1273,7 @@ msgstr "Χρήση μνήμης"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "Χρήση μνήμης των κοντέινερ"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr "Ελάχιστο 1ώρου"
|
||||
@@ -1565,6 +1605,7 @@ msgstr "Η διεργασία ξεκίνησε"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "Πρωτόκολλο"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "Επαναφορά κωδικού πρόσβασης"
|
||||
msgid "Resolved"
|
||||
msgstr "Επιλύθηκε"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "Λεπτομέρειες S.M.A.R.T."
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "Αυτοέλεγχος S.M.A.R.T."
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "Αποθήκευση {foo}"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "Αποθηκεύστε τη διεύθυνση με Enter ή κόμμα.
|
||||
msgid "Save Settings"
|
||||
msgstr "Αποθήκευση ρυθμίσεων"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "Αποθήκευση Σύστημα"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "Αποθηκεύεται στη βάση δεδομένων και δεν λήγει μέχρι να το απενεργοποιήσετε."
|
||||
@@ -1833,6 +1878,7 @@ msgstr "Σύνδεση"
|
||||
msgid "SMTP settings"
|
||||
msgstr "Ρυθμίσεις SMTP"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "Ταξινόμηση κατά"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "Χρήση swap"
|
||||
msgid "Switch theme"
|
||||
msgstr "Αλλαγή θέματος"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "Καρτέλες"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "Στόχος"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "Εργασίες"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "Ενημέρωση"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "Χρήση"
|
||||
msgid "Value"
|
||||
msgstr "Τιμή"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "Προβολή"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "Προβολή περισσότερων"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "Προβάλετε τις 200 πιο πρόσφατες ειδοποιήσεις σας."
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "Ορατά πεδία"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "Ναι"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "Οι ρυθμίσεις χρήστη σας ενημερώθηκαν."
|
||||
|
||||
|
||||
@@ -47,14 +47,26 @@ msgstr "{count, plural, one {{countString} hour} other {{countString} hours}}"
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr "{daysLeft, plural, one {# day} other {# days}}"
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "{diskName} I/O"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# thread} other {# threads}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr "{totalCount, plural, one {# service} other {# services}}"
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1 hour"
|
||||
@@ -118,10 +130,10 @@ msgstr "Active Alerts"
|
||||
msgid "Active state"
|
||||
msgstr "Active state"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr "Add"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -131,6 +143,13 @@ msgstr "Active state"
|
||||
msgid "Add {foo}"
|
||||
msgstr "Add {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "Add System"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "Add URL"
|
||||
@@ -255,6 +274,7 @@ msgstr "Average utilization of GPU engines"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "Average, minimum, and maximum response time"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "Avg 1h"
|
||||
@@ -378,6 +398,19 @@ msgstr "Caution - potential data loss"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "Celsius (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr "Certificate"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr "Certificate expired {expires}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr "Certificate expires {expires}"
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "Change display units for metrics."
|
||||
@@ -771,12 +804,15 @@ msgstr "Duration"
|
||||
msgid "Edit"
|
||||
msgstr "Edit"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "Edit {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "Edit System"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -862,6 +898,10 @@ msgstr "Existing systems not defined in <0>config.yml</0> will be deleted. Pleas
|
||||
msgid "Exited active"
|
||||
msgstr "Exited active"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr "Expired"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "Expires after one hour or on hub restart."
|
||||
@@ -882,10 +922,6 @@ msgstr "Export your current systems configuration."
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "Fahrenheit (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "Failed"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "Failed Attributes:"
|
||||
@@ -1085,6 +1121,7 @@ msgstr "Image update available"
|
||||
msgid "Inactive"
|
||||
msgstr "Inactive"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1177,6 +1214,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "Loss"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "Loss 1h"
|
||||
@@ -1199,6 +1237,7 @@ msgstr "Manual setup instructions"
|
||||
msgid "Max 1 min"
|
||||
msgstr "Max 1 min"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "Max 1h"
|
||||
@@ -1229,6 +1268,7 @@ msgstr "Memory Usage"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "Memory usage of containers"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr "Min 1h"
|
||||
@@ -1560,6 +1600,7 @@ msgstr "Process started"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "Protocol"
|
||||
|
||||
@@ -1648,6 +1689,7 @@ msgstr "Reset Password"
|
||||
msgid "Resolved"
|
||||
msgstr "Resolved"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1693,7 +1735,6 @@ msgstr "S.M.A.R.T. Details"
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "S.M.A.R.T. Self-Test"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "Save {foo}"
|
||||
@@ -1707,6 +1748,10 @@ msgstr "Save address using enter key or comma. Leave blank to disable email noti
|
||||
msgid "Save Settings"
|
||||
msgstr "Save Settings"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "Save System"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "Saved in the database and does not expire until you disable it."
|
||||
@@ -1828,6 +1873,7 @@ msgstr "Sign in"
|
||||
msgid "SMTP settings"
|
||||
msgstr "SMTP settings"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "Sort By"
|
||||
@@ -1870,12 +1916,11 @@ msgstr "Swap Usage"
|
||||
msgid "Switch theme"
|
||||
msgstr "Switch theme"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1920,9 +1965,15 @@ msgstr "Tabs"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "Target"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr "target[,protocol[,port[,interval]]]"
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "Tasks"
|
||||
@@ -2157,6 +2208,7 @@ msgstr "Update"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2212,6 +2264,7 @@ msgstr "Utilization"
|
||||
msgid "Value"
|
||||
msgstr "Value"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "View"
|
||||
@@ -2226,6 +2279,7 @@ msgstr "View more"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "View your 200 most recent alerts."
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "Visible Fields"
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: es\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:21\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:28\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Spanish\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, one {{countString} hora} other {{countString} horas}}"
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} minuto} other {{countString} minutos}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "E/S de {diskName}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# hilo} other {# hilos}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1 hora"
|
||||
@@ -123,10 +135,10 @@ msgstr "Alertas activas"
|
||||
msgid "Active state"
|
||||
msgstr "Estado activo"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "Estado activo"
|
||||
msgid "Add {foo}"
|
||||
msgstr "Agregar {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "Agregar Sistema"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "Agregar URL"
|
||||
@@ -260,6 +279,7 @@ msgstr "Utilización promedio de motores GPU"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "Tiempo de respuesta medio, mínimo y máximo"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "Prom. 1 h"
|
||||
@@ -383,6 +403,19 @@ msgstr "Precaución - posible pérdida de datos"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "Celsius (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "Cambiar las unidades de visualización de las métricas."
|
||||
@@ -776,12 +809,15 @@ msgstr "Duración"
|
||||
msgid "Edit"
|
||||
msgstr "Editar"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "Editar {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "Editar Sistema"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "Los sistemas existentes no definidos en <0>config.yml</0> serán elimina
|
||||
msgid "Exited active"
|
||||
msgstr "Salió activo"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "Expira después de una hora o al reiniciar el hub."
|
||||
@@ -887,10 +927,6 @@ msgstr "Exporta la configuración actual de sus sistemas."
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "Fahrenheit (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "Fallido"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "Atributos fallidos:"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "Actualización de imagen disponible"
|
||||
msgid "Inactive"
|
||||
msgstr "Inactivo"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "Pérdida"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "Pérdida 1 h"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "Instrucciones manuales de configuración"
|
||||
msgid "Max 1 min"
|
||||
msgstr "Máx. 1 min"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "Máx. 1 h"
|
||||
@@ -1234,6 +1273,7 @@ msgstr "Uso de memoria"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "Uso de memoria de los contenedores"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr "Mín. 1 h"
|
||||
@@ -1565,6 +1605,7 @@ msgstr "Proceso iniciado"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "Protocolo"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "Restablecer contraseña"
|
||||
msgid "Resolved"
|
||||
msgstr "Resuelto"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "Detalles S.M.A.R.T."
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "Autoprueba S.M.A.R.T."
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "Guardar {foo}"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "Guarda la dirección usando la tecla enter o coma. Deja en blanco para d
|
||||
msgid "Save Settings"
|
||||
msgstr "Guardar configuración"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "Guardar Sistema"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "Guardado en la base de datos y no expira hasta que lo desactives."
|
||||
@@ -1833,6 +1878,7 @@ msgstr "Iniciar sesión"
|
||||
msgid "SMTP settings"
|
||||
msgstr "Configuración SMTP"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "Ordenar por"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "Uso de swap"
|
||||
msgid "Switch theme"
|
||||
msgstr "Cambiar tema"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "Pestañas"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "Objetivo"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "Tareas"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "Actualizar"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "Utilización"
|
||||
msgid "Value"
|
||||
msgstr "Valor"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "Vista"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "Ver más"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "Ver tus 200 alertas más recientes."
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "Columnas visibles"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "Sí"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "Tu configuración de usuario ha sido actualizada."
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: fa\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:22\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:29\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Persian\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, one {{countString} ساعت} other {{countString} ساع
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} دقیقه} few {{countString} دقیقه} many {{countString} دقیقه} other {{countString} دقیقه}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "ورودی/خروجی {diskName}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# رشته} other {# رشته}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "۱ ساعت"
|
||||
@@ -123,10 +135,10 @@ msgstr " هشدارهای فعال"
|
||||
msgid "Active state"
|
||||
msgstr "وضعیت فعال"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "وضعیت فعال"
|
||||
msgid "Add {foo}"
|
||||
msgstr "افزودن {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "افزودن سیستم"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "افزودن آدرس اینترنتی"
|
||||
@@ -260,6 +279,7 @@ msgstr "میانگین استفاده از موتورهای GPU"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "میانگین، حداقل و حداکثر زمان پاسخ"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "میانگین ۱ ساعت"
|
||||
@@ -383,6 +403,19 @@ msgstr "احتیاط - احتمال از دست رفتن دادهها"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "سلسیوس (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "تغییر واحدهای نمایش برای معیارها."
|
||||
@@ -776,12 +809,15 @@ msgstr "مدت زمان"
|
||||
msgid "Edit"
|
||||
msgstr "ویرایش"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "ویرایش {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "ویرایش سیستم"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "سیستمهای موجود که در <0>config.yml</0> تعریف ن
|
||||
msgid "Exited active"
|
||||
msgstr "خروج فعال"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "پس از یک ساعت یا راهاندازی مجدد هاب منقضی میشود."
|
||||
@@ -887,10 +927,6 @@ msgstr "پیکربندی سیستمهای فعلی خود را خارج کن
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "فارنهایت (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "ناموفق"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "ویژگیهای ناموفق:"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "بهروزرسانی image موجود است"
|
||||
msgid "Inactive"
|
||||
msgstr "غیرفعال"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "افت"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "افت ۱ ساعت"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "دستورالعملهای راهاندازی دستی"
|
||||
msgid "Max 1 min"
|
||||
msgstr "حداکثر ۱ دقیقه"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "حداکثر ۱ ساعت"
|
||||
@@ -1234,6 +1273,7 @@ msgstr "میزان استفاده از حافظه"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "میزان استفاده حافظه کانتینرها"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr "حداقل ۱ ساعت"
|
||||
@@ -1565,6 +1605,7 @@ msgstr "فرآیند شروع شد"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "پروتکل"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "بازنشانی رمز عبور"
|
||||
msgid "Resolved"
|
||||
msgstr "حل شده"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "جزئیات S.M.A.R.T"
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "تست خود S.M.A.R.T"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "ذخیره {foo}"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "آدرس را با استفاده از کلید Enter یا کاما ذخ
|
||||
msgid "Save Settings"
|
||||
msgstr "ذخیره تنظیمات"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "ذخیره سیستم"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "در پایگاه داده ذخیره شده و تا زمانی که آن را غیرفعال نکنید، منقضی نمیشود."
|
||||
@@ -1833,6 +1878,7 @@ msgstr "ورود"
|
||||
msgid "SMTP settings"
|
||||
msgstr "تنظیمات SMTP"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "مرتبسازی بر اساس"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "میزان استفاده از Swap"
|
||||
msgid "Switch theme"
|
||||
msgstr "تغییر تم"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "تبها"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "هدف"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "وظایف"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "بهروزرسانی"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "بهرهوری"
|
||||
msgid "Value"
|
||||
msgstr "مقدار"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "مشاهده"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "مشاهده بیشتر"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "۲۰۰ هشدار اخیر خود را مشاهده کنید."
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "فیلدهای قابل مشاهده"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "بله"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "تنظیمات کاربری شما بهروزرسانی شد."
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: fr\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:21\n"
|
||||
"PO-Revision-Date: 2026-09-25 14:03\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: French\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, one {{countString} heure} other {{countString} heures}}"
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} minute} other {{countString} minutes}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr "{daysLeft, plural, one {# jour} other {# jours}}"
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "E/S {diskName}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr "{numFailed, plural, one {# service en échec} other {# services en échec}}"
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# thread} other {# threads}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr "{totalCount, plural, one {# service} other {# services}}"
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1 heure"
|
||||
@@ -123,10 +135,10 @@ msgstr "Alertes actives"
|
||||
msgid "Active state"
|
||||
msgstr "État actif"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr "Ajouter"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "État actif"
|
||||
msgid "Add {foo}"
|
||||
msgstr "Ajouter {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "Ajouter Système"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "Ajouter l’URL"
|
||||
@@ -260,6 +279,7 @@ msgstr "Utilisation moyenne des moteurs GPU"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "Temps de réponse moyen, minimal et maximal"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "Moy. 1 h"
|
||||
@@ -383,6 +403,19 @@ msgstr "Attention - perte de données potentielle"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "Celsius (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr "Certificat"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr "Certificat expiré {expires}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr "Le certificat expire le {expires}"
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "Ajuster les unités d'affichage pour les métriques."
|
||||
@@ -776,12 +809,15 @@ msgstr "Durée"
|
||||
msgid "Edit"
|
||||
msgstr "Éditer"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "Modifier {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "Modifier Système"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "Les systèmes existants non définis dans <0>config.yml</0> seront suppr
|
||||
msgid "Exited active"
|
||||
msgstr "Sorti actif"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr "Expiré"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "Expire après une heure ou au redémarrage du hub."
|
||||
@@ -887,10 +927,6 @@ msgstr "Exportez la configuration actuelle de vos systèmes."
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "Fahrenheit (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "Échoué"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "Attributs défaillants :"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "Mise à jour de l’image disponible"
|
||||
msgid "Inactive"
|
||||
msgstr "Inactif"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "Perte"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "Perte 1 h"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "Guide pour une installation manuelle"
|
||||
msgid "Max 1 min"
|
||||
msgstr "Max 1 min"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "Max. 1 h"
|
||||
@@ -1234,6 +1273,7 @@ msgstr "Utilisation de la mémoire"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "Utilisation de la mémoire des conteneurs"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr "Min. 1 h"
|
||||
@@ -1565,6 +1605,7 @@ msgstr "Processus démarré"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "Protocole"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "Réinitialiser le mot de passe"
|
||||
msgid "Resolved"
|
||||
msgstr "Résolu"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "Détails S.M.A.R.T."
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "Auto-test S.M.A.R.T."
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "Enregistrer {foo}"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "Enregistrez l'adresse en utilisant la touche Entrée ou la virgule. Lais
|
||||
msgid "Save Settings"
|
||||
msgstr "Enregistrer les paramètres"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "Enregistrer Système"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "Enregistré dans la base de données et n'expire pas tant que vous ne le désactivez pas."
|
||||
@@ -1833,6 +1878,7 @@ msgstr "Se connecter"
|
||||
msgid "SMTP settings"
|
||||
msgstr "Paramètres SMTP"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "Trier par"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "Utilisation du swap"
|
||||
msgid "Switch theme"
|
||||
msgstr "Changer de thème"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "Onglets"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "Cible"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "Tâches"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "Mettre à jour"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "Utilisation"
|
||||
msgid "Value"
|
||||
msgstr "Valeur"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "Vue"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "Voir plus"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "Voir vos 200 dernières alertes."
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "Colonnes visibles"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "Oui"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "Vos paramètres utilisateur ont été mis à jour."
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: he\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:21\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:29\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Hebrew\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n==2 ? 1 : 2);\n"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, one {{countString} שעה} two {{countString} שעות}
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} דקה} two {{countString} דקות} other {{countString} דקות}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "קלט/פלט של {diskName}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# תהליכון} other {# תהליכונים}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "שעה"
|
||||
@@ -123,10 +135,10 @@ msgstr "התראות פעילות"
|
||||
msgid "Active state"
|
||||
msgstr "מצב פעיל"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "מצב פעיל"
|
||||
msgid "Add {foo}"
|
||||
msgstr "הוסף {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "הוסף מערכת"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "הוסף URL"
|
||||
@@ -260,6 +279,7 @@ msgstr "ניצול ממוצע של מנועי GPU"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "זמן תגובה ממוצע, מינימלי ומקסימלי"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "ממוצע שעה אחת"
|
||||
@@ -383,6 +403,19 @@ msgstr "זהירות - אפשרות לאובדן נתונים"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "צלזיוס (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "שנה יחידות תצוגה עבור מדדים."
|
||||
@@ -776,12 +809,15 @@ msgstr "משך זמן"
|
||||
msgid "Edit"
|
||||
msgstr "ערוך"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "ערוך {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "ערוך מערכת"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "מערכות קיימות שלא מוגדרות ב-<0>config.yml</0> י
|
||||
msgid "Exited active"
|
||||
msgstr "יצא פעיל"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "התוקף פג לאחר שעה או לאחר הפעלת ה־hub מחדש."
|
||||
@@ -887,10 +927,6 @@ msgstr "ייצא את תצורת המערכות הנוכחית שלך."
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "פרנהייט (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "נכשל"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "מאפיינים שנכשלו:"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "עדכון תמונה זמין"
|
||||
msgid "Inactive"
|
||||
msgstr "לא פעיל"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "אובדן"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "אובדן שעה אחת"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "הוראות התקנה ידניות"
|
||||
msgid "Max 1 min"
|
||||
msgstr "מקס 1 דק'"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "מקסימום שעה אחת"
|
||||
@@ -1234,6 +1273,7 @@ msgstr "שימוש בזיכרון"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "שימוש בזיכרון של קונטיינרים"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr "מינימום שעה אחת"
|
||||
@@ -1565,6 +1605,7 @@ msgstr "תהליך התחיל"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "פרוטוקול"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "איפוס סיסמה"
|
||||
msgid "Resolved"
|
||||
msgstr "נפתר"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "פרטי S.M.A.R.T."
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "בדיקה עצמית S.M.A.R.T."
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "שמור {foo}"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "שמור כתובת באמצעות מקש enter או פסיק. השאר
|
||||
msgid "Save Settings"
|
||||
msgstr "שמור הגדרות"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "שמור מערכת"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "נשמר במסד הנתונים ולא פג תוקף עד שתבטל אותו."
|
||||
@@ -1833,6 +1878,7 @@ msgstr "התחבר"
|
||||
msgid "SMTP settings"
|
||||
msgstr "הגדרות SMTP"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "מיין לפי"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "שימוש ב-Swap"
|
||||
msgid "Switch theme"
|
||||
msgstr "החלף ערכת נושא"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "לשוניות"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "יעד"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "משימות"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "עדכן"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "ניצולת"
|
||||
msgid "Value"
|
||||
msgstr "ערך"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "צפה"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "צפה בעוד"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "צפה ב-200 ההתראות האחרונות שלך."
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "שדות גלויים"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "כן"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "הגדרות המשתמש שלך עודכנו."
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: hr\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:22\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:29\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Croatian\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, one {{countString} sat} other {{countString} sati}}"
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} minuta} few {{countString} minuta} many {{countString} minuta} other {{countString} minute}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "I/O za {diskName}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# nit} few {# niti} other {# niti}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1 sat"
|
||||
@@ -123,10 +135,10 @@ msgstr "Aktivna Upozorenja"
|
||||
msgid "Active state"
|
||||
msgstr "Aktivno stanje"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "Aktivno stanje"
|
||||
msgid "Add {foo}"
|
||||
msgstr "Dodaj {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "Dodaj Sustav"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "Dodaj URL"
|
||||
@@ -260,6 +279,7 @@ msgstr "Prosječna iskorištenost grafičkih procesora"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "Prosječno, minimalno i maksimalno vrijeme odziva"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "Prosjek 1 h"
|
||||
@@ -383,6 +403,19 @@ msgstr "Oprez - mogući gubitak podataka"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "Celsius (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "Promijenite mjerene jedinice korištene za prikazivanje podataka."
|
||||
@@ -776,12 +809,15 @@ msgstr "Trajanje"
|
||||
msgid "Edit"
|
||||
msgstr "Uredi"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "Uredi {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "Uredi Sustav"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "Postojeći sustavi koji nisu definirani u <0>config.yml</0> datoteci bit
|
||||
msgid "Exited active"
|
||||
msgstr "Izašlo aktivno"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "Istječe nakon jednog sata ili ponovnog pokretanja huba."
|
||||
@@ -887,10 +927,6 @@ msgstr "Izvoz trenutne sistemske konfiguracije."
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "Farenhajt (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "Neuspješno"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "Neuspjeli atributi:"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "Dostupno je ažuriranje slike"
|
||||
msgid "Inactive"
|
||||
msgstr "Neaktivno"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "Gubitak"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "Gubitak 1 h"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "Upute za ručno postavljanje"
|
||||
msgid "Max 1 min"
|
||||
msgstr "Maksimalno 1 minuta"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "Maks. 1 h"
|
||||
@@ -1234,6 +1273,7 @@ msgstr "Iskorištenost memorije"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "Upotreba memorije spremnika"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr "Min. 1 h"
|
||||
@@ -1565,6 +1605,7 @@ msgstr "Proces pokrenut"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "Protokol"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "Resetiraj Lozinku"
|
||||
msgid "Resolved"
|
||||
msgstr "Razrješeno"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "S.M.A.R.T. Detalji"
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "S.M.A.R.T. Samotestiranje"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "Spremi {foo}"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "Spremite adresu pomoću tipke enter ili zarez. Ostavite prazno kako bist
|
||||
msgid "Save Settings"
|
||||
msgstr "Spremi Postavke"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "Spremi Sustav"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "Spremljeno u bazi podataka i ne istječe dok ga ne onemogućite."
|
||||
@@ -1833,6 +1878,7 @@ msgstr "Prijava"
|
||||
msgid "SMTP settings"
|
||||
msgstr "SMTP postavke"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "Sortiraj po"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "Swap Iskorištenost"
|
||||
msgid "Switch theme"
|
||||
msgstr "Promijeni temu"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "Kartice"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "Cilj"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "Zadaci"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "Ažuriraj"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "Iskorištenost"
|
||||
msgid "Value"
|
||||
msgstr "Vrijednost"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "Prikaz"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "Prikaži više"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "Pogledajte posljednjih 200 upozorenja."
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "Vidljiva polja"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "Da"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "Vaše korisničke postavke su ažurirane."
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: hu\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:21\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:29\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Hungarian\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, one {{countString} óra} other {{countString} óra}}"
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} perc} few {{countString} perc} many {{countString} perc} other {{countString} perc}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "{diskName} I/O"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# szál} other {# szál}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1 óra"
|
||||
@@ -123,10 +135,10 @@ msgstr "Aktív riasztások"
|
||||
msgid "Active state"
|
||||
msgstr "Aktív állapot"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "Aktív állapot"
|
||||
msgid "Add {foo}"
|
||||
msgstr "Hozzáadás {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "Hozzáadás Rendszer"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "URL hozzáadása"
|
||||
@@ -260,6 +279,7 @@ msgstr "GPU-k átlagos kihasználtsága"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "Átlagos, minimális és maximális válaszidő"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "Átl. 1 óra"
|
||||
@@ -383,6 +403,19 @@ msgstr "Figyelem - potenciális adatvesztés"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "Celsius (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "A mértékegységek megjelenítésének megváltoztatása."
|
||||
@@ -776,12 +809,15 @@ msgstr "Időtartam"
|
||||
msgid "Edit"
|
||||
msgstr "Szerkesztés"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "Szerkesztés {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "Szerkesztés Rendszer"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "A <0>config.yml</0> fájlban nem definiált meglévő rendszerek törlé
|
||||
msgid "Exited active"
|
||||
msgstr "Aktívként kilépett"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "Lejár egy óra után vagy a hub újraindításakor."
|
||||
@@ -887,10 +927,6 @@ msgstr "Exportálja a jelenlegi rendszerkonfigurációt."
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "Fahrenheit (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "Sikertelen"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "Sikertelen attribútumok:"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "Képfrissítés érhető el"
|
||||
msgid "Inactive"
|
||||
msgstr "Inaktív"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "Veszteség"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "Veszteség 1 óra"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "Manuális beállítási lépések"
|
||||
msgid "Max 1 min"
|
||||
msgstr "Maximum 1 perc"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "Max. 1 óra"
|
||||
@@ -1234,6 +1273,7 @@ msgstr "Memóriahasználat"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "Konténerek memóriahasználata"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr "Min. 1 óra"
|
||||
@@ -1565,6 +1605,7 @@ msgstr "Folyamat elindítva"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "Protokoll"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "Jelszó visszaállítása"
|
||||
msgid "Resolved"
|
||||
msgstr "Megoldva"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "S.M.A.R.T. Részletek"
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "S.M.A.R.T. Önteszt"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "{foo} mentése"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "Mentse el a címet az Enter billentyű vagy a vessző használatával. H
|
||||
msgid "Save Settings"
|
||||
msgstr "Beállítások mentése"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "Rendszer mentése"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "Elmentve az adatbázisban és nem jár le, amíg ki nem kapcsolod."
|
||||
@@ -1833,6 +1878,7 @@ msgstr "Bejelentkezés"
|
||||
msgid "SMTP settings"
|
||||
msgstr "SMTP beállítások"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "Rendezés"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "Swap használat"
|
||||
msgid "Switch theme"
|
||||
msgstr "Téma váltása"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "Lapok"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "Cél"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "Feladatok"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "Frissítés"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "Kihasználtság"
|
||||
msgid "Value"
|
||||
msgstr "Érték"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "Nézet"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "Továbbiak megjelenítése"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "Legfrissebb 200 riasztásod áttekintése."
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "Látható mezők"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "Igen"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "A felhasználói beállítások frissítésre kerültek."
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: id\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:22\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:29\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Indonesian\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, one {{countString} jam} other {{countString} jam}}"
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} menit} few {{countString} menit} many {{countString} menit} other {{countString} menit}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "I/O {diskName}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# thread} other {# thread}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1 jam"
|
||||
@@ -123,10 +135,10 @@ msgstr "Peringatan Aktif"
|
||||
msgid "Active state"
|
||||
msgstr "Status aktif"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "Status aktif"
|
||||
msgid "Add {foo}"
|
||||
msgstr "Tambah {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "Tambah Sistem"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "Tambah URL"
|
||||
@@ -260,6 +279,7 @@ msgstr "Rata-rata utilisasi GPU"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "Waktu respons rata-rata, minimum, dan maksimum"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "Rata-rata 1 jam"
|
||||
@@ -383,6 +403,19 @@ msgstr "Perhatian - potensi kehilangan data"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "Celsius (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "Ubah tampilan satuan untuk metrik."
|
||||
@@ -776,12 +809,15 @@ msgstr "Durasi"
|
||||
msgid "Edit"
|
||||
msgstr "Ubah"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "Ubah {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "Ubah Sistem"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "Sistem yang ada yang tidak didefinisikan dalam <0>config.yml</0> akan di
|
||||
msgid "Exited active"
|
||||
msgstr "Keluar aktif"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "Kedaluwarsa setelah satu jam atau saat restart hub."
|
||||
@@ -887,10 +927,6 @@ msgstr "Export konfigurasi sistem anda saat ini."
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "Fahrenheit (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "Gagal"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "Atribut yang Gagal:"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "Pembaruan gambar tersedia"
|
||||
msgid "Inactive"
|
||||
msgstr "Tidak aktif"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "Kehilangan paket"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "Kehilangan paket 1 jam"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "Instruksi setup manual"
|
||||
msgid "Max 1 min"
|
||||
msgstr "Maks 1 mnt"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "Maks. 1 jam"
|
||||
@@ -1234,6 +1273,7 @@ msgstr "Penggunaan Memori"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "Penggunaan memori container"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr "Min. 1 jam"
|
||||
@@ -1565,6 +1605,7 @@ msgstr "Proses dimulai"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "Protokol"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "Reset Kata Sandi"
|
||||
msgid "Resolved"
|
||||
msgstr "Diselesaikan"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "Detail S.M.A.R.T."
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "Self-Test S.M.A.R.T."
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "Simpan {foo}"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "Simpan alamat menggunakan tombol enter atau koma. Biarkan kosong untuk m
|
||||
msgid "Save Settings"
|
||||
msgstr "Simpan Pengaturan"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "Simpan Sistem"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "Disimpan di database dan tidak kedaluwarsa sampai Anda menonaktifkannya."
|
||||
@@ -1833,6 +1878,7 @@ msgstr "Masuk"
|
||||
msgid "SMTP settings"
|
||||
msgstr "Pengaturan SMTP"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "Urutkan Berdasarkan"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "Penggunaan Swap"
|
||||
msgid "Switch theme"
|
||||
msgstr "Ganti tema"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "Tab"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "Target"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "Tugas"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "Perbarui"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "Utilisasi"
|
||||
msgid "Value"
|
||||
msgstr "Nilai"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "Lihat"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "Lihat lebih banyak"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "Lihat 200 peringatan terbaru anda."
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "Metrik yang Terlihat"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "Ya"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "Pengaturan pengguna anda telah diperbarui."
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: it\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:21\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:29\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Italian\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, one {{countString} ora} other {{countString} ore}}"
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} minuto} other {{countString} minuti}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "I/O di {diskName}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# thread} other {# thread}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1 ora"
|
||||
@@ -123,10 +135,10 @@ msgstr "Avvisi Attivi"
|
||||
msgid "Active state"
|
||||
msgstr "Stato attivo"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "Stato attivo"
|
||||
msgid "Add {foo}"
|
||||
msgstr "Aggiungi {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "Aggiungi Sistema"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "Aggiungi URL"
|
||||
@@ -260,6 +279,7 @@ msgstr "Utilizzo medio dei motori GPU"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "Tempo di risposta medio, minimo e massimo"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "Media 1 h"
|
||||
@@ -383,6 +403,19 @@ msgstr "Attenzione - possibile perdita di dati"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "Celsius (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "Modifica le unità di visualizzazione per le metriche."
|
||||
@@ -776,12 +809,15 @@ msgstr "Durata"
|
||||
msgid "Edit"
|
||||
msgstr "Modifica"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "Modifica {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "Modifica Sistema"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "I sistemi esistenti non definiti in <0>config.yml</0> verranno eliminati
|
||||
msgid "Exited active"
|
||||
msgstr "Uscito attivo"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "Scade dopo un'ora o al riavvio dell'hub."
|
||||
@@ -887,10 +927,6 @@ msgstr "Esporta la configurazione attuale dei tuoi sistemi."
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "Fahrenheit (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "Fallito"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "Attributi falliti:"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "Aggiornamento dell’immagine disponibile"
|
||||
msgid "Inactive"
|
||||
msgstr "Inattivo"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "Perdita"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "Perdita 1 h"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "Istruzioni di configurazione manuale"
|
||||
msgid "Max 1 min"
|
||||
msgstr "Max 1 min"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "Max 1 h"
|
||||
@@ -1234,6 +1273,7 @@ msgstr "Utilizzo Memoria"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "Utilizzo della memoria dei container"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr "Min 1 h"
|
||||
@@ -1565,6 +1605,7 @@ msgstr "Processo avviato"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "Protocollo"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "Reimposta Password"
|
||||
msgid "Resolved"
|
||||
msgstr "Risolto"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "Dettagli S.M.A.R.T."
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "Autotest S.M.A.R.T."
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "Salva {foo}"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "Salva l'indirizzo usando il tasto invio o la virgola. Lascia vuoto per d
|
||||
msgid "Save Settings"
|
||||
msgstr "Salva Impostazioni"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "Salva Sistema"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "Salvato nel database e non scade finché non lo disabiliti."
|
||||
@@ -1833,6 +1878,7 @@ msgstr "Accedi"
|
||||
msgid "SMTP settings"
|
||||
msgstr "Impostazioni SMTP"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "Ordina per"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "Utilizzo Swap"
|
||||
msgid "Switch theme"
|
||||
msgstr "Cambia tema"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "Schede"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "Destinazione"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "Attività"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "Aggiorna"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "Utilizzo"
|
||||
msgid "Value"
|
||||
msgstr "Valore"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "Vista"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "Visualizza altro"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "Visualizza i tuoi 200 avvisi più recenti."
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "Colonne visibili"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "Sì"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "Le impostazioni utente sono state aggiornate."
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: ja\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:21\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:29\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Japanese\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, one {{countString} 時間} other {{countString} 時間}}
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} 分} few {{countString} 分} many {{countString} 分} other {{countString} 分}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "{diskName} の I/O"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# スレッド} other {# スレッド}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1時間"
|
||||
@@ -123,10 +135,10 @@ msgstr "アクティブなアラート"
|
||||
msgid "Active state"
|
||||
msgstr "アクティブ状態"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "アクティブ状態"
|
||||
msgid "Add {foo}"
|
||||
msgstr "{foo}を追加"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "システムを追加"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "URLを追加"
|
||||
@@ -260,6 +279,7 @@ msgstr "GPUエンジンの平均使用率"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "応答時間の平均、最小、最大"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "1時間平均"
|
||||
@@ -383,6 +403,19 @@ msgstr "注意 - データ損失の可能性"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "摂氏 (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "メトリックの表示単位を変更します。"
|
||||
@@ -776,12 +809,15 @@ msgstr "期間"
|
||||
msgid "Edit"
|
||||
msgstr "編集"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "{foo}を編集"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "システムを編集"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "<0>config.yml</0>に定義されていない既存のシステムは削
|
||||
msgid "Exited active"
|
||||
msgstr "アクティブ状態で終了"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "1時間後、またはハブの再起動時に有効期限が切れます。"
|
||||
@@ -887,10 +927,6 @@ msgstr "現在のシステム設定をエクスポートします。"
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "華氏 (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "失敗"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "失敗した属性:"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "イメージの更新があります"
|
||||
msgid "Inactive"
|
||||
msgstr "非アクティブ"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "パケットロス"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "1時間のパケットロス"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "手動セットアップの手順"
|
||||
msgid "Max 1 min"
|
||||
msgstr "最大1分"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "1時間最大"
|
||||
@@ -1234,6 +1273,7 @@ msgstr "メモリ使用率"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "コンテナのメモリ使用量"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr "1時間最小"
|
||||
@@ -1565,6 +1605,7 @@ msgstr "プロセス開始"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "プロトコル"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "パスワードをリセット"
|
||||
msgid "Resolved"
|
||||
msgstr "解決済み"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "S.M.A.R.T.詳細"
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "S.M.A.R.T.セルフテスト"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "{foo} を保存"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "Enterキーまたはカンマを使用してアドレスを保存しま
|
||||
msgid "Save Settings"
|
||||
msgstr "設定を保存"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "システム を保存"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "データベースに保存され、無効にするまで有効期限が切れません。"
|
||||
@@ -1833,6 +1878,7 @@ msgstr "サインイン"
|
||||
msgid "SMTP settings"
|
||||
msgstr "SMTP設定"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "並び替え基準"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "スワップ使用量"
|
||||
msgid "Switch theme"
|
||||
msgstr "テーマを切り替え"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "タブ"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "対象"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "タスク"
|
||||
@@ -2104,7 +2155,7 @@ msgstr "1時間のパケットロス率がしきい値を超えるとトリガ
|
||||
|
||||
#: src/lib/alerts.ts
|
||||
msgid "Triggers when status switches between up and down"
|
||||
msgstr "ステータスが上から下に切り替わるときにトリガーされます"
|
||||
msgstr "ステータスが稼働中と停止中の間で切り替わったときにトリガーされます"
|
||||
|
||||
#: src/lib/alerts.ts
|
||||
msgid "Triggers when usage of any disk exceeds a threshold"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "更新"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "利用率"
|
||||
msgid "Value"
|
||||
msgstr "値"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "表示"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "もっと見る"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "直近200件のアラートを表示します。"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "表示列"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "はい"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "ユーザー設定が更新されました。"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: ko\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:21\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:29\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Korean\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, one {{countString} 시간} other {{countString} 시간}}
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} 분} few {{countString} 분} many {{countString} 분} other {{countString} 분}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "{diskName} I/O"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# 스레드} other {# 스레드}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1시간"
|
||||
@@ -123,10 +135,10 @@ msgstr "활성화된 알림들"
|
||||
msgid "Active state"
|
||||
msgstr "활성 상태"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "활성 상태"
|
||||
msgid "Add {foo}"
|
||||
msgstr "{foo} 추가"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "시스템 추가"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "URL 추가"
|
||||
@@ -260,6 +279,7 @@ msgstr "GPU 엔진 평균 사용량"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "평균, 최소 및 최대 응답 시간"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "1시간 평균"
|
||||
@@ -383,6 +403,19 @@ msgstr "주의 - 데이터 손실 가능성"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "섭씨 (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "메트릭의 표시 단위를 변경합니다."
|
||||
@@ -776,12 +809,15 @@ msgstr "기간"
|
||||
msgid "Edit"
|
||||
msgstr "수정"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "{foo} 수정"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "시스템 수정"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "<0>config.yml</0>에 정의되지 않은 기존 시스템은 삭제됩
|
||||
msgid "Exited active"
|
||||
msgstr "활성 종료됨"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "한 시간 후 또는 허브 재시작 시 만료됩니다."
|
||||
@@ -887,10 +927,6 @@ msgstr "현재 시스템 구성 내보내기"
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "화씨 (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "실패"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "실패한 속성:"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "이미지 업데이트 사용 가능"
|
||||
msgid "Inactive"
|
||||
msgstr "비활성"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "패킷 손실"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "1시간 패킷 손실"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "수동 설정 방법"
|
||||
msgid "Max 1 min"
|
||||
msgstr "1분간 최댓값"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "1시간 최대"
|
||||
@@ -1234,6 +1273,7 @@ msgstr "메모리 사용량"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "컨테이너 메모리 사용량"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr "1시간 최소"
|
||||
@@ -1565,6 +1605,7 @@ msgstr "프로세스 시작됨"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "프로토콜"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "비밀번호 재설정"
|
||||
msgid "Resolved"
|
||||
msgstr "해결됨"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "S.M.A.R.T. 세부 정보"
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "S.M.A.R.T. 자체 테스트"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "{foo} 저장"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "Enter 키 또는 쉼표를 사용하여 주소를 저장하세요. 이
|
||||
msgid "Save Settings"
|
||||
msgstr "설정 저장"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "시스템 저장"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "데이터베이스에 저장되며 비활성화할 때까지 만료되지 않습니다."
|
||||
@@ -1833,6 +1878,7 @@ msgstr "로그인"
|
||||
msgid "SMTP settings"
|
||||
msgstr "SMTP 설정"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "정렬 기준"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "스왑 사용량"
|
||||
msgid "Switch theme"
|
||||
msgstr "테마 전환"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "탭"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "대상"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "작업"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "업데이트"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "사용률"
|
||||
msgid "Value"
|
||||
msgstr "값"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "보기"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "더 보기"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "최근 200개의 알림을 봅니다."
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "표시할 열"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "예"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "사용자 설정이 업데이트되었습니다."
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: nl\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:21\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:29\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Dutch\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, one {{countString} uur} other {{countString} uren}}"
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} minuut} other {{countString} minuten}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "I/O van {diskName}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# thread} other {# threads}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1 uur"
|
||||
@@ -123,10 +135,10 @@ msgstr "Actieve waarschuwingen"
|
||||
msgid "Active state"
|
||||
msgstr "Actieve status"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "Actieve status"
|
||||
msgid "Add {foo}"
|
||||
msgstr "Voeg {foo} toe"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "Voeg Systeem toe"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "Voeg URL toe"
|
||||
@@ -260,6 +279,7 @@ msgstr "Gemiddeld gebruik van GPU-engines"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "Gemiddelde, minimale en maximale reactietijd"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "Gem. 1 u"
|
||||
@@ -383,6 +403,19 @@ msgstr "Opgelet - potentieel gegevensverlies"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "Celsius (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "Verander statistiek eenheden."
|
||||
@@ -776,12 +809,15 @@ msgstr "Duur"
|
||||
msgid "Edit"
|
||||
msgstr "Bewerken"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "Bewerk {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "Bewerk Systeem"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "Bestaande systemen die niet gedefinieerd zijn in <0>config.yml</0> zulle
|
||||
msgid "Exited active"
|
||||
msgstr "Beëindigd actief"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "Verloopt na één uur of bij hub-herstart."
|
||||
@@ -887,10 +927,6 @@ msgstr "Exporteer je huidige systeemconfiguratie."
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "Fahrenheit (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "Mislukt"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "Mislukte kenmerken:"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "Image-update beschikbaar"
|
||||
msgid "Inactive"
|
||||
msgstr "Inactief"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "Verlies"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "Verlies 1 h"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "Handmatige installatie-instructies"
|
||||
msgid "Max 1 min"
|
||||
msgstr "Max 1 min"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "Max. 1 u"
|
||||
@@ -1234,6 +1273,7 @@ msgstr "Geheugengebruik"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "Geheugengebruik van containers"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr "Min. 1 u"
|
||||
@@ -1565,6 +1605,7 @@ msgstr "Proces gestart"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "Protocol"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "Wachtwoord resetten"
|
||||
msgid "Resolved"
|
||||
msgstr "Opgelost"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "S.M.A.R.T.-details"
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "S.M.A.R.T. Zelf-test"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "{foo} opslaan"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "Bewaar het adres met de enter-toets of komma. Laat leeg om e-mailmelding
|
||||
msgid "Save Settings"
|
||||
msgstr "Instellingen opslaan"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "Systeem opslaan"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "Opgeslagen in de database en verloopt niet totdat u het uitschakelt."
|
||||
@@ -1833,6 +1878,7 @@ msgstr "Aanmelden"
|
||||
msgid "SMTP settings"
|
||||
msgstr "SMTP-instellingen"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "Sorteren op"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "Swap gebruik"
|
||||
msgid "Switch theme"
|
||||
msgstr "Wissel thema"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "Tabbladen"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "Doel"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "Taken"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "Bijwerken"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "Gebruik"
|
||||
msgid "Value"
|
||||
msgstr "Waarde"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "Weergave"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "Meer weergeven"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "Bekijk je 200 meest recente meldingen."
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "Zichtbare kolommen"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "Ja"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "Je gebruikersinstellingen zijn bijgewerkt."
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: no\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:21\n"
|
||||
"PO-Revision-Date: 2026-09-24 18:40\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Norwegian\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, one {{countString} time} other {{countString} timer}}"
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} minutt} other {{countString} minutter}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr "{daysLeft, plural, one {# dag} other {# dager}}"
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "I/O for {diskName}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr "{numFailed, plural, one {# feilet tjeneste} other {# feilede tjenester}}"
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# tråd} other {# tråder}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr "{totalCount, plural, one {# tjeneste} other {# tjenester}}"
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1 time"
|
||||
@@ -123,10 +135,10 @@ msgstr "Aktive Alarmer"
|
||||
msgid "Active state"
|
||||
msgstr "Aktiv tilstand"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr "Legg til"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "Aktiv tilstand"
|
||||
msgid "Add {foo}"
|
||||
msgstr "Legg til {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "Legg til System"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "Legg Til URL"
|
||||
@@ -260,6 +279,7 @@ msgstr "Gjennomsnittlig utnyttelse av GPU-motorer"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "Gjennomsnittlig, minste og høyeste svartid"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "Gj.sn. 1 t"
|
||||
@@ -383,6 +403,19 @@ msgstr "Advarsel - potensielt tap av data"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "Celsius (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr "Sertifikat"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr "Sertifikatet utløper {expires}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr "Sertifikatet utløper {expires}"
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "Endre måleenheter for målinger."
|
||||
@@ -776,12 +809,15 @@ msgstr "Varighet"
|
||||
msgid "Edit"
|
||||
msgstr "Rediger"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "Rediger {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "Rediger System"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "Eksisterende systemer som ikke er er definert i <0>config.yml</0> vil bl
|
||||
msgid "Exited active"
|
||||
msgstr "Avsluttet aktiv"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr "Utløpt"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "Utløper etter en time eller ved hub-omstart."
|
||||
@@ -887,10 +927,6 @@ msgstr "Eksporter din nåværende systemkonfigurasjon"
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "Fahrenheit (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "Mislyktes"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "Mislykkede attributter:"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "Bildeoppdatering tilgjengelig"
|
||||
msgid "Inactive"
|
||||
msgstr "Inaktiv"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "Tap"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "Tap 1 h"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "Instruks for Manuell Installasjon"
|
||||
msgid "Max 1 min"
|
||||
msgstr "Maks 1 min"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "Maks. 1 t"
|
||||
@@ -1234,6 +1273,7 @@ msgstr "Minnebruk"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "Minnebruk for containere"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr "Min. 1 t"
|
||||
@@ -1565,6 +1605,7 @@ msgstr "Prosess startet"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "Protokoll"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "Nullstill Passord"
|
||||
msgid "Resolved"
|
||||
msgstr "Løst"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "S.M.A.R.T.-detaljer"
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "S.M.A.R.T. selvtest"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "Lagre {foo}"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "Lagre adressen med Enter-tasten eller komma. La feltet være tomt for å
|
||||
msgid "Save Settings"
|
||||
msgstr "Lagre Innstillinger"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "Lagre System"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "Lagret i databasen og utløper ikke før du deaktiverer det."
|
||||
@@ -1833,6 +1878,7 @@ msgstr "Logg inn"
|
||||
msgid "SMTP settings"
|
||||
msgstr "SMTP-innstillinger"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "Sorter Etter"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "Swap-bruk"
|
||||
msgid "Switch theme"
|
||||
msgstr "Bytt tema"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "Faner"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "Mål"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr "mål [,protokoll[,port[,interval]]"
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "Oppgaver"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "Oppdater"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "Utnyttelse"
|
||||
msgid "Value"
|
||||
msgstr "Verdi"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "Visning"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "Se mer"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "Vis de 200 siste varslene."
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "Synlige Felter"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "Ja"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "Dine brukerinnstillinger har blitt oppdatert."
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: pl\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:21\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:29\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Polish\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, one {godzina} few {{countString} godziny} many {{countSt
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} minuta} few {{countString} minuty} many {{countString} minut} other {{countString} minut}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "I/O {diskName}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# wątek} few {# wątki} many {# wątków} other {# wątków}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1 godzina"
|
||||
@@ -123,10 +135,10 @@ msgstr "Aktywne alerty"
|
||||
msgid "Active state"
|
||||
msgstr "Status aktywny"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "Status aktywny"
|
||||
msgid "Add {foo}"
|
||||
msgstr "Dodaj {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "Dodaj System"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "Dodaj URL"
|
||||
@@ -260,6 +279,7 @@ msgstr "Średnie wykorzystanie silników GPU"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "Średni, minimalny i maksymalny czas odpowiedzi"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "Śr. 1 godz."
|
||||
@@ -383,6 +403,19 @@ msgstr "Uwaga - ryzyko utraty danych"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "Celsjusza (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "Zmień jednostki wyświetlania dla metryk."
|
||||
@@ -776,12 +809,15 @@ msgstr "Czas trwania"
|
||||
msgid "Edit"
|
||||
msgstr "Edytuj"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "Edytuj {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "Edytuj System"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "Istniejące systemy, które nie są zdefiniowane w <0>config.yml</0>, zo
|
||||
msgid "Exited active"
|
||||
msgstr "Zakończono aktywnie"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "Wygasa po godzinie lub przy ponownym uruchomieniu huba."
|
||||
@@ -887,10 +927,6 @@ msgstr "Eksportuj aktualną konfigurację systemów."
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "Fahrenheit (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "Nieudane"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "Nieudane atrybuty:"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "Dostępna aktualizacja obrazu"
|
||||
msgid "Inactive"
|
||||
msgstr "Nieaktywny"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "Strata"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "Strata 1 h"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "Instrukcja ręcznej konfiguracji"
|
||||
msgid "Max 1 min"
|
||||
msgstr "Maks. 1 min"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "Maks. 1 godz."
|
||||
@@ -1234,6 +1273,7 @@ msgstr "Użycie pamięci"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "Zużycie pamięci przez kontenery"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr "Min. 1 godz."
|
||||
@@ -1565,6 +1605,7 @@ msgstr "Proces uruchomiony"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "Protokół"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "Resetuj hasło"
|
||||
msgid "Resolved"
|
||||
msgstr "Rozwiązany"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "Szczegóły S.M.A.R.T."
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "Samodiagnostyka S.M.A.R.T."
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "Zapisz {foo}"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "Zapisz adres, używając klawisza enter lub przecinka. Pozostaw puste, a
|
||||
msgid "Save Settings"
|
||||
msgstr "Zapisz ustawienia"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "Zapisz System"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "Zapisany w bazie danych. Nie wygasa, dopóki go nie wyłączysz."
|
||||
@@ -1833,6 +1878,7 @@ msgstr "Zaloguj się"
|
||||
msgid "SMTP settings"
|
||||
msgstr "Ustawienia SMTP"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "Sortuj według"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "Użycie pamięci wymiany"
|
||||
msgid "Switch theme"
|
||||
msgstr "Zmień motyw"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "Karty"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "Cel"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "Zadania"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "Aktualizuj"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "Użycie"
|
||||
msgid "Value"
|
||||
msgstr "Wartość"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "Widok"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "Zobacz więcej"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "Wyświetl 200 ostatnich alertów."
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "Widoczne kolumny"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "Tak"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "Twoje ustawienia użytkownika zostały zaktualizowane."
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: pt\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:21\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:29\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Portuguese\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, one {{countString} hora} other {{countString} horas}}"
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} minuto} other {{countString} minutos}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "E/S de {diskName}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# thread} other {# threads}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1 hora"
|
||||
@@ -123,10 +135,10 @@ msgstr "Alertas Ativos"
|
||||
msgid "Active state"
|
||||
msgstr "Estado ativo"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "Estado ativo"
|
||||
msgid "Add {foo}"
|
||||
msgstr "Adicionar {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "Adicionar Sistema"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "Adicionar URL"
|
||||
@@ -260,6 +279,7 @@ msgstr "Utilização média dos motores GPU"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "Tempo de resposta médio, mínimo e máximo"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "Méd. 1 h"
|
||||
@@ -383,6 +403,19 @@ msgstr "Cuidado - possível perda de dados"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "Celsius (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "Alterar unidades de exibição para métricas."
|
||||
@@ -776,12 +809,15 @@ msgstr "Duração"
|
||||
msgid "Edit"
|
||||
msgstr "Editar"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "Editar {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "Editar Sistema"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "Sistemas existentes não definidos em <0>config.yml</0> serão excluído
|
||||
msgid "Exited active"
|
||||
msgstr "Saiu ativo"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "Expira após uma hora ou no reinício do hub."
|
||||
@@ -887,10 +927,6 @@ msgstr "Exporte a configuração atual dos seus sistemas."
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "Fahrenheit (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "Falhou"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "Atributos com Falha:"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "Atualização da imagem disponível"
|
||||
msgid "Inactive"
|
||||
msgstr "Inativo"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "Perda"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "Perda 1 h"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "Instruções de configuração manual"
|
||||
msgid "Max 1 min"
|
||||
msgstr "Máx 1 min"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "Máx. 1 h"
|
||||
@@ -1234,6 +1273,7 @@ msgstr "Uso de Memória"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "Utilização de memória dos contentores"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr "Mín. 1 h"
|
||||
@@ -1565,6 +1605,7 @@ msgstr "Processo iniciado"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "Protocolo"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "Redefinir Senha"
|
||||
msgid "Resolved"
|
||||
msgstr "Resolvido"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "Detalhes S.M.A.R.T."
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "Auto-teste S.M.A.R.T."
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "Guardar {foo}"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "Salve o endereço usando a tecla enter ou vírgula. Deixe em branco para
|
||||
msgid "Save Settings"
|
||||
msgstr "Guardar Definições"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "Guardar Sistema"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "Salvo no banco de dados e não expira até você desativá-lo."
|
||||
@@ -1833,6 +1878,7 @@ msgstr "Entrar"
|
||||
msgid "SMTP settings"
|
||||
msgstr "Configurações SMTP"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "Ordenar Por"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "Uso de Swap"
|
||||
msgid "Switch theme"
|
||||
msgstr "Mudar tema"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "Separadores"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "Destino"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "Tarefas"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "Atualizar"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "Utilização"
|
||||
msgid "Value"
|
||||
msgstr "Valor"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "Visual"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "Ver mais"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "Veja os seus 200 alertas mais recentes."
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "Campos Visíveis"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "Sim"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "As configurações do seu usuário foram atualizadas."
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: ro\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:22\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:29\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Romanian\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100>0 && n%100<20)) ? 1 : 2);\n"
|
||||
@@ -52,14 +52,26 @@ msgstr ""
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1 oră"
|
||||
@@ -123,10 +135,10 @@ msgstr "Alerte Active"
|
||||
msgid "Active state"
|
||||
msgstr "Stare activă"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "Stare activă"
|
||||
msgid "Add {foo}"
|
||||
msgstr "Adaugă {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "Adaugă URL"
|
||||
@@ -260,6 +279,7 @@ msgstr ""
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr ""
|
||||
@@ -383,6 +403,19 @@ msgstr "Atenție - posibilă pierdere de date"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "Celsius (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "Schimbă unitățile de afișare pentru metrici."
|
||||
@@ -776,12 +809,15 @@ msgstr "Durată"
|
||||
msgid "Edit"
|
||||
msgstr "Editează"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "Editează {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr ""
|
||||
msgid "Exited active"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr ""
|
||||
@@ -887,10 +927,6 @@ msgstr ""
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr ""
|
||||
@@ -1090,6 +1126,7 @@ msgstr ""
|
||||
msgid "Inactive"
|
||||
msgstr "Inactiv"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr ""
|
||||
@@ -1204,6 +1242,7 @@ msgstr ""
|
||||
msgid "Max 1 min"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr ""
|
||||
@@ -1234,6 +1273,7 @@ msgstr "Memorie Utilizată"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "Utilizarea memoriei de către containere"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr ""
|
||||
@@ -1565,6 +1605,7 @@ msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr ""
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr ""
|
||||
msgid "Resolved"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "Detalii S.M.A.R.T."
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr ""
|
||||
@@ -1712,6 +1753,10 @@ msgstr ""
|
||||
msgid "Save Settings"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr ""
|
||||
@@ -1833,6 +1878,7 @@ msgstr ""
|
||||
msgid "SMTP settings"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr ""
|
||||
@@ -1875,12 +1921,11 @@ msgstr ""
|
||||
msgid "Switch theme"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "Sarcini"
|
||||
@@ -2162,6 +2213,7 @@ msgstr ""
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr ""
|
||||
msgid "Value"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr ""
|
||||
@@ -2231,6 +2284,7 @@ msgstr ""
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr ""
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: ru\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:21\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:29\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"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, one {{countString} час} other {{countString} часо
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} минута} few {{countString} минут} many {{countString} минут} other {{countString} минуты}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "Ввод-вывод {diskName}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# поток} few {# потока} many {# потоков} other {# потоков}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1 час"
|
||||
@@ -123,10 +135,10 @@ msgstr "Активные оповещения"
|
||||
msgid "Active state"
|
||||
msgstr "Активное состояние"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "Активное состояние"
|
||||
msgid "Add {foo}"
|
||||
msgstr "Добавить {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "Добавить систему"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "Добавить URL"
|
||||
@@ -260,6 +279,7 @@ msgstr "Средняя загрузка ядер GPU"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "Среднее, минимальное и максимальное время отклика"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "Сред. за 1 ч"
|
||||
@@ -383,6 +403,19 @@ msgstr "Внимание - возможная потеря данных"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "Цельсий (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "Изменить единицы измерения метрик."
|
||||
@@ -776,12 +809,15 @@ msgstr "Длительность"
|
||||
msgid "Edit"
|
||||
msgstr "Редактировать"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "Редактировать {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "Редактировать систему"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "Существующие системы, не определенные
|
||||
msgid "Exited active"
|
||||
msgstr "Завершился активным"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "Истекает через час или при перезапуске хаба."
|
||||
@@ -887,10 +927,6 @@ msgstr "Экспортируйте текущую конфигурацию си
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "Фаренгейт (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "Неудачно"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "Неудачные атрибуты:"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "Доступно обновление образа"
|
||||
msgid "Inactive"
|
||||
msgstr "Неактивно"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "Потери"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "Потери 1 h"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "Инструкции по ручной установке"
|
||||
msgid "Max 1 min"
|
||||
msgstr "Макс 1 мин"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "Макс. за 1 ч"
|
||||
@@ -1234,6 +1273,7 @@ msgstr "Использование памяти"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "Использование памяти контейнерами"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr "Мин. за 1 ч"
|
||||
@@ -1565,6 +1605,7 @@ msgstr "Процесс запущен"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "Протокол"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "Сбросить пароль"
|
||||
msgid "Resolved"
|
||||
msgstr "Завершено"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "Детали S.M.A.R.T."
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "Запуск теста S.M.A.R.T."
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "Сохранить {foo}"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "Сохраните адрес, используя клавишу вво
|
||||
msgid "Save Settings"
|
||||
msgstr "Сохранить настройки"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "Сохранить систему"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "Сохранено в базе данных и не истекает, пока вы его не отключите."
|
||||
@@ -1833,6 +1878,7 @@ msgstr "Войти"
|
||||
msgid "SMTP settings"
|
||||
msgstr "Настройки SMTP"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "Сортировать по"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "Использование подкачки"
|
||||
msgid "Switch theme"
|
||||
msgstr "Переключить тему"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "Вкладки"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "Цель"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "Задачи"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "Обновить"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "Использование"
|
||||
msgid "Value"
|
||||
msgstr "Значение"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "Вид"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "Показать больше"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "Просмотреть 200 последних оповещений."
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "Видимые столбцы"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "Да"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "Ваши настройки пользователя были обновлены."
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: sl\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:22\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:29\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Slovenian\n"
|
||||
"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3;\n"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, one {{countString} ura} two {{countString} uri} few {{co
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} minuta} few {{countString} minuti} many {{countString} minut} other {{countString} minut}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "V/I za {diskName}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# nit} two {# niti} few {# niti} other {# niti}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1 ura"
|
||||
@@ -123,10 +135,10 @@ msgstr "Aktivna opozorila"
|
||||
msgid "Active state"
|
||||
msgstr "Aktivno stanje"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "Aktivno stanje"
|
||||
msgid "Add {foo}"
|
||||
msgstr "Dodaj {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "Dodaj Sistemsko"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "Dodaj URL"
|
||||
@@ -260,6 +279,7 @@ msgstr "Povprečna uporaba GPU motorjev"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "Povprečni, najmanjši in največji odzivni čas"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "Povp. 1 h"
|
||||
@@ -383,6 +403,19 @@ msgstr "Pozor - možna izguba podatkov"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "Celzija (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "Spremenite enote prikaza za metrike."
|
||||
@@ -776,12 +809,15 @@ msgstr "Trajanje"
|
||||
msgid "Edit"
|
||||
msgstr "Uredi"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "Uredi {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "Uredi Sistemsko"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "Obstoječi sistemi, ki niso definirani v <0>config.yml</0>, bodo izbrisa
|
||||
msgid "Exited active"
|
||||
msgstr "Izhod aktivno"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "Poteče po eni uri ali ob ponovnem zagonu huba."
|
||||
@@ -887,10 +927,6 @@ msgstr "Izvozi trenutne nastavitve sistema."
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "Fahrenheit (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "Neuspešno"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "Neuspeli atributi:"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "Na voljo je posodobitev slike"
|
||||
msgid "Inactive"
|
||||
msgstr "Neaktivno"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "Izguba"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "Izguba 1 h"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "Navodila za ročno nastavitev"
|
||||
msgid "Max 1 min"
|
||||
msgstr "Največ 1 min"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "Najv. 1 h"
|
||||
@@ -1234,6 +1273,7 @@ msgstr "Poraba pomnilnika"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "Poraba pomnilnika vsebnikov"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr "Najm. 1 h"
|
||||
@@ -1565,6 +1605,7 @@ msgstr "Proces začet"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "Protokol"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "Ponastavi geslo"
|
||||
msgid "Resolved"
|
||||
msgstr "Rešeno"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "S.M.A.R.T. podrobnosti"
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "S.M.A.R.T. samotestiranje"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "Shrani {foo}"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "Shranite naslov s tipko enter ali vejico. Pustite prazno, da onemogočit
|
||||
msgid "Save Settings"
|
||||
msgstr "Shrani nastavitve"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "Shrani Sistemsko"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "Shranjeno v bazi podatkov in ne poteče, dokler ga ne onemogočite."
|
||||
@@ -1833,6 +1878,7 @@ msgstr "Prijavite se"
|
||||
msgid "SMTP settings"
|
||||
msgstr "SMTP nastavitve"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "Razvrsti po"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "Swap uporaba"
|
||||
msgid "Switch theme"
|
||||
msgstr "Zamenjaj temo"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "Zavihki"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "Cilj"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "Naloge"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "Posodobi"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "Izkoriščenost"
|
||||
msgid "Value"
|
||||
msgstr "Vrednost"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "Pogled"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "Prikaži več"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "Oglejte si svojih 200 najnovejših opozoril."
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "Vidna polja"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "Da"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "Vaše uporabniške nastavitve so posodobljene."
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: sr\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:22\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:29\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Serbian (Cyrillic)\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, one {{countString} сат} few {{countString} сата}
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} минут} few {{countString} минута} many {{countString} минута} other {{countString} минута}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "I/O за {diskName}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# nit} few {# niti} other {# niti}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1 сат"
|
||||
@@ -123,10 +135,10 @@ msgstr "Активна упозорења"
|
||||
msgid "Active state"
|
||||
msgstr "Активно стање"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "Активно стање"
|
||||
msgid "Add {foo}"
|
||||
msgstr "Додај {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "Додај Систем"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "Додај URL"
|
||||
@@ -260,6 +279,7 @@ msgstr "Просечна искоришћеност мотора графичк
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "Prosečno, minimalno i maksimalno vreme odziva"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "Prosek 1 h"
|
||||
@@ -383,6 +403,19 @@ msgstr "Пажња - потенцијални губитак података"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "Целзијус (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "Промените јединице приказа за метрике."
|
||||
@@ -776,12 +809,15 @@ msgstr "Трајање"
|
||||
msgid "Edit"
|
||||
msgstr "Измени"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "Измени {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "Измени Систем"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "Системи који нису дефинисани у <0>config.yml</
|
||||
msgid "Exited active"
|
||||
msgstr "Излазак активан"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "Истиче након једног сата или при поновном покретању хаба."
|
||||
@@ -887,10 +927,6 @@ msgstr "Извезите тренутну конфигурацију систе
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "Фаренхајт (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "Неуспело"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "Неуспели атрибути:"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "Dostupno je ažuriranje slike"
|
||||
msgid "Inactive"
|
||||
msgstr "Неактивно"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "Gubitak"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "Gubitak 1 h"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "Упутства за ручно подешавање"
|
||||
msgid "Max 1 min"
|
||||
msgstr "Макс 1 мин"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "Maks. 1 h"
|
||||
@@ -1234,6 +1273,7 @@ msgstr "Употреба меморије"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "Коришћење меморије контејнера"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr "Min. 1 h"
|
||||
@@ -1565,6 +1605,7 @@ msgstr "Процес покренут"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "Protokol"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "Ресетуј лозинку"
|
||||
msgid "Resolved"
|
||||
msgstr "Решено"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "S.M.A.R.T. детаљи"
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "S.M.A.R.T. самопровера"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "Сачувај {foo}"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "Сачувајте адресу користећи enter тастер и
|
||||
msgid "Save Settings"
|
||||
msgstr "Сачувај подешавања"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "Сачувај Систем"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "Сачувано у бази података и не истиче док га не онемогућите."
|
||||
@@ -1833,6 +1878,7 @@ msgstr "Пријави се"
|
||||
msgid "SMTP settings"
|
||||
msgstr "SMTP подешавања"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "Сортирај по"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "Swap употреба"
|
||||
msgid "Switch theme"
|
||||
msgstr "Промени тему"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "Картице"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "Cilj"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "Задаци"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "Ажурирај"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "Искоришћеност"
|
||||
msgid "Value"
|
||||
msgstr "Вредност"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "Погледај"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "Погледај више"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "Погледајте ваших 200 најновијих упозорења."
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "Видљива поља"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "Да"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "Ваша корисничка подешавања су ажурирана."
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: sv\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:22\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:29\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Swedish\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, one {{countString} timme} other {{countString} timmar}}"
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} minut} few {{countString} minuter} many {{countString} minuter} other {{countString} minuter}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "I/O för {diskName}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# tråd} other {# trådar}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1 timme"
|
||||
@@ -123,10 +135,10 @@ msgstr "Aktiva larm"
|
||||
msgid "Active state"
|
||||
msgstr "Aktivt tillstånd"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "Aktivt tillstånd"
|
||||
msgid "Add {foo}"
|
||||
msgstr "Lägg till {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "Lägg till System"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "Lägg till URL"
|
||||
@@ -260,6 +279,7 @@ msgstr "Genomsnittlig användning av GPU-motorer"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "Genomsnittlig, lägsta och högsta svarstid"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "Gen. 1 tim"
|
||||
@@ -383,6 +403,19 @@ msgstr "Varning - potentiell dataförlust"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "Celsius (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "Ändra enheter för mätvärden."
|
||||
@@ -776,12 +809,15 @@ msgstr "Varaktighet"
|
||||
msgid "Edit"
|
||||
msgstr "Redigera"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "Redigera {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "Redigera System"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "Befintliga system som inte definieras i <0>config.yml</0> kommer att tas
|
||||
msgid "Exited active"
|
||||
msgstr "Avslutades aktivt"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "Upphör efter en timme eller vid hub-omstart."
|
||||
@@ -887,10 +927,6 @@ msgstr "Exportera din nuvarande systemkonfiguration."
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "Fahrenheit (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "Misslyckades"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "Misslyckade attribut:"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "Bilduppdatering tillgänglig"
|
||||
msgid "Inactive"
|
||||
msgstr "Inaktiv"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "Förlust"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "Förlust 1 h"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "Manuella installationsinstruktioner"
|
||||
msgid "Max 1 min"
|
||||
msgstr "Max 1 min"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "Max. 1 tim"
|
||||
@@ -1234,6 +1273,7 @@ msgstr "Minnesanvändning"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "Minnesanvändning för containrar"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr "Min. 1 tim"
|
||||
@@ -1565,6 +1605,7 @@ msgstr "Process startad"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "Protokoll"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "Återställ lösenord"
|
||||
msgid "Resolved"
|
||||
msgstr "Löst"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "S.M.A.R.T.-detaljer"
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "S.M.A.R.T. själftest"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "Spara {foo}"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "Spara adressen med Enter-tangenten eller komma. Lämna tomt för att ina
|
||||
msgid "Save Settings"
|
||||
msgstr "Spara inställningar"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "Spara System"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "Sparad i databasen och upphör inte förrän du inaktiverar den."
|
||||
@@ -1833,6 +1878,7 @@ msgstr "Logga in"
|
||||
msgid "SMTP settings"
|
||||
msgstr "SMTP-inställningar"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "Sortera efter"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "Swap-användning"
|
||||
msgid "Switch theme"
|
||||
msgstr "Byt tema"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "Flikar"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "Mål"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "Uppgifter"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "Uppdatera"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "Användning"
|
||||
msgid "Value"
|
||||
msgstr "Värde"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "Visa"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "Visa mer"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "Visa dina 200 senaste larm."
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "Synliga fält"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "Ja"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "Dina användarinställningar har uppdaterats."
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: th\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:22\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:29\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Thai\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
@@ -52,14 +52,26 @@ msgstr ""
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr ""
|
||||
@@ -123,10 +135,10 @@ msgstr ""
|
||||
msgid "Active state"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr ""
|
||||
msgid "Add {foo}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr ""
|
||||
@@ -260,6 +279,7 @@ msgstr ""
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr ""
|
||||
@@ -383,6 +403,19 @@ msgstr ""
|
||||
msgid "Celsius (°C)"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr ""
|
||||
@@ -776,12 +809,15 @@ msgstr ""
|
||||
msgid "Edit"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr ""
|
||||
msgid "Exited active"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr ""
|
||||
@@ -887,10 +927,6 @@ msgstr ""
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr ""
|
||||
@@ -1090,6 +1126,7 @@ msgstr ""
|
||||
msgid "Inactive"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr ""
|
||||
@@ -1204,6 +1242,7 @@ msgstr ""
|
||||
msgid "Max 1 min"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr ""
|
||||
@@ -1234,6 +1273,7 @@ msgstr ""
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "การใช้หน่วยความจำของคอนเทนเนอร์"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr ""
|
||||
@@ -1565,6 +1605,7 @@ msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr ""
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr ""
|
||||
msgid "Resolved"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr ""
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr ""
|
||||
@@ -1712,6 +1753,10 @@ msgstr ""
|
||||
msgid "Save Settings"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr ""
|
||||
@@ -1833,6 +1878,7 @@ msgstr ""
|
||||
msgid "SMTP settings"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr ""
|
||||
@@ -1875,12 +1921,11 @@ msgstr ""
|
||||
msgid "Switch theme"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr ""
|
||||
@@ -2162,6 +2213,7 @@ msgstr ""
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr ""
|
||||
msgid "Value"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr ""
|
||||
@@ -2231,6 +2284,7 @@ msgstr ""
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr ""
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: tr\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:22\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:29\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Turkish\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, one {{countString} saat} other {{countString} saat}}"
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} dakika} few {{countString} dakika} many {{countString} dakika} other {{countString} dakika}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "{diskName} G/Ç"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# iş parçacığı} other {# iş parçacığı}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1 saat"
|
||||
@@ -123,10 +135,10 @@ msgstr "Aktif Uyarılar"
|
||||
msgid "Active state"
|
||||
msgstr "Aktif durum"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "Aktif durum"
|
||||
msgid "Add {foo}"
|
||||
msgstr "{foo} ekle"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "Sistem ekle"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "URL Ekle"
|
||||
@@ -260,6 +279,7 @@ msgstr "GPU motorlarının ortalama kullanımı"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "Ortalama, minimum ve maksimum yanıt süresi"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "1 saat ort."
|
||||
@@ -383,6 +403,19 @@ msgstr "Dikkat - potansiyel veri kaybı"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "Santigrat (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "Metrikler için görüntüleme birimlerini değiştirin."
|
||||
@@ -776,12 +809,15 @@ msgstr "Süre"
|
||||
msgid "Edit"
|
||||
msgstr "Düzenle"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "{foo} düzenle"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "Sistem düzenle"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "<0>config.yml</0> içinde tanımlanmayan mevcut sistemler silinecektir.
|
||||
msgid "Exited active"
|
||||
msgstr "Aktif olarak çıktı"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "Bir saat sonra veya hub yeniden başlatıldığında sona erer."
|
||||
@@ -887,10 +927,6 @@ msgstr "Mevcut sistem yapılandırmanızı dışa aktarın."
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "Fahrenhayt (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "Başarısız"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "Başarısız Özellikler:"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "Görüntü güncellemesi mevcut"
|
||||
msgid "Inactive"
|
||||
msgstr "Pasif"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "Kayıp"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "1 saat kaybı"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "Manuel kurulum talimatları"
|
||||
msgid "Max 1 min"
|
||||
msgstr "Maks 1 dk"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "Maks. 1 saat"
|
||||
@@ -1234,6 +1273,7 @@ msgstr "Bellek Kullanımı"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "Konteynerlerin bellek kullanımı"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr "Min. 1 saat"
|
||||
@@ -1565,6 +1605,7 @@ msgstr "Süreç başlatıldı"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "Protokol"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "Şifreyi Sıfırla"
|
||||
msgid "Resolved"
|
||||
msgstr "Çözüldü"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "S.M.A.R.T. Ayrıntıları"
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "S.M.A.R.T. Kendiliğinden Test"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "{foo} Kaydet"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "Adresleri enter tuşu veya virgül ile kaydedin. E-posta bildirimlerini
|
||||
msgid "Save Settings"
|
||||
msgstr "Ayarları Kaydet"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "Sistem Kaydet"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "Veritabanında kaydedilir ve siz devre dışı bırakana kadar süresi dolmaz."
|
||||
@@ -1833,6 +1878,7 @@ msgstr "Giriş yap"
|
||||
msgid "SMTP settings"
|
||||
msgstr "SMTP ayarları"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "Sıralama Ölçütü"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "Takas Kullanımı"
|
||||
msgid "Switch theme"
|
||||
msgstr "Temayı değiştir"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "Sekmeler"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "Hedef"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "Görevler"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "Güncelle"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "Kullanım"
|
||||
msgid "Value"
|
||||
msgstr "Değer"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "Görüntüle"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "Daha fazla göster"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "En son 200 uyarınızı görüntüleyin."
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "Görünür Alanlar"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "Evet"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "Kullanıcı ayarlarınız güncellendi."
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: ug\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:22\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:29\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Uyghur\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -52,14 +52,26 @@ msgstr ""
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr ""
|
||||
@@ -123,10 +135,10 @@ msgstr ""
|
||||
msgid "Active state"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr ""
|
||||
msgid "Add {foo}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr ""
|
||||
@@ -260,6 +279,7 @@ msgstr ""
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr ""
|
||||
@@ -383,6 +403,19 @@ msgstr ""
|
||||
msgid "Celsius (°C)"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr ""
|
||||
@@ -776,12 +809,15 @@ msgstr ""
|
||||
msgid "Edit"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr ""
|
||||
msgid "Exited active"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr ""
|
||||
@@ -887,10 +927,6 @@ msgstr ""
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr ""
|
||||
@@ -1090,6 +1126,7 @@ msgstr ""
|
||||
msgid "Inactive"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr ""
|
||||
@@ -1204,6 +1242,7 @@ msgstr ""
|
||||
msgid "Max 1 min"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr ""
|
||||
@@ -1234,6 +1273,7 @@ msgstr ""
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "كونتېينېرلارنىڭ ئەسلەك ئىشلىتىشى"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr ""
|
||||
@@ -1565,6 +1605,7 @@ msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr ""
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr ""
|
||||
msgid "Resolved"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr ""
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr ""
|
||||
@@ -1712,6 +1753,10 @@ msgstr ""
|
||||
msgid "Save Settings"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr ""
|
||||
@@ -1833,6 +1878,7 @@ msgstr ""
|
||||
msgid "SMTP settings"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr ""
|
||||
@@ -1875,12 +1921,11 @@ msgstr ""
|
||||
msgid "Switch theme"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr ""
|
||||
@@ -2162,6 +2213,7 @@ msgstr ""
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr ""
|
||||
msgid "Value"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr ""
|
||||
@@ -2231,6 +2284,7 @@ msgstr ""
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr ""
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: uk\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:22\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:29\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Ukrainian\n"
|
||||
"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, one {{countString} година} few {{countString} го
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} хвилина} few {{countString} хвилини} many {{countString} хвилин} other {{countString} хвилини}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "Ввід/вивід {diskName}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# потік} few {# потоки} many {# потоків} other {# потоків}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1 година"
|
||||
@@ -123,10 +135,10 @@ msgstr "Активні сповіщення"
|
||||
msgid "Active state"
|
||||
msgstr "Активний стан"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "Активний стан"
|
||||
msgid "Add {foo}"
|
||||
msgstr "Додати {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "Додати систему"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "Додати URL"
|
||||
@@ -260,6 +279,7 @@ msgstr "Середнє використання рушіїв GPU"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "Середній, мінімальний і максимальний час відгуку"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "Сер. за 1 год"
|
||||
@@ -383,6 +403,19 @@ msgstr "Увага — можлива втрата даних"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "Цельсій (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "Змінити одиниці вимірювання для метрик."
|
||||
@@ -776,12 +809,15 @@ msgstr "Тривалість"
|
||||
msgid "Edit"
|
||||
msgstr "Редагувати"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "Редагувати {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "Редагувати систему"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "Існуючі системи, не визначені в <0>config.yml<
|
||||
msgid "Exited active"
|
||||
msgstr "Завершилося активно"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "Закінчується через годину або при перезапуску Hub."
|
||||
@@ -887,10 +927,6 @@ msgstr "Експортуйте поточну конфігурацію сист
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "Фаренгейт (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "Не вдалося"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "Невдалі атрибути:"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "Доступне оновлення образу"
|
||||
msgid "Inactive"
|
||||
msgstr "Неактивне"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "Втрата"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "Втрата 1 h"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "Інструкції з ручного налаштування"
|
||||
msgid "Max 1 min"
|
||||
msgstr "Макс 1 хв"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "Макс. за 1 год"
|
||||
@@ -1234,6 +1273,7 @@ msgstr "Використання пам’яті"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "Використання пам’яті контейнерами"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr "Мін. за 1 год"
|
||||
@@ -1565,6 +1605,7 @@ msgstr "Процес запущено"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "Протокол"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "Скинути пароль"
|
||||
msgid "Resolved"
|
||||
msgstr "Вирішено"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "Деталі S.M.A.R.T."
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "Самодіагностика S.M.A.R.T."
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "Зберегти {foo}"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "Збережіть адресу, використовуючи клаві
|
||||
msgid "Save Settings"
|
||||
msgstr "Зберегти налаштування"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "Зберегти систему"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "Збережено в базі даних і залишається чинним, доки ви його не вимкнете."
|
||||
@@ -1833,6 +1878,7 @@ msgstr "Увійти"
|
||||
msgid "SMTP settings"
|
||||
msgstr "Налаштування SMTP"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "Сортувати за"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "Використання підкачки"
|
||||
msgid "Switch theme"
|
||||
msgstr "Змінити тему"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "Вкладки"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "Ціль"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "Завдання"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "Оновити"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "Використання"
|
||||
msgid "Value"
|
||||
msgstr "Значення"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "Вигляд"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "Переглянути більше"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "Переглянути 200 останніх сповіщень."
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "Видимі стовпці"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "Так"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "Ваші налаштування користувача були оновлені."
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: uz\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:22\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:29\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Uzbek\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, other {{countString} soat}}"
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, other {{countString} daqiqa}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "{diskName} I/O"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, other {# ip}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1 soat"
|
||||
@@ -123,10 +135,10 @@ msgstr "Faol ogohlantirishlar"
|
||||
msgid "Active state"
|
||||
msgstr "Faol holat"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "Faol holat"
|
||||
msgid "Add {foo}"
|
||||
msgstr "{foo} qo'shish"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "Tizim qo'shish"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "URL qo'shish"
|
||||
@@ -260,6 +279,7 @@ msgstr "GPU dvigatellarining o'rtacha yuklanishi"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "Ortacha, minimal va maksimal javob vaqti"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "1 soat o‘rtacha"
|
||||
@@ -383,6 +403,19 @@ msgstr "Ehtiyot bo'ling - ma'lumotlar yo'qolishi mumkin"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "Selsiy (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "Metrikalar uchun ko'rsatish birliklarini o'zgartiring."
|
||||
@@ -776,12 +809,15 @@ msgstr "Davomiylik"
|
||||
msgid "Edit"
|
||||
msgstr "Tahrirlash"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "{foo} tahrirlash"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "Tizim tahrirlash"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "<0>config.yml</0> da aniqlanmagan mavjud tizimlar o'chiriladi. Iltimos,
|
||||
msgid "Exited active"
|
||||
msgstr "Faollikdan chiqdi"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "Bir soatdan keyin yoki hub qayta ishga tushganda muddati tugaydi."
|
||||
@@ -887,10 +927,6 @@ msgstr "Joriy tizimlar konfiguratsiyasini eksport qiling."
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "Farengeyt (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "Muvaffaqiyatsiz"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "Muvaffaqiyatsiz atributlar:"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "Obraz yangilanishi mavjud"
|
||||
msgid "Inactive"
|
||||
msgstr "Nofaol"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "Yo‘qotish"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "1 soatlik yo‘qotish"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "Qo'lda o'rnatish ko'rsatmalari"
|
||||
msgid "Max 1 min"
|
||||
msgstr "Maks 1 daq"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "1 soat maksimal"
|
||||
@@ -1234,6 +1273,7 @@ msgstr "Xotira ishlatilishi"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "Konteynerlarning xotira ishlatilishi"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr "1 soat minimal"
|
||||
@@ -1565,6 +1605,7 @@ msgstr "Jarayon boshlandi"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "Protokol"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "Parolni tiklash"
|
||||
msgid "Resolved"
|
||||
msgstr "Hal qilindi"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "S.M.A.R.T. tafsilotlar"
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "S.M.A.R.T. o'z-o'zini test"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "{foo} saqlash"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "Manzilni enter tugmasi yoki vergul yordamida saqlang. Elektron pochta bi
|
||||
msgid "Save Settings"
|
||||
msgstr "Sozlamalarni saqlash"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "Tizim saqlash"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "Ma'lumotlar bazasida saqlanadi va siz o'chirishingizcha muddati tugamaydi."
|
||||
@@ -1833,6 +1878,7 @@ msgstr "Kirish"
|
||||
msgid "SMTP settings"
|
||||
msgstr "SMTP sozlamalari"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "Saralash"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "Swap ishlatilishi"
|
||||
msgid "Switch theme"
|
||||
msgstr "Mavzuni almashtirish"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "Yorliqlar"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "Maqsad"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "Vazifalar"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "Yangilash"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "Yuklanish"
|
||||
msgid "Value"
|
||||
msgstr "Qiymat"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "Ko'rish"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "Ko'proq ko'rish"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "So'nggi 200 ta ogohlantirishingizni ko'ring."
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "Ko'rinadigan maydonlar"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "Ha"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "Foydalanuvchi sozlamalaringiz yangilandi."
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: vi\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:22\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:29\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Vietnamese\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, one {{countString} giờ} other {{countString} giờ}}"
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} phút} few {{countString} phút} many {{countString} phút} other {{countString} phút}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "I/O {diskName}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# luồng} other {# luồng}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1 giờ"
|
||||
@@ -123,10 +135,10 @@ msgstr "Cảnh báo hoạt động"
|
||||
msgid "Active state"
|
||||
msgstr "Trạng thái hoạt động"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "Trạng thái hoạt động"
|
||||
msgid "Add {foo}"
|
||||
msgstr "Thêm {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "Thêm Hệ thống"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "Thêm URL"
|
||||
@@ -260,6 +279,7 @@ msgstr "Mức sử dụng trung bình của động cơ GPU"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "Thời gian phản hồi trung bình, tối thiểu và tối đa"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "TB 1 giờ"
|
||||
@@ -383,6 +403,19 @@ msgstr "Cẩn thận - có thể mất dữ liệu"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "Độ C (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "Thay đổi đơn vị hiển thị cho các chỉ số."
|
||||
@@ -776,12 +809,15 @@ msgstr "Thời lượng"
|
||||
msgid "Edit"
|
||||
msgstr "Chỉnh sửa"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "Chỉnh sửa {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "Chỉnh sửa Hệ thống"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "Các hệ thống hiện có không được định nghĩa trong <0>con
|
||||
msgid "Exited active"
|
||||
msgstr "Đã thoát khi hoạt động"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "Hết hạn sau một giờ hoặc khi khởi động lại hub."
|
||||
@@ -887,10 +927,6 @@ msgstr "Xuất cấu hình hệ thống hiện tại của bạn."
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "Độ F (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "Thất bại"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "Thuộc tính thất bại:"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "Có bản cập nhật image"
|
||||
msgid "Inactive"
|
||||
msgstr "Không hoạt động"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "Mất gói"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "Mất gói 1 giờ"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "Hướng dẫn cài đặt thủ công"
|
||||
msgid "Max 1 min"
|
||||
msgstr "Tối đa 1 phút"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "Tối đa 1 giờ"
|
||||
@@ -1234,6 +1273,7 @@ msgstr "Sử dụng Bộ nhớ"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "Mức sử dụng bộ nhớ của các container"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr "Tối thiểu 1 giờ"
|
||||
@@ -1565,6 +1605,7 @@ msgstr "Tiến trình đã khởi động"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "Giao thức"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "Đặt lại Mật khẩu"
|
||||
msgid "Resolved"
|
||||
msgstr "Đã giải quyết"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "Chi tiết S.M.A.R.T."
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "Tự kiểm tra S.M.A.R.T."
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "Lưu {foo}"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "Lưu địa chỉ bằng cách sử dụng phím enter hoặc dấu ph
|
||||
msgid "Save Settings"
|
||||
msgstr "Lưu Cài đặt"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "Lưu Hệ thống"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "Được lưu trong cơ sở dữ liệu và không hết hạn cho đến khi bạn tắt nó."
|
||||
@@ -1833,6 +1878,7 @@ msgstr "Đăng nhập"
|
||||
msgid "SMTP settings"
|
||||
msgstr "Cài đặt SMTP"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "Sắp xếp theo"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "Sử dụng Hoán đổi"
|
||||
msgid "Switch theme"
|
||||
msgstr "Đổi giao diện"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "Tab"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "Mục tiêu"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "Tác vụ"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "Cập nhật"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "Sử dụng"
|
||||
msgid "Value"
|
||||
msgstr "Giá trị"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "Xem"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "Xem thêm"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "Xem 200 cảnh báo gần đây nhất của bạn."
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "Các cột hiển thị"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "Có"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "Cài đặt người dùng của bạn đã được cập nhật."
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: zh\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:22\n"
|
||||
"PO-Revision-Date: 2026-09-25 07:01\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Chinese Simplified\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, one {{countString} 小时} other {{countString} 小时}}
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} 分钟} few {{countString} 分钟} many {{countString} 分钟} other {{countString} 分钟}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr "{daysLeft, plural, other {# 天}}"
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "{diskName} I/O"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr "{numFailed, plural, other {# 个失败服务}}"
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# 线程} other {# 线程}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr "{totalCount, plural, other {# 个服务}}"
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1 小时"
|
||||
@@ -123,10 +135,10 @@ msgstr "启用的警报"
|
||||
msgid "Active state"
|
||||
msgstr "活动状态"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr "添加"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "活动状态"
|
||||
msgid "Add {foo}"
|
||||
msgstr "添加 {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "添加 系统"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "添加 URL"
|
||||
@@ -260,6 +279,7 @@ msgstr "GPU 引擎的平均利用率"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "平均、最小和最大响应时间"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "1 小时平均"
|
||||
@@ -383,6 +403,19 @@ msgstr "注意 - 潜在数据已经丢失"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "摄氏度 (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr "证书"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr "证书已过期 {expires}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr "证书将于 {expires} 过期"
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "更改指标的显示单位。"
|
||||
@@ -776,12 +809,15 @@ msgstr "持续时间"
|
||||
msgid "Edit"
|
||||
msgstr "编辑"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "编辑 {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "编辑 系统"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "未在<0>config.yml</0>中定义的客户端将被删除。请定期备
|
||||
msgid "Exited active"
|
||||
msgstr "退出活动状态"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr "已过期"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "将在一小时后,或Hub重启时失效。"
|
||||
@@ -887,10 +927,6 @@ msgstr "导出您当前的系统配置。"
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "华氏度 (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "失败"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "失败属性:"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "有可用的镜像更新"
|
||||
msgid "Inactive"
|
||||
msgstr "非活跃"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "丢包"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "1 小时丢包"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "手动设置说明"
|
||||
msgid "Max 1 min"
|
||||
msgstr "1分钟内最大值"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "1 小时最大"
|
||||
@@ -1234,6 +1273,7 @@ msgstr "内存使用率"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "容器内存使用量"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr "1 小时最小"
|
||||
@@ -1565,6 +1605,7 @@ msgstr "进程启动"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "协议"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "重置密码"
|
||||
msgid "Resolved"
|
||||
msgstr "已解决"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "S.M.A.R.T. 详情"
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "S.M.A.R.T. 自检"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "保存 {foo}"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "使用回车键或逗号保存地址。留空以禁用电子邮件通知
|
||||
msgid "Save Settings"
|
||||
msgstr "保存设置"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "保存 系统"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "保存在数据库中的数据,在您禁用之前不会过期。"
|
||||
@@ -1833,6 +1878,7 @@ msgstr "登录"
|
||||
msgid "SMTP settings"
|
||||
msgstr "SMTP 设置"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "排序依据"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "SWAP 使用率"
|
||||
msgid "Switch theme"
|
||||
msgstr "切换主题"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "标签页"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "目标"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr "目标[,协议[,端口[,间隔]]]"
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "任务数"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "更新"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "利用率"
|
||||
msgid "Value"
|
||||
msgstr "值"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "视图"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "查看更多"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "查看您最近的200个警报。"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "可见列"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "是"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "您的用户设置已更新。"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: zh\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:22\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:29\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Chinese Traditional, Hong Kong\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, one {{countString} 小時} other {{countString} 小時}}
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} 分鐘} few {{countString} 分鐘} many {{countString} 分鐘} other {{countString} 分鐘}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "{diskName} 的 I/O"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# 執行緒} other {# 執行緒}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1小時"
|
||||
@@ -123,10 +135,10 @@ msgstr "活動警報"
|
||||
msgid "Active state"
|
||||
msgstr "活動狀態"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "活動狀態"
|
||||
msgid "Add {foo}"
|
||||
msgstr "新增 {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "新增 系統"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "添加 URL"
|
||||
@@ -260,6 +279,7 @@ msgstr "GPU 引擎的平均利用率"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "平均、最小及最大回應時間"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "1 小時平均"
|
||||
@@ -383,6 +403,19 @@ msgstr "注意 - 可能遺失資料"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "攝氏 (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "更改指標的顯示單位。"
|
||||
@@ -776,12 +809,15 @@ msgstr "持續時間"
|
||||
msgid "Edit"
|
||||
msgstr "編輯"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "編輯 {foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "編輯 系統"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "未在<0>config.yml</0>中定義的現有系統將被刪除。請定期
|
||||
msgid "Exited active"
|
||||
msgstr "退出活動狀態"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "一小時後或重新啟動集線器時過期。"
|
||||
@@ -887,10 +927,6 @@ msgstr "匯出您現在的系統設定。"
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "華氏 (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "失敗"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "失敗屬性:"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "有可用的鏡像更新"
|
||||
msgid "Inactive"
|
||||
msgstr "未啟用"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "封包遺失"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "1 小時封包遺失率"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "手動設定說明"
|
||||
msgid "Max 1 min"
|
||||
msgstr "一分鐘內最大值"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "1 小時最大"
|
||||
@@ -1234,6 +1273,7 @@ msgstr "記憶體使用"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "容器記憶體使用量"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr "1 小時最小"
|
||||
@@ -1565,6 +1605,7 @@ msgstr "進程啟動"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "通訊協定"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "重設密碼"
|
||||
msgid "Resolved"
|
||||
msgstr "已解決"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "S.M.A.R.T. 詳情"
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "S.M.A.R.T. 自檢"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "儲存 {foo}"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "使用回車鍵或逗號保存地址。留空以禁用電子郵件通知
|
||||
msgid "Save Settings"
|
||||
msgstr "儲存設定"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "儲存 系統"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "儲存在資料庫中,在您停用之前不會過期。"
|
||||
@@ -1833,6 +1878,7 @@ msgstr "登錄"
|
||||
msgid "SMTP settings"
|
||||
msgstr "SMTP設置"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "排序依據"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "交換使用"
|
||||
msgid "Switch theme"
|
||||
msgstr "切換主題"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "分頁"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "目標"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "任務數"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "更新"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "利用率"
|
||||
msgid "Value"
|
||||
msgstr "值"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "檢視"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "查看更多"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "檢視最近 200 則警報。"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "可見欄位"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "是"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "您的用戶設置已更新。"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: zh\n"
|
||||
"Project-Id-Version: beszel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-09-18 19:22\n"
|
||||
"PO-Revision-Date: 2026-09-24 17:29\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Chinese Traditional\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
@@ -52,14 +52,26 @@ msgstr "{count, plural, one {{countString} 小時} other {{countString} 小時}}
|
||||
msgid "{count, plural, one {{countString} minute} few {{countString} minutes} many {{countString} minutes} other {{countString} minutes}}"
|
||||
msgstr "{count, plural, one {{countString} 分鐘} few {{countString} 分鐘} many {{countString} 分鐘} other {{countString} 分鐘}}"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "{daysLeft, plural, one {# day} other {# days}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/charts/disk-charts.tsx
|
||||
msgid "{diskName} I/O"
|
||||
msgstr "{diskName} I/O"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{numFailed, plural, one {# failed service} other {# failed services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system/info-bar.tsx
|
||||
msgid "{threads, plural, one {# thread} other {# threads}}"
|
||||
msgstr "{threads, plural, one {# 執行緒} other {# 執行緒}}"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "{totalCount, plural, one {# service} other {# services}}"
|
||||
msgstr ""
|
||||
|
||||
#: src/lib/utils.ts
|
||||
msgid "1 hour"
|
||||
msgstr "1小時"
|
||||
@@ -123,10 +135,10 @@ msgstr "活動警報"
|
||||
msgid "Active state"
|
||||
msgstr "活動狀態"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
@@ -136,6 +148,13 @@ msgstr "活動狀態"
|
||||
msgid "Add {foo}"
|
||||
msgstr "新增{foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Add System"
|
||||
msgstr "新增系統"
|
||||
|
||||
#: src/components/routes/settings/notifications.tsx
|
||||
msgid "Add URL"
|
||||
msgstr "新增 URL"
|
||||
@@ -260,6 +279,7 @@ msgstr "GPU 引擎的平均利用率"
|
||||
msgid "Average, minimum, and maximum response time"
|
||||
msgstr "平均、最小及最大回應時間"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Avg 1h"
|
||||
msgstr "1 小時平均"
|
||||
@@ -383,6 +403,19 @@ msgstr "注意 - 可能遺失資料"
|
||||
msgid "Celsius (°C)"
|
||||
msgstr "攝氏 (°C)"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expired {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
msgid "Certificate expires {expires}"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Change display units for metrics."
|
||||
msgstr "更改指標的顯示單位。"
|
||||
@@ -776,12 +809,15 @@ msgstr "持續時間"
|
||||
msgid "Edit"
|
||||
msgstr "編輯"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
msgid "Edit {foo}"
|
||||
msgstr "編輯{foo}"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Edit System"
|
||||
msgstr "編輯系統"
|
||||
|
||||
#: src/components/login/auth-form.tsx
|
||||
#: src/components/login/forgot-pass-form.tsx
|
||||
#: src/components/login/otp-forms.tsx
|
||||
@@ -867,6 +903,10 @@ msgstr "未在 <0>config.yml</0> 中定義的現有系統將會被刪除。請
|
||||
msgid "Exited active"
|
||||
msgstr "結束"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Expired"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Expires after one hour or on hub restart."
|
||||
msgstr "在一個小時後或者重新啟動 Hub 時過期。"
|
||||
@@ -887,10 +927,6 @@ msgstr "匯出您現在的系統設定。"
|
||||
msgid "Fahrenheit (°F)"
|
||||
msgstr "華氏 (°F)"
|
||||
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Failed"
|
||||
msgstr "失敗"
|
||||
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
msgid "Failed Attributes:"
|
||||
msgstr "失敗屬性:"
|
||||
@@ -1090,6 +1126,7 @@ msgstr "有可用的映像檔更新"
|
||||
msgid "Inactive"
|
||||
msgstr "未啟用"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/heartbeat.tsx
|
||||
msgid "Interval"
|
||||
@@ -1182,6 +1219,7 @@ msgctxt "Packet loss"
|
||||
msgid "Loss"
|
||||
msgstr "封包遺失"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Loss 1h"
|
||||
msgstr "1 小時封包遺失率"
|
||||
@@ -1204,6 +1242,7 @@ msgstr "手動設定說明"
|
||||
msgid "Max 1 min"
|
||||
msgstr "最多 1 分鐘"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Max 1h"
|
||||
msgstr "1 小時最大"
|
||||
@@ -1234,6 +1273,7 @@ msgstr "記憶體使用量"
|
||||
msgid "Memory usage of containers"
|
||||
msgstr "容器的記憶體使用量"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Min 1h"
|
||||
msgstr "1 小時最小"
|
||||
@@ -1565,6 +1605,7 @@ msgstr "進程啟動"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Protocol"
|
||||
msgstr "通訊協定"
|
||||
|
||||
@@ -1653,6 +1694,7 @@ msgstr "重設密碼"
|
||||
msgid "Resolved"
|
||||
msgstr "已解決"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/charts/monitors-charts.tsx
|
||||
msgid "Response"
|
||||
@@ -1698,7 +1740,6 @@ msgstr "S.M.A.R.T. 詳細資訊"
|
||||
msgid "S.M.A.R.T. Self-Test"
|
||||
msgstr "S.M.A.R.T. 自我測試"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "Save {foo}"
|
||||
msgstr "儲存 {foo}"
|
||||
@@ -1712,6 +1753,10 @@ msgstr "使用 Enter 鍵或逗號儲存地址。留空以停用電子郵件通
|
||||
msgid "Save Settings"
|
||||
msgstr "儲存設定"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
msgid "Save System"
|
||||
msgstr "儲存 系統"
|
||||
|
||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||
msgid "Saved in the database and does not expire until you disable it."
|
||||
msgstr "儲存在資料庫中,在您停用之前不會過期。"
|
||||
@@ -1833,6 +1878,7 @@ msgstr "登入"
|
||||
msgid "SMTP settings"
|
||||
msgstr "SMTP 設定"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Sort By"
|
||||
msgstr "排序"
|
||||
@@ -1875,12 +1921,11 @@ msgstr "交換空間使用量"
|
||||
msgid "Switch theme"
|
||||
msgstr "切換主題"
|
||||
|
||||
#: src/components/add-system.tsx
|
||||
#: src/components/alerts-history-columns.tsx
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/navbar.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
#: src/components/routes/settings/quiet-hours.tsx
|
||||
@@ -1925,9 +1970,15 @@ msgstr "分頁"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
msgid "Target"
|
||||
msgstr "目標"
|
||||
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
#: src/components/network-monitors-table/monitor-dialog.tsx
|
||||
msgid "target[,protocol[,port[,interval]]]"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systemd-table/systemd-table.tsx
|
||||
msgid "Tasks"
|
||||
msgstr "任務數"
|
||||
@@ -2162,6 +2213,7 @@ msgstr "更新"
|
||||
|
||||
#: src/components/containers-table/containers-table-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/network-monitors-table/network-monitors-columns.tsx
|
||||
#: src/components/routes/system/smart-table.tsx
|
||||
#: src/components/routes/system/storage-pools-table.tsx
|
||||
#: src/components/systemd-table/systemd-table-columns.tsx
|
||||
@@ -2217,6 +2269,7 @@ msgstr "利用率"
|
||||
msgid "Value"
|
||||
msgstr "值"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "View"
|
||||
msgstr "檢視"
|
||||
@@ -2231,6 +2284,7 @@ msgstr "查看更多"
|
||||
msgid "View your 200 most recent alerts."
|
||||
msgstr "檢視最近 200 則警報。"
|
||||
|
||||
#: src/components/network-monitors-table/network-monitors-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Visible Fields"
|
||||
msgstr "顯示欄位"
|
||||
@@ -2305,3 +2359,4 @@ msgstr "是"
|
||||
#: src/components/routes/settings/layout.tsx
|
||||
msgid "Your user settings have been updated."
|
||||
msgstr "已更新您的使用者設定"
|
||||
|
||||
|
||||
14
internal/site/src/types.d.ts
vendored
14
internal/site/src/types.d.ts
vendored
@@ -361,7 +361,8 @@ export interface ChartTimeData {
|
||||
}
|
||||
|
||||
export interface UserSettings {
|
||||
chartTime: ChartTimes
|
||||
/** may be missing in settings stored by older versions -- use getUserChartTime() */
|
||||
chartTime?: ChartTimes
|
||||
emails?: string[]
|
||||
webhooks?: string[]
|
||||
unitTemp?: Unit
|
||||
@@ -376,6 +377,9 @@ export interface UserSettings {
|
||||
statusFilter?: "all" | "up" | "down" | "paused" | "pending"
|
||||
viewMode?: "table" | "grid"
|
||||
sortMode?: Array<{ id: string; desc: boolean }>
|
||||
monitorCols?: Record<string, boolean>
|
||||
monitorSortMode?: Array<{ id: string; desc: boolean }>
|
||||
monitorSortModeSystem?: Array<{ id: string; desc: boolean }>
|
||||
grid?: boolean
|
||||
displayMode?: "default" | "tabs"
|
||||
}
|
||||
@@ -648,9 +652,17 @@ export interface NetworkMonitorRecord {
|
||||
loss1h: number
|
||||
interval: number
|
||||
enabled: boolean
|
||||
/** Latest TLS certificate details, reported for HTTPS targets. */
|
||||
certInfo?: MonitorCertInfo | null
|
||||
updated: string
|
||||
}
|
||||
|
||||
/** Leaf TLS certificate details reported by the agent. Timestamps are Unix milliseconds. */
|
||||
export interface MonitorCertInfo {
|
||||
expires: number
|
||||
issuer?: string
|
||||
}
|
||||
|
||||
/** Response times in microseconds and packet loss percentage (0-100). */
|
||||
export interface MonitorStats {
|
||||
res_avg: number
|
||||
|
||||
41
internal/site/tests/chart-time.test.ts
Normal file
41
internal/site/tests/chart-time.test.ts
Normal file
@@ -0,0 +1,41 @@
|
||||
import { beforeEach, describe, expect, mock, test } from "bun:test"
|
||||
import type { UserSettings } from "../src/types"
|
||||
|
||||
// lib/api needs a browser and the lingui macro transform, and stores only uses pb for the auth record
|
||||
mock.module("../src/lib/api", () => ({ pb: { authStore: { isValid: false, record: null } } }))
|
||||
|
||||
const { $chartTime, $userSettings, defaultChartTime, getUserChartTime, hydrateUserSettings } = await import(
|
||||
"../src/lib/stores"
|
||||
)
|
||||
|
||||
describe("chart time from user settings", () => {
|
||||
beforeEach(() => {
|
||||
$chartTime.set(defaultChartTime)
|
||||
})
|
||||
|
||||
test("hydration uses the stored chart time", () => {
|
||||
hydrateUserSettings({ chartTime: "24h", emails: [] } as UserSettings)
|
||||
expect($chartTime.get()).toBe("24h")
|
||||
})
|
||||
|
||||
test("hydration falls back to the default when settings have no chart time", () => {
|
||||
$chartTime.set("24h")
|
||||
hydrateUserSettings({ emails: [] } as UserSettings)
|
||||
expect($chartTime.get()).toBe(defaultChartTime)
|
||||
expect(getUserChartTime()).toBe(defaultChartTime)
|
||||
})
|
||||
|
||||
test("hydration falls back to the default when the stored chart time is empty", () => {
|
||||
$chartTime.set("24h")
|
||||
hydrateUserSettings({ chartTime: "", emails: [] } as unknown as UserSettings)
|
||||
expect($chartTime.get()).toBe(defaultChartTime)
|
||||
expect(getUserChartTime()).toBe(defaultChartTime)
|
||||
})
|
||||
|
||||
test("other settings writes don't change the active chart time", () => {
|
||||
$chartTime.set("12h")
|
||||
$userSettings.set({ chartTime: "24h", emails: [], grid: true } as UserSettings)
|
||||
$userSettings.setKey("chartTime", "7d")
|
||||
expect($chartTime.get()).toBe("12h")
|
||||
})
|
||||
})
|
||||
@@ -15,9 +15,10 @@ It has a friendly web interface, simple configuration, and is ready to use out o
|
||||
|
||||
- **Lightweight**: Smaller and less resource-intensive than leading solutions.
|
||||
- **Simple**: Easy setup with little manual configuration required.
|
||||
- **Alerts**: Configurable alerts for most metrics. Supports many notification services.
|
||||
- **Docker stats**: Tracks CPU, memory, and network usage history for each container.
|
||||
- **ZFS**: Tracks pool capacity, health, and I/O, plus per-dataset usage.
|
||||
- **Alerts**: Configurable alerts for CPU, memory, disk, bandwidth, temperature, fan speed, load average, and status.
|
||||
- **Network monitoring**: Monitor response time and interruptions directly from agents.
|
||||
- **S.M.A.R.T.**: Disk health data and notifications on drive failure.
|
||||
- **Multi-user**: Users manage their own systems. Admins can share systems across users.
|
||||
- **OAuth / OIDC**: Supports many OAuth2 providers. Password auth can be disabled.
|
||||
- **Automatic backups**: Save to and restore from disk or S3-compatible storage.
|
||||
@@ -51,7 +52,7 @@ The [quick start guide](https://beszel.dev/guide/getting-started) and other docu
|
||||
- **Temperature** - Host system sensors.
|
||||
- **Fan speed** - Host system sensors (Linux, via `/sys/class/hwmon`).
|
||||
- **GPU usage / power draw** - Nvidia, AMD, and Intel.
|
||||
- **Battery** - Host system battery charge.
|
||||
- **Battery charge** - Host system and some peripherals.
|
||||
- **Containers** - Status and metrics of all running Docker / Podman containers.
|
||||
- **S.M.A.R.T.** - Host system disk health (includes eMMC wear/EOL and Linux mdraid array health via sysfs when available).
|
||||
- **ZFS** - Pool capacity, usage, health, I/O throughput, scrub status, and per-dataset usage.
|
||||
|
||||
@@ -2,9 +2,9 @@ apiVersion: v1
|
||||
description: Installs beszel-agent in kubernetes
|
||||
home: https://github.com/henrygd/beszel/tree/main/supplemental/helm/beszel-agent
|
||||
name: beszel-agent
|
||||
appVersion: "0.19.0"
|
||||
appVersion: "0.20.0"
|
||||
# Bump this version when publishing chart changes.
|
||||
version: 0.1.6
|
||||
version: 0.1.7
|
||||
sources:
|
||||
- https://github.com/henrygd/beszel/tree/main/supplemental/helm/beszel-agent
|
||||
- https://www.beszel.dev/
|
||||
|
||||
@@ -80,7 +80,7 @@ Essential parameters to configure:
|
||||
| `secret.sshKey` | `ssh-key` | Key name in the secret for the SSH public key |
|
||||
| `secret.tokenKey` | `token` | Key name in the secret for the authentication token |
|
||||
| `image.repository` | `henrygd/beszel-agent` | Container image |
|
||||
| `image.tag` | Chart AppVersion (0.19.0) | Image version |
|
||||
| `image.tag` | Chart AppVersion (0.20.0) | Image version |
|
||||
| `hostNetwork` | `false` | Use host network for network monitoring |
|
||||
| `tolerations` | Allows all taints | Tolerations for running on tainted nodes |
|
||||
|
||||
@@ -385,7 +385,7 @@ helm upgrade beszel-agent ./beszel-agent \
|
||||
|
||||
# Change image version
|
||||
helm upgrade beszel-agent ./beszel-agent \
|
||||
--set image.tag="0.19.0"
|
||||
--set image.tag="0.20.0"
|
||||
```
|
||||
|
||||
### Restart All Agents
|
||||
@@ -522,7 +522,7 @@ kubectl get secret beszel-agent -o jsonpath='{.data.ssh-key}' | base64 -d
|
||||
## Chart Information
|
||||
|
||||
- **Chart Version**: 0.1.0
|
||||
- **App Version**: 0.19.0
|
||||
- **App Version**: 0.20.0
|
||||
- **Kubernetes Version**: 1.19+
|
||||
- **Maintainer**: cloudwithdan (nikoloskid@pm.me)
|
||||
|
||||
|
||||
@@ -2,9 +2,9 @@ apiVersion: v1
|
||||
description: Installs beszel-hub in kubernetes
|
||||
home: https://github.com/henrygd/beszel/tree/main/supplemental/helm/beszel-hub
|
||||
name: beszel-hub
|
||||
appVersion: "0.19.0"
|
||||
appVersion: "0.20.0"
|
||||
# Bump this version when publishing chart changes.
|
||||
version: 0.1.6
|
||||
version: 0.1.7
|
||||
sources:
|
||||
- https://github.com/henrygd/beszel/tree/main/supplemental/helm/beszel-hub
|
||||
- https://www.beszel.dev/
|
||||
|
||||
@@ -47,7 +47,7 @@ Key configuration options in `values.yaml`:
|
||||
|-----------|---------|-------------|
|
||||
| `replicaCount` | `1` | Number of Beszel Hub replicas |
|
||||
| `image.repository` | `henrygd/beszel` | Container image repository |
|
||||
| `image.tag` | Chart AppVersion (0.19.0) | Container image tag |
|
||||
| `image.tag` | Chart AppVersion (0.20.0) | Container image tag |
|
||||
| `image.pullPolicy` | `IfNotPresent` | Image pull policy |
|
||||
| `service.port` | `8090` | Service port |
|
||||
| `persistentVolumeClaim.enabled` | `true` | Enable persistent volume |
|
||||
@@ -169,7 +169,7 @@ tolerations:
|
||||
```yaml
|
||||
replicaCount: 3
|
||||
image:
|
||||
tag: "0.19.0"
|
||||
tag: "0.20.0"
|
||||
service:
|
||||
type: LoadBalancer
|
||||
ingress:
|
||||
@@ -330,7 +330,7 @@ By default, Beszel Hub uses a PersistentVolumeClaim for data storage. Ensure you
|
||||
## Chart Information
|
||||
|
||||
- **Chart Version**: 0.1.0
|
||||
- **App Version**: 0.19.0
|
||||
- **App Version**: 0.20.0
|
||||
- **Kubernetes Version**: 1.19+
|
||||
- **Maintainer**: cloudwithdan (nikoloskid@pm.me)
|
||||
|
||||
|
||||
@@ -298,6 +298,94 @@ warn() {
|
||||
echo "Warning: $*" >&2
|
||||
}
|
||||
|
||||
# Keep IDs within 16 bits, including on older OpenWrt versions whose account
|
||||
# helpers start automatic allocation at 65536.
|
||||
openwrt_unused_id() {
|
||||
awk -F: '
|
||||
{ used[$3] = 1 }
|
||||
END {
|
||||
for (id = 32768; id < 65534; id++) {
|
||||
if (!(id in used)) { print id; exit }
|
||||
}
|
||||
exit 1
|
||||
}
|
||||
' "$1"
|
||||
}
|
||||
|
||||
validate_openwrt_account() {
|
||||
# Duplicate numeric IDs share permissions even when the names differ.
|
||||
for account_file in /etc/passwd /etc/group; do
|
||||
if ! awk -F: '
|
||||
$1 == "beszel" { id = $3; count++ }
|
||||
{ ids[$3]++ }
|
||||
END { if (count && (count != 1 || id == 0 || ids[id] != 1)) exit 1 }
|
||||
' "$account_file"; then
|
||||
fail "The beszel account has a duplicate or root ID in $account_file. Stop beszel-agent and assign beszel an unused UID/GID before reinstalling. Update ownership only in $AGENT_DIR; do not change all files owned by the shared ID."
|
||||
fi
|
||||
done
|
||||
if grep -q '^beszel:' /etc/passwd; then
|
||||
account_gid=$(awk -F: '$1 == "beszel" { print $4 }' /etc/passwd)
|
||||
group_gid=$(awk -F: '$1 == "beszel" { print $3 }' /etc/group)
|
||||
[ "$account_gid" = "$group_gid" ] || fail "The beszel user's primary group is not the dedicated beszel group. Repair the account before reinstalling."
|
||||
fi
|
||||
}
|
||||
|
||||
configure_openwrt_account() (
|
||||
validate_openwrt_account
|
||||
[ -r /lib/functions.sh ] || fail "OpenWrt account helpers (/lib/functions.sh) are required."
|
||||
# OpenWrt's library expects unset variables and defines generic functions.
|
||||
# Source it in a subshell so neither affects the rest of the installer.
|
||||
set +u
|
||||
. /lib/functions.sh
|
||||
IPKG_INSTROOT=""
|
||||
|
||||
if ! grep -q '^beszel:' /etc/group; then
|
||||
account_gid=$(openwrt_unused_id /etc/group) || fail "No unused service GID available."
|
||||
group_add beszel "$account_gid" || fail "Could not create the beszel group."
|
||||
fi
|
||||
account_gid=$(awk -F: '$1 == "beszel" { print $3 }' /etc/group)
|
||||
[ -n "$account_gid" ] || fail "The beszel group was not created."
|
||||
if ! grep -q '^beszel:' /etc/passwd; then
|
||||
account_uid=$(openwrt_unused_id /etc/passwd) || fail "No unused service UID available."
|
||||
user_add beszel "$account_uid" "$account_gid" "Beszel agent" /nonexistent /bin/false || fail "Could not create the beszel user."
|
||||
fi
|
||||
grep -q '^beszel:' /etc/passwd || fail "The beszel account is incomplete."
|
||||
validate_openwrt_account
|
||||
# Previous installers omitted the shadow entry. Repair it with a locked
|
||||
# password, without rewriting an existing account or changing its IDs.
|
||||
if ! grep -q '^beszel:' /etc/shadow; then
|
||||
lock /var/lock/passwd || fail "Could not lock the account database."
|
||||
shadow_status=0
|
||||
if ! grep -q '^beszel:' /etc/shadow; then
|
||||
printf 'beszel:!:0:0:99999:7:::\n' >> /etc/shadow || shadow_status=$?
|
||||
fi
|
||||
lock -u /var/lock/passwd || fail "Could not unlock the account database."
|
||||
[ "$shadow_status" -eq 0 ] || fail "Could not create the beszel shadow entry."
|
||||
fi
|
||||
|
||||
if grep -q '^docker:' /etc/group; then
|
||||
# Match complete member names and avoid a leading comma for empty groups.
|
||||
if ! awk -F: '$1 == "docker" { n = split($4, members, ","); for (i = 1; i <= n; i++) if (members[i] == "beszel") found = 1 } END { exit !found }' /etc/group; then
|
||||
echo "Adding beszel to docker group"
|
||||
if grep -q '^docker:[^:]*:[^:]*:$' /etc/group; then
|
||||
sed -i '/^docker:/s/$/beszel/' /etc/group
|
||||
else
|
||||
sed -i '/^docker:/s/$/,beszel/' /etc/group
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
)
|
||||
|
||||
remove_openwrt_account() {
|
||||
if command -v userdel >/dev/null 2>&1; then
|
||||
userdel beszel || fail "Could not remove the beszel user."
|
||||
elif command -v deluser >/dev/null 2>&1; then
|
||||
deluser beszel || fail "Could not remove the beszel user."
|
||||
else
|
||||
warn "Neither userdel nor deluser is available; the beszel account has been retained."
|
||||
fi
|
||||
}
|
||||
|
||||
require_value() {
|
||||
[ "$#" -ge 2 ] && [ -n "$2" ] || fail "Option $1 requires a value."
|
||||
}
|
||||
@@ -672,7 +760,9 @@ if [ "$UNINSTALL" = true ]; then
|
||||
echo "Removing the dedicated user for the agent service..."
|
||||
killall beszel-agent 2>/dev/null || true # Usually already stopped by the service manager.
|
||||
if id -u beszel >/dev/null 2>&1; then
|
||||
if is_alpine || is_openwrt; then
|
||||
if is_openwrt; then
|
||||
remove_openwrt_account
|
||||
elif is_alpine; then
|
||||
deluser beszel || fail "Could not remove the beszel user."
|
||||
elif is_freebsd; then
|
||||
pw user del beszel || fail "Could not remove the beszel user."
|
||||
@@ -772,32 +862,7 @@ if is_alpine; then
|
||||
fi
|
||||
|
||||
elif is_openwrt; then
|
||||
# Create beszel group first if it doesn't exist (check /etc/group directly)
|
||||
if ! grep -q "^beszel:" /etc/group >/dev/null 2>&1; then
|
||||
echo "beszel:x:999:" >> /etc/group
|
||||
fi
|
||||
|
||||
# Create beszel user if it doesn't exist (double-check to prevent duplicates)
|
||||
if ! id -u beszel >/dev/null 2>&1 && ! grep -q "^beszel:" /etc/passwd >/dev/null 2>&1; then
|
||||
echo "beszel:x:999:999::/nonexistent:/bin/false" >> /etc/passwd
|
||||
fi
|
||||
|
||||
# Add the user to the docker group if docker group exists and user is not already in it
|
||||
if grep -q "^docker:" /etc/group >/dev/null 2>&1; then
|
||||
echo "Adding beszel to docker group"
|
||||
# Check if beszel is already in docker group
|
||||
if ! grep "^docker:" /etc/group | grep -q "beszel"; then
|
||||
# Add beszel to docker group by modifying /etc/group
|
||||
# Handle both cases: group with existing members and group without members
|
||||
if grep "^docker:" /etc/group | grep -q ":.*:.*$"; then
|
||||
# Group has existing members, append with comma
|
||||
sed -i 's/^docker:\([^:]*:[^:]*:\)\(.*\)$/docker:\1\2,beszel/' /etc/group
|
||||
else
|
||||
# Group has no members, just append
|
||||
sed -i 's/^docker:\([^:]*:[^:]*:\)$/docker:\1beszel/' /etc/group
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
configure_openwrt_account
|
||||
|
||||
elif is_freebsd; then
|
||||
if is_opnsense || is_pfsense; then
|
||||
|
||||
Reference in New Issue
Block a user