mirror of
https://github.com/henrygd/beszel.git
synced 2026-03-23 14:06:18 +01:00
Compare commits
76 Commits
v0.12.0-be
...
nvidia-age
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
99c7f7bd8a | ||
|
|
8af3a0eb5b | ||
|
|
5f7950b474 | ||
|
|
df9e2dec28 | ||
|
|
a0f271545a | ||
|
|
aa2bc9f118 | ||
|
|
b22ae87022 | ||
|
|
79e79079bc | ||
|
|
1811ebdee4 | ||
|
|
137f3f3e24 | ||
|
|
ed1d1e77c0 | ||
|
|
8c36dd1caa | ||
|
|
57bfe72486 | ||
|
|
75f66b0246 | ||
|
|
ce93d54aa7 | ||
|
|
39dbe0eac5 | ||
|
|
7282044f80 | ||
|
|
d77c37c0b0 | ||
|
|
e362cbbca5 | ||
|
|
118544926b | ||
|
|
d4bb0a0a30 | ||
|
|
fe5e35d1a9 | ||
|
|
60a6ae2caa | ||
|
|
80338d36aa | ||
|
|
f0d2c242e8 | ||
|
|
559f83d99c | ||
|
|
d3a751ee6c | ||
|
|
fb70a166fa | ||
|
|
c12457b707 | ||
|
|
3e53d73d56 | ||
|
|
80338c5e98 | ||
|
|
249cd8ad19 | ||
|
|
ccdff46370 | ||
|
|
91679b5cc0 | ||
|
|
6953edf59e | ||
|
|
b91c77ec92 | ||
|
|
3ac0b185d1 | ||
|
|
1e675cabb5 | ||
|
|
5f44965c2c | ||
|
|
f080929296 | ||
|
|
f055658eba | ||
|
|
e430c747fe | ||
|
|
ca62b1db36 | ||
|
|
38569b7057 | ||
|
|
203244090f | ||
|
|
2bed722045 | ||
|
|
13f3a52760 | ||
|
|
16b9827c70 | ||
|
|
0fc352d7fc | ||
|
|
8a2bee11d4 | ||
|
|
485f7d16ff | ||
|
|
46fdc94cb8 | ||
|
|
261f7fb76c | ||
|
|
18d9258907 | ||
|
|
9d7fb8ab80 | ||
|
|
3730a78e5a | ||
|
|
7cdd0907e8 | ||
|
|
3586f73f30 | ||
|
|
752ccc6beb | ||
|
|
f577476c81 | ||
|
|
49ae424698 | ||
|
|
d4fd19522b | ||
|
|
5c047e4afd | ||
|
|
6576141f54 | ||
|
|
926e807020 | ||
|
|
d91847c6c5 | ||
|
|
0abd88270c | ||
|
|
806c4e51c5 | ||
|
|
6520783fe9 | ||
|
|
48c8a3a4a5 | ||
|
|
e0c839f78c | ||
|
|
1ba362bafe | ||
|
|
b5d55ead4a | ||
|
|
4f879ccc66 | ||
|
|
cd9e0f7b5b | ||
|
|
780644eeae |
47
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
47
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@@ -1,8 +1,19 @@
|
|||||||
name: 🐛 Bug report
|
name: 🐛 Bug report
|
||||||
description: Report a new bug or issue.
|
description: Report a new bug or issue.
|
||||||
title: '[Bug]: '
|
title: '[Bug]: '
|
||||||
labels: ['bug']
|
labels: ['bug', "needs confirmation"]
|
||||||
body:
|
body:
|
||||||
|
- type: dropdown
|
||||||
|
id: component
|
||||||
|
attributes:
|
||||||
|
label: Component
|
||||||
|
description: Which part of Beszel is this about?
|
||||||
|
options:
|
||||||
|
- Hub
|
||||||
|
- Agent
|
||||||
|
- Hub & Agent
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
- type: markdown
|
- type: markdown
|
||||||
attributes:
|
attributes:
|
||||||
value: |
|
value: |
|
||||||
@@ -43,6 +54,39 @@ body:
|
|||||||
3. Pour it into a cup.
|
3. Pour it into a cup.
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
id: category
|
||||||
|
attributes:
|
||||||
|
label: Category
|
||||||
|
description: Which category does this relate to most?
|
||||||
|
options:
|
||||||
|
- Metrics
|
||||||
|
- Charts & Visualization
|
||||||
|
- Settings & Configuration
|
||||||
|
- Notifications & Alerts
|
||||||
|
- Authentication
|
||||||
|
- Installation
|
||||||
|
- Performance
|
||||||
|
- UI / UX
|
||||||
|
- Other
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
id: metrics
|
||||||
|
attributes:
|
||||||
|
label: Affected Metrics
|
||||||
|
description: If applicable, which specific metric does this relate to most?
|
||||||
|
options:
|
||||||
|
- CPU
|
||||||
|
- Memory
|
||||||
|
- Storage
|
||||||
|
- Network
|
||||||
|
- Containers
|
||||||
|
- GPU
|
||||||
|
- Sensors
|
||||||
|
- Other
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
- type: input
|
- type: input
|
||||||
id: system
|
id: system
|
||||||
attributes:
|
attributes:
|
||||||
@@ -61,7 +105,6 @@ body:
|
|||||||
id: install-method
|
id: install-method
|
||||||
attributes:
|
attributes:
|
||||||
label: Installation method
|
label: Installation method
|
||||||
default: 0
|
|
||||||
options:
|
options:
|
||||||
- Docker
|
- Docker
|
||||||
- Binary
|
- Binary
|
||||||
|
|||||||
60
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
60
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
@@ -1,8 +1,19 @@
|
|||||||
name: 🚀 Feature request
|
name: 🚀 Feature request
|
||||||
description: Request a new feature or change.
|
description: Request a new feature or change.
|
||||||
title: "[Feature]: "
|
title: "[Feature]: "
|
||||||
labels: ["enhancement"]
|
labels: ["enhancement", "needs review"]
|
||||||
body:
|
body:
|
||||||
|
- type: dropdown
|
||||||
|
id: component
|
||||||
|
attributes:
|
||||||
|
label: Component
|
||||||
|
description: Which part of Beszel is this about?
|
||||||
|
options:
|
||||||
|
- Hub
|
||||||
|
- Agent
|
||||||
|
- Hub & Agent
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
- type: markdown
|
- type: markdown
|
||||||
attributes:
|
attributes:
|
||||||
value: Before submitting, please search existing [issues](https://github.com/henrygd/beszel/issues) and [discussions](https://github.com/henrygd/beszel/discussions) (including closed).
|
value: Before submitting, please search existing [issues](https://github.com/henrygd/beszel/issues) and [discussions](https://github.com/henrygd/beszel/discussions) (including closed).
|
||||||
@@ -11,8 +22,55 @@ body:
|
|||||||
label: Describe the feature you would like to see
|
label: Describe the feature you would like to see
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: motivation
|
||||||
|
attributes:
|
||||||
|
label: Motivation / Use Case
|
||||||
|
description: Why do you want this feature? What problem does it solve?
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Describe how you would like to see this feature implemented
|
label: Describe how you would like to see this feature implemented
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: logs
|
||||||
|
attributes:
|
||||||
|
label: Screenshots
|
||||||
|
description: Please attach any relevant screenshots, such as images from your current solution or similar implementations.
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: dropdown
|
||||||
|
id: category
|
||||||
|
attributes:
|
||||||
|
label: Category
|
||||||
|
description: Which category does this relate to most?
|
||||||
|
options:
|
||||||
|
- Metrics
|
||||||
|
- Charts & Visualization
|
||||||
|
- Settings & Configuration
|
||||||
|
- Notifications & Alerts
|
||||||
|
- Authentication
|
||||||
|
- Installation
|
||||||
|
- Performance
|
||||||
|
- UI / UX
|
||||||
|
- Other
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
id: metrics
|
||||||
|
attributes:
|
||||||
|
label: Affected Metrics
|
||||||
|
description: If applicable, which specific metric does this relate to most?
|
||||||
|
options:
|
||||||
|
- CPU
|
||||||
|
- Memory
|
||||||
|
- Storage
|
||||||
|
- Network
|
||||||
|
- Containers
|
||||||
|
- GPU
|
||||||
|
- Sensors
|
||||||
|
- Other
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
33
.github/pull_request_template.md
vendored
Normal file
33
.github/pull_request_template.md
vendored
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
## 📃 Description
|
||||||
|
|
||||||
|
A short description of the pull request changes should go here and the sections below should list in detail all changes. You can remove the sections you don't need.
|
||||||
|
|
||||||
|
## 📖 Documentation
|
||||||
|
|
||||||
|
Add a link to the PR for [documentation](https://github.com/henrygd/beszel-docs) changes.
|
||||||
|
|
||||||
|
## 🪵 Changelog
|
||||||
|
|
||||||
|
### ➕ Added
|
||||||
|
|
||||||
|
- one
|
||||||
|
- two
|
||||||
|
|
||||||
|
### ✏️ Changed
|
||||||
|
|
||||||
|
- one
|
||||||
|
- two
|
||||||
|
|
||||||
|
### 🔧 Fixed
|
||||||
|
|
||||||
|
- one
|
||||||
|
- two
|
||||||
|
|
||||||
|
### 🗑️ Removed
|
||||||
|
|
||||||
|
- one
|
||||||
|
- two
|
||||||
|
|
||||||
|
## 📷 Screenshots
|
||||||
|
|
||||||
|
If this PR has any UI/UX changes it's strongly suggested you add screenshots here.
|
||||||
19
.github/workflows/docker-images.yml
vendored
19
.github/workflows/docker-images.yml
vendored
@@ -21,6 +21,14 @@ jobs:
|
|||||||
- image: henrygd/beszel-agent
|
- image: henrygd/beszel-agent
|
||||||
context: ./beszel
|
context: ./beszel
|
||||||
dockerfile: ./beszel/dockerfile_Agent
|
dockerfile: ./beszel/dockerfile_Agent
|
||||||
|
target: default-agent
|
||||||
|
registry: docker.io
|
||||||
|
username_secret: DOCKERHUB_USERNAME
|
||||||
|
password_secret: DOCKERHUB_TOKEN
|
||||||
|
- image: henrygd/beszel-agent-nvidia
|
||||||
|
context: ./beszel
|
||||||
|
dockerfile: ./beszel/dockerfile_Agent
|
||||||
|
target: nvidia-agent
|
||||||
registry: docker.io
|
registry: docker.io
|
||||||
username_secret: DOCKERHUB_USERNAME
|
username_secret: DOCKERHUB_USERNAME
|
||||||
password_secret: DOCKERHUB_TOKEN
|
password_secret: DOCKERHUB_TOKEN
|
||||||
@@ -33,6 +41,14 @@ jobs:
|
|||||||
- image: ghcr.io/${{ github.repository }}/beszel-agent
|
- image: ghcr.io/${{ github.repository }}/beszel-agent
|
||||||
context: ./beszel
|
context: ./beszel
|
||||||
dockerfile: ./beszel/dockerfile_Agent
|
dockerfile: ./beszel/dockerfile_Agent
|
||||||
|
target: default-agent
|
||||||
|
registry: ghcr.io
|
||||||
|
username: ${{ github.actor }}
|
||||||
|
password_secret: GITHUB_TOKEN
|
||||||
|
- image: ghcr.io/${{ github.repository }}/beszel-agent-nvidia
|
||||||
|
context: ./beszel
|
||||||
|
dockerfile: ./beszel/dockerfile_Agent
|
||||||
|
target: nvidia-agent
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.actor }}
|
username: ${{ github.actor }}
|
||||||
password_secret: GITHUB_TOKEN
|
password_secret: GITHUB_TOKEN
|
||||||
@@ -65,7 +81,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
images: ${{ matrix.image }}
|
images: ${{ matrix.image }}
|
||||||
tags: |
|
tags: |
|
||||||
type=edge,enable=true
|
type=raw,value=edge
|
||||||
type=semver,pattern={{version}}
|
type=semver,pattern={{version}}
|
||||||
type=semver,pattern={{major}}.{{minor}}
|
type=semver,pattern={{major}}.{{minor}}
|
||||||
type=semver,pattern={{major}}
|
type=semver,pattern={{major}}
|
||||||
@@ -91,3 +107,4 @@ jobs:
|
|||||||
push: ${{ github.ref_type == 'tag' }}
|
push: ${{ github.ref_type == 'tag' }}
|
||||||
tags: ${{ steps.metadata.outputs.tags }}
|
tags: ${{ steps.metadata.outputs.tags }}
|
||||||
labels: ${{ steps.metadata.outputs.labels }}
|
labels: ${{ steps.metadata.outputs.labels }}
|
||||||
|
target: ${{ matrix.target }}
|
||||||
|
|||||||
43
.github/workflows/inactivity-actions.yml
vendored
Normal file
43
.github/workflows/inactivity-actions.yml
vendored
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
name: 'Issue and PR Maintenance'
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 0 * * *' # runs at midnight UTC
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
close-stale:
|
||||||
|
name: Close Stale Issues
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
steps:
|
||||||
|
- name: Close Stale Issues
|
||||||
|
uses: actions/stale@v9
|
||||||
|
with:
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
# Messaging
|
||||||
|
stale-issue-message: >
|
||||||
|
👋 This issue has been automatically marked as stale due to inactivity.
|
||||||
|
If this issue is still relevant, please comment to keep it open.
|
||||||
|
Without activity, it will be closed in 7 days.
|
||||||
|
|
||||||
|
close-issue-message: >
|
||||||
|
🔒 This issue has been automatically closed due to prolonged inactivity.
|
||||||
|
Feel free to open a new issue if you have further questions or concerns.
|
||||||
|
|
||||||
|
# Timing
|
||||||
|
days-before-issue-stale: 14
|
||||||
|
days-before-issue-close: 7
|
||||||
|
|
||||||
|
# Labels
|
||||||
|
stale-issue-label: 'stale'
|
||||||
|
remove-stale-when-updated: true
|
||||||
|
only-issue-labels: 'awaiting-requester'
|
||||||
|
|
||||||
|
# Exemptions
|
||||||
|
exempt-assignees: true
|
||||||
|
exempt-milestones: true
|
||||||
82
.github/workflows/label-from-dropdown.yml
vendored
Normal file
82
.github/workflows/label-from-dropdown.yml
vendored
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
name: Label issues from dropdowns
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [opened]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
label_from_dropdown:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
steps:
|
||||||
|
- name: Apply labels based on dropdown choices
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
|
||||||
|
const issueNumber = context.issue.number;
|
||||||
|
const owner = context.repo.owner;
|
||||||
|
const repo = context.repo.repo;
|
||||||
|
|
||||||
|
// Get the issue body
|
||||||
|
const body = context.payload.issue.body;
|
||||||
|
|
||||||
|
// Helper to find dropdown value in the body (assuming markdown format)
|
||||||
|
function extractSectionValue(heading) {
|
||||||
|
const regex = new RegExp(`### ${heading}\\s+([\\s\\S]*?)(?:\\n###|$)`, 'i');
|
||||||
|
const match = body.match(regex);
|
||||||
|
if (match) {
|
||||||
|
// Get the first non-empty line after the heading
|
||||||
|
const lines = match[1].split('\n').map(l => l.trim()).filter(Boolean);
|
||||||
|
return lines[0] || null;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extract dropdown selections
|
||||||
|
const category = extractSectionValue('Category');
|
||||||
|
const metrics = extractSectionValue('Affected Metrics');
|
||||||
|
const component = extractSectionValue('Component');
|
||||||
|
|
||||||
|
// Build labels to add
|
||||||
|
let labelsToAdd = [];
|
||||||
|
if (category) labelsToAdd.push(category);
|
||||||
|
if (metrics) labelsToAdd.push(metrics);
|
||||||
|
if (component) labelsToAdd.push(component);
|
||||||
|
|
||||||
|
// Get existing labels in the repo
|
||||||
|
const { data: existingLabels } = await github.rest.issues.listLabelsForRepo({
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
per_page: 100
|
||||||
|
});
|
||||||
|
const existingLabelNames = existingLabels.map(l => l.name);
|
||||||
|
|
||||||
|
// Find labels that need to be created
|
||||||
|
const labelsToCreate = labelsToAdd.filter(label => !existingLabelNames.includes(label));
|
||||||
|
|
||||||
|
// Create missing labels (with a default color)
|
||||||
|
for (const label of labelsToCreate) {
|
||||||
|
try {
|
||||||
|
await github.rest.issues.createLabel({
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
name: label,
|
||||||
|
color: 'ededed' // light gray, you can pick any hex color
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
// Ignore if label already exists (race condition), otherwise rethrow
|
||||||
|
if (!e || e.status !== 422) throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now apply all labels (they all exist now)
|
||||||
|
if (labelsToAdd.length > 0) {
|
||||||
|
await github.rest.issues.addLabels({
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
issue_number: issueNumber,
|
||||||
|
labels: labelsToAdd
|
||||||
|
});
|
||||||
|
}
|
||||||
15
.github/workflows/release.yml
vendored
15
.github/workflows/release.yml
vendored
@@ -3,7 +3,7 @@ name: Make release and binaries
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
tags:
|
tags:
|
||||||
- 'v*'
|
- "v*"
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
@@ -29,7 +29,17 @@ jobs:
|
|||||||
- name: Set up Go
|
- name: Set up Go
|
||||||
uses: actions/setup-go@v5
|
uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: '^1.22.1'
|
go-version: "^1.22.1"
|
||||||
|
|
||||||
|
- name: Set up .NET
|
||||||
|
uses: actions/setup-dotnet@v4
|
||||||
|
with:
|
||||||
|
dotnet-version: "9.0.x"
|
||||||
|
|
||||||
|
- name: Build .NET LHM executable for Windows sensors
|
||||||
|
run: |
|
||||||
|
dotnet build -c Release ./beszel/internal/agent/lhm/beszel_lhm.csproj
|
||||||
|
shell: bash
|
||||||
|
|
||||||
- name: GoReleaser beszel
|
- name: GoReleaser beszel
|
||||||
uses: goreleaser/goreleaser-action@v6
|
uses: goreleaser/goreleaser-action@v6
|
||||||
@@ -40,3 +50,4 @@ jobs:
|
|||||||
args: release --clean
|
args: release --clean
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.TOKEN || secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.TOKEN || secrets.GITHUB_TOKEN }}
|
||||||
|
WINGET_TOKEN: ${{ secrets.WINGET_TOKEN }}
|
||||||
|
|||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -17,3 +17,5 @@ beszel/build
|
|||||||
beszel/site/src/locales/**/*.ts
|
beszel/site/src/locales/**/*.ts
|
||||||
*.bak
|
*.bak
|
||||||
__debug_*
|
__debug_*
|
||||||
|
beszel/internal/agent/lhm/obj
|
||||||
|
beszel/internal/agent/lhm/bin
|
||||||
|
|||||||
@@ -119,8 +119,8 @@ scoops:
|
|||||||
repository:
|
repository:
|
||||||
owner: henrygd
|
owner: henrygd
|
||||||
name: beszel-scoops
|
name: beszel-scoops
|
||||||
homepage: 'https://beszel.dev'
|
homepage: "https://beszel.dev"
|
||||||
description: 'Agent for Beszel, a lightweight server monitoring platform.'
|
description: "Agent for Beszel, a lightweight server monitoring platform."
|
||||||
license: MIT
|
license: MIT
|
||||||
|
|
||||||
# # Needs choco installed, so doesn't build on linux / default gh workflow :(
|
# # Needs choco installed, so doesn't build on linux / default gh workflow :(
|
||||||
@@ -152,9 +152,10 @@ brews:
|
|||||||
repository:
|
repository:
|
||||||
owner: henrygd
|
owner: henrygd
|
||||||
name: homebrew-beszel
|
name: homebrew-beszel
|
||||||
homepage: 'https://beszel.dev'
|
homepage: "https://beszel.dev"
|
||||||
description: 'Agent for Beszel, a lightweight server monitoring platform.'
|
description: "Agent for Beszel, a lightweight server monitoring platform."
|
||||||
license: MIT
|
license: MIT
|
||||||
|
skip_upload: auto
|
||||||
extra_install: |
|
extra_install: |
|
||||||
(bin/"beszel-agent-launcher").write <<~EOS
|
(bin/"beszel-agent-launcher").write <<~EOS
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
@@ -172,7 +173,6 @@ brews:
|
|||||||
error_log_path "#{Dir.home}/.cache/beszel/beszel-agent.log"
|
error_log_path "#{Dir.home}/.cache/beszel/beszel-agent.log"
|
||||||
keep_alive true
|
keep_alive true
|
||||||
restart_delay 5
|
restart_delay 5
|
||||||
name beszel-agent
|
|
||||||
process_type :background
|
process_type :background
|
||||||
|
|
||||||
winget:
|
winget:
|
||||||
@@ -181,12 +181,12 @@ winget:
|
|||||||
package_identifier: henrygd.beszel-agent
|
package_identifier: henrygd.beszel-agent
|
||||||
publisher: henrygd
|
publisher: henrygd
|
||||||
license: MIT
|
license: MIT
|
||||||
license_url: 'https://github.com/henrygd/beszel/blob/main/LICENSE'
|
license_url: "https://github.com/henrygd/beszel/blob/main/LICENSE"
|
||||||
copyright: '2025 henrygd'
|
copyright: "2025 henrygd"
|
||||||
homepage: 'https://beszel.dev'
|
homepage: "https://beszel.dev"
|
||||||
release_notes_url: 'https://github.com/henrygd/beszel/releases/tag/v{{ .Version }}'
|
release_notes_url: "https://github.com/henrygd/beszel/releases/tag/v{{ .Version }}"
|
||||||
publisher_support_url: 'https://github.com/henrygd/beszel/issues'
|
publisher_support_url: "https://github.com/henrygd/beszel/issues"
|
||||||
short_description: 'Agent for Beszel, a lightweight server monitoring platform.'
|
short_description: "Agent for Beszel, a lightweight server monitoring platform."
|
||||||
skip_upload: auto
|
skip_upload: auto
|
||||||
description: |
|
description: |
|
||||||
Beszel is a lightweight server monitoring platform that includes Docker
|
Beszel is a lightweight server monitoring platform that includes Docker
|
||||||
@@ -202,13 +202,14 @@ winget:
|
|||||||
owner: henrygd
|
owner: henrygd
|
||||||
name: beszel-winget
|
name: beszel-winget
|
||||||
branch: henrygd.beszel-agent-{{ .Version }}
|
branch: henrygd.beszel-agent-{{ .Version }}
|
||||||
pull_request:
|
token: "{{ .Env.WINGET_TOKEN }}"
|
||||||
enabled: false
|
# pull_request:
|
||||||
draft: false
|
# enabled: true
|
||||||
base:
|
# draft: false
|
||||||
owner: microsoft
|
# base:
|
||||||
name: winget-pkgs
|
# owner: microsoft
|
||||||
branch: master
|
# name: winget-pkgs
|
||||||
|
# branch: master
|
||||||
|
|
||||||
release:
|
release:
|
||||||
draft: true
|
draft: true
|
||||||
@@ -218,5 +219,5 @@ changelog:
|
|||||||
sort: asc
|
sort: asc
|
||||||
filters:
|
filters:
|
||||||
exclude:
|
exclude:
|
||||||
- '^docs:'
|
- "^docs:"
|
||||||
- '^test:'
|
- "^test:"
|
||||||
|
|||||||
@@ -4,6 +4,9 @@ ARCH ?= $(shell go env GOARCH)
|
|||||||
# Skip building the web UI if true
|
# Skip building the web UI if true
|
||||||
SKIP_WEB ?= false
|
SKIP_WEB ?= false
|
||||||
|
|
||||||
|
# Set executable extension based on target OS
|
||||||
|
EXE_EXT := $(if $(filter windows,$(OS)),.exe,)
|
||||||
|
|
||||||
.PHONY: tidy build-agent build-hub build clean lint dev-server dev-agent dev-hub dev generate-locales
|
.PHONY: tidy build-agent build-hub build clean lint dev-server dev-agent dev-hub dev generate-locales
|
||||||
.DEFAULT_GOAL := build
|
.DEFAULT_GOAL := build
|
||||||
|
|
||||||
@@ -30,11 +33,25 @@ build-web-ui:
|
|||||||
npm run --prefix ./site build; \
|
npm run --prefix ./site build; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
build-agent: tidy
|
# Conditional .NET build - only for Windows
|
||||||
GOOS=$(OS) GOARCH=$(ARCH) go build -o ./build/beszel-agent_$(OS)_$(ARCH) -ldflags "-w -s" beszel/cmd/agent
|
build-dotnet-conditional:
|
||||||
|
@if [ "$(OS)" = "windows" ]; then \
|
||||||
|
echo "Building .NET executable for Windows..."; \
|
||||||
|
if command -v dotnet >/dev/null 2>&1; then \
|
||||||
|
rm -rf ./internal/agent/lhm/bin; \
|
||||||
|
dotnet build -c Release ./internal/agent/lhm/beszel_lhm.csproj; \
|
||||||
|
else \
|
||||||
|
echo "Error: dotnet not found. Install .NET SDK to build Windows agent."; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Update build-agent to include conditional .NET build
|
||||||
|
build-agent: tidy build-dotnet-conditional
|
||||||
|
GOOS=$(OS) GOARCH=$(ARCH) go build -o ./build/beszel-agent_$(OS)_$(ARCH)$(EXE_EXT) -ldflags "-w -s" beszel/cmd/agent
|
||||||
|
|
||||||
build-hub: tidy $(if $(filter false,$(SKIP_WEB)),build-web-ui)
|
build-hub: tidy $(if $(filter false,$(SKIP_WEB)),build-web-ui)
|
||||||
GOOS=$(OS) GOARCH=$(ARCH) go build -o ./build/beszel_$(OS)_$(ARCH) -ldflags "-w -s" beszel/cmd/hub
|
GOOS=$(OS) GOARCH=$(ARCH) go build -o ./build/beszel_$(OS)_$(ARCH)$(EXE_EXT) -ldflags "-w -s" beszel/cmd/hub
|
||||||
|
|
||||||
build: build-agent build-hub
|
build: build-agent build-hub
|
||||||
|
|
||||||
@@ -56,7 +73,7 @@ dev-hub: export ENV=dev
|
|||||||
dev-hub:
|
dev-hub:
|
||||||
mkdir -p ./site/dist && touch ./site/dist/index.html
|
mkdir -p ./site/dist && touch ./site/dist/index.html
|
||||||
@if command -v entr >/dev/null 2>&1; then \
|
@if command -v entr >/dev/null 2>&1; then \
|
||||||
find ./cmd/hub ./internal/{alerts,hub,records,users} -name "*.go" | entr -r -s "cd ./cmd/hub && go run . serve"; \
|
find ./cmd/hub/*.go ./internal/{alerts,hub,records,users}/*.go | entr -r -s "cd ./cmd/hub && go run . serve --http 0.0.0.0:8090"; \
|
||||||
else \
|
else \
|
||||||
cd ./cmd/hub && go run . serve --http 0.0.0.0:8090; \
|
cd ./cmd/hub && go run . serve --http 0.0.0.0:8090; \
|
||||||
fi
|
fi
|
||||||
@@ -68,5 +85,14 @@ dev-agent:
|
|||||||
go run beszel/cmd/agent; \
|
go run beszel/cmd/agent; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
build-dotnet:
|
||||||
|
@if command -v dotnet >/dev/null 2>&1; then \
|
||||||
|
rm -rf ./internal/agent/lhm/bin; \
|
||||||
|
dotnet build -c Release ./internal/agent/lhm/beszel_lhm.csproj; \
|
||||||
|
else \
|
||||||
|
echo "dotnet not found"; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
# KEY="..." make -j dev
|
# KEY="..." make -j dev
|
||||||
dev: dev-server dev-hub dev-agent
|
dev: dev-server dev-hub dev-agent
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"golang.org/x/crypto/ssh"
|
"golang.org/x/crypto/ssh"
|
||||||
)
|
)
|
||||||
@@ -25,13 +26,16 @@ func (opts *cmdOptions) parse() bool {
|
|||||||
flag.StringVar(&opts.listen, "listen", "", "Address or port to listen on")
|
flag.StringVar(&opts.listen, "listen", "", "Address or port to listen on")
|
||||||
|
|
||||||
flag.Usage = func() {
|
flag.Usage = func() {
|
||||||
fmt.Printf("Usage: %s [command] [flags]\n", os.Args[0])
|
builder := strings.Builder{}
|
||||||
fmt.Println("\nCommands:")
|
builder.WriteString("Usage: ")
|
||||||
fmt.Println(" health Check if the agent is running")
|
builder.WriteString(os.Args[0])
|
||||||
fmt.Println(" help Display this help message")
|
builder.WriteString(" [command] [flags]\n")
|
||||||
fmt.Println(" update Update to the latest version")
|
builder.WriteString("\nCommands:\n")
|
||||||
fmt.Println(" version Display the version")
|
builder.WriteString(" health Check if the agent is running\n")
|
||||||
fmt.Println("\nFlags:")
|
builder.WriteString(" help Display this help message\n")
|
||||||
|
builder.WriteString(" update Update to the latest version\n")
|
||||||
|
builder.WriteString("\nFlags:\n")
|
||||||
|
fmt.Print(builder.String())
|
||||||
flag.PrintDefaults()
|
flag.PrintDefaults()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,12 +115,12 @@ func main() {
|
|||||||
serverConfig.Addr = addr
|
serverConfig.Addr = addr
|
||||||
serverConfig.Network = agent.GetNetwork(addr)
|
serverConfig.Network = agent.GetNetwork(addr)
|
||||||
|
|
||||||
agent, err := agent.NewAgent("")
|
a, err := agent.NewAgent()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal("Failed to create agent: ", err)
|
log.Fatal("Failed to create agent: ", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := agent.Start(serverConfig); err != nil {
|
if err := a.Start(serverConfig); err != nil {
|
||||||
log.Fatal("Failed to start server: ", err)
|
log.Fatal("Failed to start server: ", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,13 +14,21 @@ RUN CGO_ENABLED=0 GOGC=75 GOOS=$TARGETOS GOARCH=$TARGETARCH go build -ldflags "-
|
|||||||
|
|
||||||
RUN rm -rf /tmp/*
|
RUN rm -rf /tmp/*
|
||||||
|
|
||||||
# ? -------------------------
|
# --------------------------
|
||||||
FROM scratch
|
# Final image: default scratch-based agent
|
||||||
|
# --------------------------
|
||||||
|
FROM scratch AS default-agent
|
||||||
COPY --from=builder /agent /agent
|
COPY --from=builder /agent /agent
|
||||||
|
|
||||||
# this is so we don't need to create the
|
# this is so we don't need to create the /tmp directory in the scratch container
|
||||||
# /tmp directory in the scratch container
|
|
||||||
COPY --from=builder /tmp /tmp
|
COPY --from=builder /tmp /tmp
|
||||||
|
|
||||||
ENTRYPOINT ["/agent"]
|
ENTRYPOINT ["/agent"]
|
||||||
|
|
||||||
|
# --------------------------
|
||||||
|
# Final image: GPU-enabled agent with nvidia-smi
|
||||||
|
# --------------------------
|
||||||
|
FROM nvidia/cuda:12.9.0-base-ubuntu22.04 AS nvidia-agent
|
||||||
|
COPY --from=builder /agent /agent
|
||||||
|
COPY --from=builder /tmp /tmp
|
||||||
|
ENTRYPOINT ["/agent"]
|
||||||
|
|||||||
@@ -7,20 +7,20 @@ replace github.com/nicholas-fedor/shoutrrr => github.com/nicholas-fedor/shoutrrr
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/blang/semver v3.5.1+incompatible
|
github.com/blang/semver v3.5.1+incompatible
|
||||||
github.com/fxamacker/cbor/v2 v2.8.0
|
github.com/fxamacker/cbor/v2 v2.9.0
|
||||||
github.com/gliderlabs/ssh v0.3.8
|
github.com/gliderlabs/ssh v0.3.8
|
||||||
github.com/google/uuid v1.6.0
|
github.com/google/uuid v1.6.0
|
||||||
github.com/lxzan/gws v1.8.9
|
github.com/lxzan/gws v1.8.9
|
||||||
github.com/nicholas-fedor/shoutrrr v0.8.15
|
github.com/nicholas-fedor/shoutrrr v0.8.15
|
||||||
github.com/pocketbase/dbx v1.11.0
|
github.com/pocketbase/dbx v1.11.0
|
||||||
github.com/pocketbase/pocketbase v0.28.4
|
github.com/pocketbase/pocketbase v0.29.0
|
||||||
github.com/rhysd/go-github-selfupdate v1.2.3
|
github.com/rhysd/go-github-selfupdate v1.2.3
|
||||||
github.com/shirou/gopsutil/v4 v4.25.6
|
github.com/shirou/gopsutil/v4 v4.25.6
|
||||||
github.com/spf13/cast v1.9.2
|
github.com/spf13/cast v1.9.2
|
||||||
github.com/spf13/cobra v1.9.1
|
github.com/spf13/cobra v1.9.1
|
||||||
github.com/stretchr/testify v1.10.0
|
github.com/stretchr/testify v1.10.0
|
||||||
golang.org/x/crypto v0.39.0
|
golang.org/x/crypto v0.40.0
|
||||||
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b
|
golang.org/x/exp v0.0.0-20250718183923-645b1fa84792
|
||||||
gopkg.in/yaml.v3 v3.0.1
|
gopkg.in/yaml.v3 v3.0.1
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -39,7 +39,7 @@ require (
|
|||||||
github.com/go-ole/go-ole v1.3.0 // indirect
|
github.com/go-ole/go-ole v1.3.0 // indirect
|
||||||
github.com/go-ozzo/ozzo-validation/v4 v4.3.0 // indirect
|
github.com/go-ozzo/ozzo-validation/v4 v4.3.0 // indirect
|
||||||
github.com/go-sql-driver/mysql v1.9.1 // indirect
|
github.com/go-sql-driver/mysql v1.9.1 // indirect
|
||||||
github.com/golang-jwt/jwt/v5 v5.2.2 // indirect
|
github.com/golang-jwt/jwt/v5 v5.2.3 // indirect
|
||||||
github.com/google/go-github/v30 v30.1.0 // indirect
|
github.com/google/go-github/v30 v30.1.0 // indirect
|
||||||
github.com/google/go-querystring v1.1.0 // indirect
|
github.com/google/go-querystring v1.1.0 // indirect
|
||||||
github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf // indirect
|
github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf // indirect
|
||||||
@@ -52,19 +52,19 @@ require (
|
|||||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
||||||
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
|
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
|
||||||
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
|
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
|
||||||
github.com/spf13/pflag v1.0.6 // indirect
|
github.com/spf13/pflag v1.0.7 // indirect
|
||||||
github.com/tcnksm/go-gitconfig v0.1.2 // indirect
|
github.com/tcnksm/go-gitconfig v0.1.2 // indirect
|
||||||
github.com/tklauser/go-sysconf v0.3.15 // indirect
|
github.com/tklauser/go-sysconf v0.3.15 // indirect
|
||||||
github.com/tklauser/numcpus v0.10.0 // indirect
|
github.com/tklauser/numcpus v0.10.0 // indirect
|
||||||
github.com/ulikunitz/xz v0.5.12 // indirect
|
github.com/ulikunitz/xz v0.5.12 // indirect
|
||||||
github.com/x448/float16 v0.8.4 // indirect
|
github.com/x448/float16 v0.8.4 // indirect
|
||||||
github.com/yusufpapurcu/wmi v1.2.4 // indirect
|
github.com/yusufpapurcu/wmi v1.2.4 // indirect
|
||||||
golang.org/x/image v0.28.0 // indirect
|
golang.org/x/image v0.29.0 // indirect
|
||||||
golang.org/x/net v0.41.0 // indirect
|
golang.org/x/net v0.42.0 // indirect
|
||||||
golang.org/x/oauth2 v0.30.0 // indirect
|
golang.org/x/oauth2 v0.30.0 // indirect
|
||||||
golang.org/x/sync v0.15.0 // indirect
|
golang.org/x/sync v0.16.0 // indirect
|
||||||
golang.org/x/sys v0.33.0 // indirect
|
golang.org/x/sys v0.34.0 // indirect
|
||||||
golang.org/x/text v0.26.0 // indirect
|
golang.org/x/text v0.27.0 // indirect
|
||||||
modernc.org/libc v1.65.10 // indirect
|
modernc.org/libc v1.65.10 // indirect
|
||||||
modernc.org/mathutil v1.7.1 // indirect
|
modernc.org/mathutil v1.7.1 // indirect
|
||||||
modernc.org/memory v1.11.0 // indirect
|
modernc.org/memory v1.11.0 // indirect
|
||||||
|
|||||||
@@ -26,8 +26,8 @@ github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/
|
|||||||
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
|
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
|
||||||
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
|
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
|
||||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||||
github.com/fxamacker/cbor/v2 v2.8.0 h1:fFtUGXUzXPHTIUdne5+zzMPTfffl3RD5qYnkY40vtxU=
|
github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM=
|
||||||
github.com/fxamacker/cbor/v2 v2.8.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
|
github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
|
||||||
github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBvAG7U/oYY=
|
github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBvAG7U/oYY=
|
||||||
github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok=
|
github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok=
|
||||||
github.com/ganigeorgiev/fexpr v0.5.0 h1:XA9JxtTE/Xm+g/JFI6RfZEHSiQlk+1glLvRK1Lpv/Tk=
|
github.com/ganigeorgiev/fexpr v0.5.0 h1:XA9JxtTE/Xm+g/JFI6RfZEHSiQlk+1glLvRK1Lpv/Tk=
|
||||||
@@ -46,8 +46,8 @@ github.com/go-sql-driver/mysql v1.9.1 h1:FrjNGn/BsJQjVRuSa8CBrM5BWA9BWoXXat3KrtS
|
|||||||
github.com/go-sql-driver/mysql v1.9.1/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
|
github.com/go-sql-driver/mysql v1.9.1/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
|
||||||
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
|
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
|
||||||
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
|
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
|
||||||
github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8=
|
github.com/golang-jwt/jwt/v5 v5.2.3 h1:kkGXqQOBSDDWRhWNXTFpqGSCMyh/PLnqUvMGJPDJDs0=
|
||||||
github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
|
github.com/golang-jwt/jwt/v5 v5.2.3/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
@@ -103,8 +103,8 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI
|
|||||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/pocketbase/dbx v1.11.0 h1:LpZezioMfT3K4tLrqA55wWFw1EtH1pM4tzSVa7kgszU=
|
github.com/pocketbase/dbx v1.11.0 h1:LpZezioMfT3K4tLrqA55wWFw1EtH1pM4tzSVa7kgszU=
|
||||||
github.com/pocketbase/dbx v1.11.0/go.mod h1:xXRCIAKTHMgUCyCKZm55pUOdvFziJjQfXaWKhu2vhMs=
|
github.com/pocketbase/dbx v1.11.0/go.mod h1:xXRCIAKTHMgUCyCKZm55pUOdvFziJjQfXaWKhu2vhMs=
|
||||||
github.com/pocketbase/pocketbase v0.28.4 h1:RmhWXDcfKrFM9/W0G0Zrlv4eKBM8/s/v4SQKytjgD20=
|
github.com/pocketbase/pocketbase v0.29.0 h1:oL6qvkU2QSybClVtQdaq9Z1F3Wk59iKYCfIaf1R8KUs=
|
||||||
github.com/pocketbase/pocketbase v0.28.4/go.mod h1:jSuN93vE/oeJVOz2D2ZxcYyr2bYNmDOMCUkM+JhyJQ0=
|
github.com/pocketbase/pocketbase v0.29.0/go.mod h1:SqyH7o/3e+/uLySATlJqxH4S8gyU6R0adG56ZSV1vuU=
|
||||||
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU=
|
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU=
|
||||||
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
|
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
|
||||||
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
|
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
|
||||||
@@ -120,8 +120,9 @@ github.com/spf13/cast v1.9.2 h1:SsGfm7M8QOFtEzumm7UZrZdLLquNdzFYfIbEXntcFbE=
|
|||||||
github.com/spf13/cast v1.9.2/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo=
|
github.com/spf13/cast v1.9.2/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo=
|
||||||
github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
|
github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
|
||||||
github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
|
github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
|
||||||
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
|
|
||||||
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||||
|
github.com/spf13/pflag v1.0.7 h1:vN6T9TfwStFPFM5XzjsvmzZkLuaLX+HS+0SeFLRgU6M=
|
||||||
|
github.com/spf13/pflag v1.0.7/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||||
@@ -143,29 +144,29 @@ go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
|
|||||||
go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
|
go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||||
golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=
|
golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
|
||||||
golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U=
|
golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
|
||||||
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o=
|
golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 h1:R9PFI6EUdfVKgwKjZef7QIwGcBKu86OEFpJ9nUEP2l4=
|
||||||
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
|
golang.org/x/exp v0.0.0-20250718183923-645b1fa84792/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc=
|
||||||
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||||
golang.org/x/image v0.28.0 h1:gdem5JW1OLS4FbkWgLO+7ZeFzYtL3xClb97GaUzYMFE=
|
golang.org/x/image v0.29.0 h1:HcdsyR4Gsuys/Axh0rDEmlBmB68rW1U9BUdB3UVHsas=
|
||||||
golang.org/x/image v0.28.0/go.mod h1:GUJYXtnGKEUgggyzh+Vxt+AviiCcyiwpsl8iQ8MvwGY=
|
golang.org/x/image v0.29.0/go.mod h1:RVJROnf3SLK8d26OW91j4FrIHGbsJ8QnbEocVTOWQDA=
|
||||||
golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w=
|
golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg=
|
||||||
golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
|
golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ=
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||||
golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
|
golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
|
||||||
golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
|
golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
|
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
|
||||||
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
|
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8=
|
golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
|
||||||
golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
|
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
|
||||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
@@ -173,19 +174,19 @@ golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
|
golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=
|
||||||
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||||
golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg=
|
golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg=
|
||||||
golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ=
|
golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
|
golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=
|
||||||
golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
|
golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=
|
golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0=
|
||||||
golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=
|
golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||||
google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
@@ -201,16 +202,20 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
modernc.org/cc/v4 v4.26.1 h1:+X5NtzVBn0KgsBCBe+xkDC7twLb/jNVj9FPgiwSQO3s=
|
modernc.org/cc/v4 v4.26.2 h1:991HMkLjJzYBIfha6ECZdjrIYz2/1ayr+FL8GN+CNzM=
|
||||||
modernc.org/cc/v4 v4.26.1/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0=
|
modernc.org/cc/v4 v4.26.2/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0=
|
||||||
modernc.org/ccgo/v4 v4.28.0 h1:rjznn6WWehKq7dG4JtLRKxb52Ecv8OUGah8+Z/SfpNU=
|
modernc.org/ccgo/v4 v4.28.0 h1:rjznn6WWehKq7dG4JtLRKxb52Ecv8OUGah8+Z/SfpNU=
|
||||||
modernc.org/ccgo/v4 v4.28.0/go.mod h1:JygV3+9AV6SmPhDasu4JgquwU81XAKLd3OKTUDNOiKE=
|
modernc.org/ccgo/v4 v4.28.0/go.mod h1:JygV3+9AV6SmPhDasu4JgquwU81XAKLd3OKTUDNOiKE=
|
||||||
modernc.org/fileutil v1.3.3 h1:3qaU+7f7xxTUmvU1pJTZiDLAIoJVdUSSauJNHg9yXoA=
|
modernc.org/fileutil v1.3.8 h1:qtzNm7ED75pd1C7WgAGcK4edm4fvhtBsEiI/0NQ54YM=
|
||||||
modernc.org/fileutil v1.3.3/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc=
|
modernc.org/fileutil v1.3.8/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc=
|
||||||
modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI=
|
modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI=
|
||||||
modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito=
|
modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito=
|
||||||
|
modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks=
|
||||||
|
modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI=
|
||||||
modernc.org/libc v1.65.10 h1:ZwEk8+jhW7qBjHIT+wd0d9VjitRyQef9BnzlzGwMODc=
|
modernc.org/libc v1.65.10 h1:ZwEk8+jhW7qBjHIT+wd0d9VjitRyQef9BnzlzGwMODc=
|
||||||
modernc.org/libc v1.65.10/go.mod h1:StFvYpx7i/mXtBAfVOjaU0PWZOvIRoZSgXhrwXzr8Po=
|
modernc.org/libc v1.65.10/go.mod h1:StFvYpx7i/mXtBAfVOjaU0PWZOvIRoZSgXhrwXzr8Po=
|
||||||
|
modernc.org/libc v1.66.3 h1:cfCbjTUcdsKyyZZfEUKfoHcP3S0Wkvz3jgSzByEWVCQ=
|
||||||
|
modernc.org/libc v1.66.3/go.mod h1:XD9zO8kt59cANKvHPXpx7yS2ELPheAey0vjIuZOhOU8=
|
||||||
modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU=
|
modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU=
|
||||||
modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg=
|
modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg=
|
||||||
modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI=
|
modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI=
|
||||||
|
|||||||
@@ -40,13 +40,13 @@ type Agent struct {
|
|||||||
|
|
||||||
// NewAgent creates a new agent with the given data directory for persisting data.
|
// NewAgent creates a new agent with the given data directory for persisting data.
|
||||||
// If the data directory is not set, it will attempt to find the optimal directory.
|
// If the data directory is not set, it will attempt to find the optimal directory.
|
||||||
func NewAgent(dataDir string) (agent *Agent, err error) {
|
func NewAgent(dataDir ...string) (agent *Agent, err error) {
|
||||||
agent = &Agent{
|
agent = &Agent{
|
||||||
fsStats: make(map[string]*system.FsStats),
|
fsStats: make(map[string]*system.FsStats),
|
||||||
cache: NewSessionCache(69 * time.Second),
|
cache: NewSessionCache(69 * time.Second),
|
||||||
}
|
}
|
||||||
|
|
||||||
agent.dataDir, err = getDataDir(dataDir)
|
agent.dataDir, err = getDataDir(dataDir...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Warn("Data directory not found")
|
slog.Warn("Data directory not found")
|
||||||
} else {
|
} else {
|
||||||
@@ -113,37 +113,37 @@ func (a *Agent) gatherStats(sessionID string) *system.CombinedData {
|
|||||||
a.Lock()
|
a.Lock()
|
||||||
defer a.Unlock()
|
defer a.Unlock()
|
||||||
|
|
||||||
cachedData, ok := a.cache.Get(sessionID)
|
data, isCached := a.cache.Get(sessionID)
|
||||||
if ok {
|
if isCached {
|
||||||
slog.Debug("Cached stats", "session", sessionID)
|
slog.Debug("Cached data", "session", sessionID)
|
||||||
return cachedData
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
*cachedData = system.CombinedData{
|
*data = system.CombinedData{
|
||||||
Stats: a.getSystemStats(),
|
Stats: a.getSystemStats(),
|
||||||
Info: a.systemInfo,
|
Info: a.systemInfo,
|
||||||
}
|
}
|
||||||
slog.Debug("System stats", "data", cachedData)
|
slog.Debug("System data", "data", data)
|
||||||
|
|
||||||
if a.dockerManager != nil {
|
if a.dockerManager != nil {
|
||||||
if containerStats, err := a.dockerManager.getDockerStats(); err == nil {
|
if containerStats, err := a.dockerManager.getDockerStats(); err == nil {
|
||||||
cachedData.Containers = containerStats
|
data.Containers = containerStats
|
||||||
slog.Debug("Docker stats", "data", cachedData.Containers)
|
slog.Debug("Containers", "data", data.Containers)
|
||||||
} else {
|
} else {
|
||||||
slog.Debug("Docker stats", "err", err)
|
slog.Debug("Containers", "err", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cachedData.Stats.ExtraFs = make(map[string]*system.FsStats)
|
data.Stats.ExtraFs = make(map[string]*system.FsStats)
|
||||||
for name, stats := range a.fsStats {
|
for name, stats := range a.fsStats {
|
||||||
if !stats.Root && stats.DiskTotal > 0 {
|
if !stats.Root && stats.DiskTotal > 0 {
|
||||||
cachedData.Stats.ExtraFs[name] = stats
|
data.Stats.ExtraFs[name] = stats
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
slog.Debug("Extra filesystems", "data", cachedData.Stats.ExtraFs)
|
slog.Debug("Extra FS", "data", data.Stats.ExtraFs)
|
||||||
|
|
||||||
a.cache.Set(sessionID, cachedData)
|
a.cache.Set(sessionID, data)
|
||||||
return cachedData
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
// StartAgent initializes and starts the agent with optional WebSocket connection
|
// StartAgent initializes and starts the agent with optional WebSocket connection
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import (
|
|||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"os"
|
||||||
"path"
|
"path"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
@@ -53,9 +54,9 @@ func newWebSocketClient(agent *Agent) (client *WebSocketClient, err error) {
|
|||||||
return nil, errors.New("invalid hub URL")
|
return nil, errors.New("invalid hub URL")
|
||||||
}
|
}
|
||||||
// get registration token
|
// get registration token
|
||||||
client.token, _ = GetEnv("TOKEN")
|
client.token, err = getToken()
|
||||||
if client.token == "" {
|
if err != nil {
|
||||||
return nil, errors.New("TOKEN environment variable not set")
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
client.agent = agent
|
client.agent = agent
|
||||||
@@ -65,6 +66,27 @@ func newWebSocketClient(agent *Agent) (client *WebSocketClient, err error) {
|
|||||||
return client, nil
|
return client, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// getToken returns the token for the WebSocket client.
|
||||||
|
// It first checks the TOKEN environment variable, then the TOKEN_FILE environment variable.
|
||||||
|
// If neither is set, it returns an error.
|
||||||
|
func getToken() (string, error) {
|
||||||
|
// get token from env var
|
||||||
|
token, _ := GetEnv("TOKEN")
|
||||||
|
if token != "" {
|
||||||
|
return token, nil
|
||||||
|
}
|
||||||
|
// get token from file
|
||||||
|
tokenFile, _ := GetEnv("TOKEN_FILE")
|
||||||
|
if tokenFile == "" {
|
||||||
|
return "", errors.New("must set TOKEN or TOKEN_FILE")
|
||||||
|
}
|
||||||
|
tokenBytes, err := os.ReadFile(tokenFile)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return string(tokenBytes), nil
|
||||||
|
}
|
||||||
|
|
||||||
// getOptions returns the WebSocket client options, creating them if necessary.
|
// getOptions returns the WebSocket client options, creating them if necessary.
|
||||||
// It configures the connection URL, TLS settings, and authentication headers.
|
// It configures the connection URL, TLS settings, and authentication headers.
|
||||||
func (client *WebSocketClient) getOptions() *gws.ClientOption {
|
func (client *WebSocketClient) getOptions() *gws.ClientOption {
|
||||||
|
|||||||
538
beszel/internal/agent/client_test.go
Normal file
538
beszel/internal/agent/client_test.go
Normal file
@@ -0,0 +1,538 @@
|
|||||||
|
//go:build testing
|
||||||
|
// +build testing
|
||||||
|
|
||||||
|
package agent
|
||||||
|
|
||||||
|
import (
|
||||||
|
"beszel"
|
||||||
|
"beszel/internal/common"
|
||||||
|
"crypto/ed25519"
|
||||||
|
"net/url"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/fxamacker/cbor/v2"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
"golang.org/x/crypto/ssh"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TestNewWebSocketClient tests WebSocket client creation
|
||||||
|
func TestNewWebSocketClient(t *testing.T) {
|
||||||
|
agent := createTestAgent(t)
|
||||||
|
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
hubURL string
|
||||||
|
token string
|
||||||
|
expectError bool
|
||||||
|
errorMsg string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "valid configuration",
|
||||||
|
hubURL: "http://localhost:8080",
|
||||||
|
token: "test-token-123",
|
||||||
|
expectError: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "valid https URL",
|
||||||
|
hubURL: "https://hub.example.com",
|
||||||
|
token: "secure-token",
|
||||||
|
expectError: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "missing hub URL",
|
||||||
|
hubURL: "",
|
||||||
|
token: "test-token",
|
||||||
|
expectError: true,
|
||||||
|
errorMsg: "HUB_URL environment variable not set",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "invalid URL",
|
||||||
|
hubURL: "ht\ttp://invalid",
|
||||||
|
token: "test-token",
|
||||||
|
expectError: true,
|
||||||
|
errorMsg: "invalid hub URL",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "missing token",
|
||||||
|
hubURL: "http://localhost:8080",
|
||||||
|
token: "",
|
||||||
|
expectError: true,
|
||||||
|
errorMsg: "must set TOKEN or TOKEN_FILE",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
// Set up environment
|
||||||
|
if tc.hubURL != "" {
|
||||||
|
os.Setenv("BESZEL_AGENT_HUB_URL", tc.hubURL)
|
||||||
|
} else {
|
||||||
|
os.Unsetenv("BESZEL_AGENT_HUB_URL")
|
||||||
|
}
|
||||||
|
if tc.token != "" {
|
||||||
|
os.Setenv("BESZEL_AGENT_TOKEN", tc.token)
|
||||||
|
} else {
|
||||||
|
os.Unsetenv("BESZEL_AGENT_TOKEN")
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
os.Unsetenv("BESZEL_AGENT_HUB_URL")
|
||||||
|
os.Unsetenv("BESZEL_AGENT_TOKEN")
|
||||||
|
}()
|
||||||
|
|
||||||
|
client, err := newWebSocketClient(agent)
|
||||||
|
|
||||||
|
if tc.expectError {
|
||||||
|
assert.Error(t, err)
|
||||||
|
if err != nil && tc.errorMsg != "" {
|
||||||
|
assert.Contains(t, err.Error(), tc.errorMsg)
|
||||||
|
}
|
||||||
|
assert.Nil(t, client)
|
||||||
|
} else {
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.NotNil(t, client)
|
||||||
|
assert.Equal(t, agent, client.agent)
|
||||||
|
assert.Equal(t, tc.token, client.token)
|
||||||
|
assert.Equal(t, tc.hubURL, client.hubURL.String())
|
||||||
|
assert.NotEmpty(t, client.fingerprint)
|
||||||
|
assert.NotNil(t, client.hubRequest)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestWebSocketClient_GetOptions tests WebSocket client options configuration
|
||||||
|
func TestWebSocketClient_GetOptions(t *testing.T) {
|
||||||
|
agent := createTestAgent(t)
|
||||||
|
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
inputURL string
|
||||||
|
expectedScheme string
|
||||||
|
expectedPath string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "http to ws conversion",
|
||||||
|
inputURL: "http://localhost:8080",
|
||||||
|
expectedScheme: "ws",
|
||||||
|
expectedPath: "/api/beszel/agent-connect",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "https to wss conversion",
|
||||||
|
inputURL: "https://hub.example.com",
|
||||||
|
expectedScheme: "wss",
|
||||||
|
expectedPath: "/api/beszel/agent-connect",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "existing path preservation",
|
||||||
|
inputURL: "http://localhost:8080/custom/path",
|
||||||
|
expectedScheme: "ws",
|
||||||
|
expectedPath: "/custom/path/api/beszel/agent-connect",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
// Set up environment
|
||||||
|
os.Setenv("BESZEL_AGENT_HUB_URL", tc.inputURL)
|
||||||
|
os.Setenv("BESZEL_AGENT_TOKEN", "test-token")
|
||||||
|
defer func() {
|
||||||
|
os.Unsetenv("BESZEL_AGENT_HUB_URL")
|
||||||
|
os.Unsetenv("BESZEL_AGENT_TOKEN")
|
||||||
|
}()
|
||||||
|
|
||||||
|
client, err := newWebSocketClient(agent)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
options := client.getOptions()
|
||||||
|
|
||||||
|
// Parse the WebSocket URL
|
||||||
|
wsURL, err := url.Parse(options.Addr)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
assert.Equal(t, tc.expectedScheme, wsURL.Scheme)
|
||||||
|
assert.Equal(t, tc.expectedPath, wsURL.Path)
|
||||||
|
|
||||||
|
// Check headers
|
||||||
|
assert.Equal(t, "test-token", options.RequestHeader.Get("X-Token"))
|
||||||
|
assert.Equal(t, beszel.Version, options.RequestHeader.Get("X-Beszel"))
|
||||||
|
assert.Contains(t, options.RequestHeader.Get("User-Agent"), "Mozilla/5.0")
|
||||||
|
|
||||||
|
// Test options caching
|
||||||
|
options2 := client.getOptions()
|
||||||
|
assert.Same(t, options, options2, "Options should be cached")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestWebSocketClient_VerifySignature tests signature verification
|
||||||
|
func TestWebSocketClient_VerifySignature(t *testing.T) {
|
||||||
|
agent := createTestAgent(t)
|
||||||
|
|
||||||
|
// Generate test key pairs
|
||||||
|
_, goodPrivKey, err := ed25519.GenerateKey(nil)
|
||||||
|
require.NoError(t, err)
|
||||||
|
goodPubKey, err := ssh.NewPublicKey(goodPrivKey.Public().(ed25519.PublicKey))
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
_, badPrivKey, err := ed25519.GenerateKey(nil)
|
||||||
|
require.NoError(t, err)
|
||||||
|
badPubKey, err := ssh.NewPublicKey(badPrivKey.Public().(ed25519.PublicKey))
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
// Set up environment
|
||||||
|
os.Setenv("BESZEL_AGENT_HUB_URL", "http://localhost:8080")
|
||||||
|
os.Setenv("BESZEL_AGENT_TOKEN", "test-token")
|
||||||
|
defer func() {
|
||||||
|
os.Unsetenv("BESZEL_AGENT_HUB_URL")
|
||||||
|
os.Unsetenv("BESZEL_AGENT_TOKEN")
|
||||||
|
}()
|
||||||
|
|
||||||
|
client, err := newWebSocketClient(agent)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
keys []ssh.PublicKey
|
||||||
|
token string
|
||||||
|
signWith ed25519.PrivateKey
|
||||||
|
expectError bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "valid signature with correct key",
|
||||||
|
keys: []ssh.PublicKey{goodPubKey},
|
||||||
|
token: "test-token",
|
||||||
|
signWith: goodPrivKey,
|
||||||
|
expectError: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "invalid signature with wrong key",
|
||||||
|
keys: []ssh.PublicKey{goodPubKey},
|
||||||
|
token: "test-token",
|
||||||
|
signWith: badPrivKey,
|
||||||
|
expectError: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "valid signature with multiple keys",
|
||||||
|
keys: []ssh.PublicKey{badPubKey, goodPubKey},
|
||||||
|
token: "test-token",
|
||||||
|
signWith: goodPrivKey,
|
||||||
|
expectError: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "no valid keys",
|
||||||
|
keys: []ssh.PublicKey{badPubKey},
|
||||||
|
token: "test-token",
|
||||||
|
signWith: goodPrivKey,
|
||||||
|
expectError: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
// Set up agent with test keys
|
||||||
|
agent.keys = tc.keys
|
||||||
|
client.token = tc.token
|
||||||
|
|
||||||
|
// Create signature
|
||||||
|
signature := ed25519.Sign(tc.signWith, []byte(tc.token))
|
||||||
|
|
||||||
|
err := client.verifySignature(signature)
|
||||||
|
|
||||||
|
if tc.expectError {
|
||||||
|
assert.Error(t, err)
|
||||||
|
assert.Contains(t, err.Error(), "invalid signature")
|
||||||
|
} else {
|
||||||
|
assert.NoError(t, err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestWebSocketClient_HandleHubRequest tests hub request routing (basic verification logic)
|
||||||
|
func TestWebSocketClient_HandleHubRequest(t *testing.T) {
|
||||||
|
agent := createTestAgent(t)
|
||||||
|
|
||||||
|
// Set up environment
|
||||||
|
os.Setenv("BESZEL_AGENT_HUB_URL", "http://localhost:8080")
|
||||||
|
os.Setenv("BESZEL_AGENT_TOKEN", "test-token")
|
||||||
|
defer func() {
|
||||||
|
os.Unsetenv("BESZEL_AGENT_HUB_URL")
|
||||||
|
os.Unsetenv("BESZEL_AGENT_TOKEN")
|
||||||
|
}()
|
||||||
|
|
||||||
|
client, err := newWebSocketClient(agent)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
action common.WebSocketAction
|
||||||
|
hubVerified bool
|
||||||
|
expectError bool
|
||||||
|
errorMsg string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "CheckFingerprint without verification",
|
||||||
|
action: common.CheckFingerprint,
|
||||||
|
hubVerified: false,
|
||||||
|
expectError: false, // CheckFingerprint is allowed without verification
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "GetData without verification",
|
||||||
|
action: common.GetData,
|
||||||
|
hubVerified: false,
|
||||||
|
expectError: true,
|
||||||
|
errorMsg: "hub not verified",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
client.hubVerified = tc.hubVerified
|
||||||
|
|
||||||
|
// Create minimal request
|
||||||
|
hubRequest := &common.HubRequest[cbor.RawMessage]{
|
||||||
|
Action: tc.action,
|
||||||
|
Data: cbor.RawMessage{},
|
||||||
|
}
|
||||||
|
|
||||||
|
err := client.handleHubRequest(hubRequest)
|
||||||
|
|
||||||
|
if tc.expectError {
|
||||||
|
assert.Error(t, err)
|
||||||
|
if tc.errorMsg != "" {
|
||||||
|
assert.Contains(t, err.Error(), tc.errorMsg)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// For CheckFingerprint, we expect a decode error since we're not providing valid data,
|
||||||
|
// but it shouldn't be the "hub not verified" error
|
||||||
|
if err != nil && tc.errorMsg != "" {
|
||||||
|
assert.NotContains(t, err.Error(), tc.errorMsg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestWebSocketClient_GetUserAgent tests user agent generation
|
||||||
|
func TestGetUserAgent(t *testing.T) {
|
||||||
|
// Run multiple times to check both variants
|
||||||
|
userAgents := make(map[string]bool)
|
||||||
|
|
||||||
|
for range 20 {
|
||||||
|
ua := getUserAgent()
|
||||||
|
userAgents[ua] = true
|
||||||
|
|
||||||
|
// Check that it's a valid Mozilla user agent
|
||||||
|
assert.Contains(t, ua, "Mozilla/5.0")
|
||||||
|
assert.Contains(t, ua, "AppleWebKit/537.36")
|
||||||
|
assert.Contains(t, ua, "Chrome/124.0.0.0")
|
||||||
|
assert.Contains(t, ua, "Safari/537.36")
|
||||||
|
|
||||||
|
// Should contain either Windows or Mac
|
||||||
|
isWindows := strings.Contains(ua, "Windows NT 11.0")
|
||||||
|
isMac := strings.Contains(ua, "Macintosh; Intel Mac OS X 14_0_0")
|
||||||
|
assert.True(t, isWindows || isMac, "User agent should contain either Windows or Mac identifier")
|
||||||
|
}
|
||||||
|
|
||||||
|
// With enough iterations, we should see both variants
|
||||||
|
// though this might occasionally fail
|
||||||
|
if len(userAgents) == 1 {
|
||||||
|
t.Log("Note: Only one user agent variant was generated in this test run")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestWebSocketClient_Close tests connection closing
|
||||||
|
func TestWebSocketClient_Close(t *testing.T) {
|
||||||
|
agent := createTestAgent(t)
|
||||||
|
|
||||||
|
// Set up environment
|
||||||
|
os.Setenv("BESZEL_AGENT_HUB_URL", "http://localhost:8080")
|
||||||
|
os.Setenv("BESZEL_AGENT_TOKEN", "test-token")
|
||||||
|
defer func() {
|
||||||
|
os.Unsetenv("BESZEL_AGENT_HUB_URL")
|
||||||
|
os.Unsetenv("BESZEL_AGENT_TOKEN")
|
||||||
|
}()
|
||||||
|
|
||||||
|
client, err := newWebSocketClient(agent)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
// Test closing with nil connection (should not panic)
|
||||||
|
assert.NotPanics(t, func() {
|
||||||
|
client.Close()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestWebSocketClient_ConnectRateLimit tests connection rate limiting
|
||||||
|
func TestWebSocketClient_ConnectRateLimit(t *testing.T) {
|
||||||
|
agent := createTestAgent(t)
|
||||||
|
|
||||||
|
// Set up environment
|
||||||
|
os.Setenv("BESZEL_AGENT_HUB_URL", "http://localhost:8080")
|
||||||
|
os.Setenv("BESZEL_AGENT_TOKEN", "test-token")
|
||||||
|
defer func() {
|
||||||
|
os.Unsetenv("BESZEL_AGENT_HUB_URL")
|
||||||
|
os.Unsetenv("BESZEL_AGENT_TOKEN")
|
||||||
|
}()
|
||||||
|
|
||||||
|
client, err := newWebSocketClient(agent)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
// Set recent connection attempt
|
||||||
|
client.lastConnectAttempt = time.Now()
|
||||||
|
|
||||||
|
// Test that connection fails quickly due to rate limiting
|
||||||
|
// This won't actually connect but should fail fast
|
||||||
|
err = client.Connect()
|
||||||
|
assert.Error(t, err, "Connection should fail but not hang")
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestGetToken tests the getToken function with various scenarios
|
||||||
|
func TestGetToken(t *testing.T) {
|
||||||
|
unsetEnvVars := func() {
|
||||||
|
os.Unsetenv("BESZEL_AGENT_TOKEN")
|
||||||
|
os.Unsetenv("TOKEN")
|
||||||
|
os.Unsetenv("BESZEL_AGENT_TOKEN_FILE")
|
||||||
|
os.Unsetenv("TOKEN_FILE")
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Run("token from TOKEN environment variable", func(t *testing.T) {
|
||||||
|
unsetEnvVars()
|
||||||
|
|
||||||
|
// Set TOKEN env var
|
||||||
|
expectedToken := "test-token-from-env"
|
||||||
|
os.Setenv("TOKEN", expectedToken)
|
||||||
|
defer os.Unsetenv("TOKEN")
|
||||||
|
|
||||||
|
token, err := getToken()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, expectedToken, token)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("token from BESZEL_AGENT_TOKEN environment variable", func(t *testing.T) {
|
||||||
|
unsetEnvVars()
|
||||||
|
|
||||||
|
// Set BESZEL_AGENT_TOKEN env var (should take precedence)
|
||||||
|
expectedToken := "test-token-from-beszel-env"
|
||||||
|
os.Setenv("BESZEL_AGENT_TOKEN", expectedToken)
|
||||||
|
defer os.Unsetenv("BESZEL_AGENT_TOKEN")
|
||||||
|
|
||||||
|
token, err := getToken()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, expectedToken, token)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("token from TOKEN_FILE", func(t *testing.T) {
|
||||||
|
unsetEnvVars()
|
||||||
|
|
||||||
|
// Create a temporary token file
|
||||||
|
expectedToken := "test-token-from-file"
|
||||||
|
tokenFile, err := os.CreateTemp("", "token-test-*.txt")
|
||||||
|
require.NoError(t, err)
|
||||||
|
defer os.Remove(tokenFile.Name())
|
||||||
|
|
||||||
|
_, err = tokenFile.WriteString(expectedToken)
|
||||||
|
require.NoError(t, err)
|
||||||
|
tokenFile.Close()
|
||||||
|
|
||||||
|
// Set TOKEN_FILE env var
|
||||||
|
os.Setenv("TOKEN_FILE", tokenFile.Name())
|
||||||
|
defer os.Unsetenv("TOKEN_FILE")
|
||||||
|
|
||||||
|
token, err := getToken()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, expectedToken, token)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("token from BESZEL_AGENT_TOKEN_FILE", func(t *testing.T) {
|
||||||
|
unsetEnvVars()
|
||||||
|
|
||||||
|
// Create a temporary token file
|
||||||
|
expectedToken := "test-token-from-beszel-file"
|
||||||
|
tokenFile, err := os.CreateTemp("", "token-test-*.txt")
|
||||||
|
require.NoError(t, err)
|
||||||
|
defer os.Remove(tokenFile.Name())
|
||||||
|
|
||||||
|
_, err = tokenFile.WriteString(expectedToken)
|
||||||
|
require.NoError(t, err)
|
||||||
|
tokenFile.Close()
|
||||||
|
|
||||||
|
// Set BESZEL_AGENT_TOKEN_FILE env var (should take precedence)
|
||||||
|
os.Setenv("BESZEL_AGENT_TOKEN_FILE", tokenFile.Name())
|
||||||
|
defer os.Unsetenv("BESZEL_AGENT_TOKEN_FILE")
|
||||||
|
|
||||||
|
token, err := getToken()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, expectedToken, token)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("TOKEN takes precedence over TOKEN_FILE", func(t *testing.T) {
|
||||||
|
unsetEnvVars()
|
||||||
|
|
||||||
|
// Create a temporary token file
|
||||||
|
fileToken := "token-from-file"
|
||||||
|
tokenFile, err := os.CreateTemp("", "token-test-*.txt")
|
||||||
|
require.NoError(t, err)
|
||||||
|
defer os.Remove(tokenFile.Name())
|
||||||
|
|
||||||
|
_, err = tokenFile.WriteString(fileToken)
|
||||||
|
require.NoError(t, err)
|
||||||
|
tokenFile.Close()
|
||||||
|
|
||||||
|
// Set both TOKEN and TOKEN_FILE
|
||||||
|
envToken := "token-from-env"
|
||||||
|
os.Setenv("TOKEN", envToken)
|
||||||
|
os.Setenv("TOKEN_FILE", tokenFile.Name())
|
||||||
|
defer func() {
|
||||||
|
os.Unsetenv("TOKEN")
|
||||||
|
os.Unsetenv("TOKEN_FILE")
|
||||||
|
}()
|
||||||
|
|
||||||
|
token, err := getToken()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, envToken, token, "TOKEN should take precedence over TOKEN_FILE")
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("error when neither TOKEN nor TOKEN_FILE is set", func(t *testing.T) {
|
||||||
|
unsetEnvVars()
|
||||||
|
|
||||||
|
token, err := getToken()
|
||||||
|
assert.Error(t, err)
|
||||||
|
assert.Equal(t, "", token)
|
||||||
|
assert.Contains(t, err.Error(), "must set TOKEN or TOKEN_FILE")
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("error when TOKEN_FILE points to non-existent file", func(t *testing.T) {
|
||||||
|
unsetEnvVars()
|
||||||
|
|
||||||
|
// Set TOKEN_FILE to a non-existent file
|
||||||
|
os.Setenv("TOKEN_FILE", "/non/existent/file.txt")
|
||||||
|
defer os.Unsetenv("TOKEN_FILE")
|
||||||
|
|
||||||
|
token, err := getToken()
|
||||||
|
assert.Error(t, err)
|
||||||
|
assert.Equal(t, "", token)
|
||||||
|
assert.Contains(t, err.Error(), "no such file or directory")
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("handles empty token file", func(t *testing.T) {
|
||||||
|
unsetEnvVars()
|
||||||
|
|
||||||
|
// Create an empty token file
|
||||||
|
tokenFile, err := os.CreateTemp("", "token-test-*.txt")
|
||||||
|
require.NoError(t, err)
|
||||||
|
defer os.Remove(tokenFile.Name())
|
||||||
|
tokenFile.Close()
|
||||||
|
|
||||||
|
// Set TOKEN_FILE env var
|
||||||
|
os.Setenv("TOKEN_FILE", tokenFile.Name())
|
||||||
|
defer os.Unsetenv("TOKEN_FILE")
|
||||||
|
|
||||||
|
token, err := getToken()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, "", token, "Empty file should return empty string")
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -9,35 +9,30 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// getDataDir returns the path to the data directory for the agent and an error
|
// getDataDir returns the path to the data directory for the agent and an error
|
||||||
// if the directory is not valid. Pass an empty string to attempt to find the
|
// if the directory is not valid. Attempts to find the optimal data directory if
|
||||||
// optimal data directory.
|
// no data directories are provided.
|
||||||
func getDataDir(dataDir string) (string, error) {
|
func getDataDir(dataDirs ...string) (string, error) {
|
||||||
if dataDir == "" {
|
if len(dataDirs) > 0 {
|
||||||
dataDir, _ = GetEnv("DATA_DIR")
|
return testDataDirs(dataDirs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dataDir, _ := GetEnv("DATA_DIR")
|
||||||
if dataDir != "" {
|
if dataDir != "" {
|
||||||
return testDataDirs([]string{dataDir})
|
dataDirs = append(dataDirs, dataDir)
|
||||||
}
|
}
|
||||||
|
|
||||||
var dirsToTry []string
|
|
||||||
|
|
||||||
if runtime.GOOS == "windows" {
|
if runtime.GOOS == "windows" {
|
||||||
dirsToTry = []string{
|
dataDirs = append(dataDirs,
|
||||||
filepath.Join(os.Getenv("APPDATA"), "beszel-agent"),
|
filepath.Join(os.Getenv("APPDATA"), "beszel-agent"),
|
||||||
filepath.Join(os.Getenv("LOCALAPPDATA"), "beszel-agent"),
|
filepath.Join(os.Getenv("LOCALAPPDATA"), "beszel-agent"),
|
||||||
}
|
)
|
||||||
} else {
|
} else {
|
||||||
homeDir, err := os.UserHomeDir()
|
dataDirs = append(dataDirs, "/var/lib/beszel-agent")
|
||||||
if err != nil {
|
if homeDir, err := os.UserHomeDir(); err == nil {
|
||||||
return "", err
|
dataDirs = append(dataDirs, filepath.Join(homeDir, ".config", "beszel"))
|
||||||
}
|
|
||||||
dirsToTry = []string{
|
|
||||||
"/var/lib/beszel-agent",
|
|
||||||
filepath.Join(homeDir, ".config", "beszel"),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return testDataDirs(dirsToTry)
|
return testDataDirs(dataDirs)
|
||||||
}
|
}
|
||||||
|
|
||||||
func testDataDirs(paths []string) (string, error) {
|
func testDataDirs(paths []string) (string, error) {
|
||||||
|
|||||||
@@ -44,15 +44,15 @@ func TestGetDataDir(t *testing.T) {
|
|||||||
oldValue := os.Getenv("DATA_DIR")
|
oldValue := os.Getenv("DATA_DIR")
|
||||||
defer func() {
|
defer func() {
|
||||||
if oldValue == "" {
|
if oldValue == "" {
|
||||||
os.Unsetenv("DATA_DIR")
|
os.Unsetenv("BESZEL_AGENT_DATA_DIR")
|
||||||
} else {
|
} else {
|
||||||
os.Setenv("DATA_DIR", oldValue)
|
os.Setenv("BESZEL_AGENT_DATA_DIR", oldValue)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
os.Setenv("DATA_DIR", tempDir)
|
os.Setenv("BESZEL_AGENT_DATA_DIR", tempDir)
|
||||||
|
|
||||||
result, err := getDataDir("")
|
result, err := getDataDir()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
assert.Equal(t, tempDir, result)
|
assert.Equal(t, tempDir, result)
|
||||||
})
|
})
|
||||||
@@ -79,7 +79,7 @@ func TestGetDataDir(t *testing.T) {
|
|||||||
|
|
||||||
// This will try platform-specific defaults, which may or may not work
|
// This will try platform-specific defaults, which may or may not work
|
||||||
// We're mainly testing that it doesn't panic and returns some result
|
// We're mainly testing that it doesn't panic and returns some result
|
||||||
result, err := getDataDir("")
|
result, err := getDataDir()
|
||||||
// We don't assert success/failure here since it depends on system permissions
|
// We don't assert success/failure here since it depends on system permissions
|
||||||
// Just verify we get a string result if no error
|
// Just verify we get a string result if no error
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
|||||||
80
beszel/internal/agent/lhm/beszel_lhm.cs
Normal file
80
beszel/internal/agent/lhm/beszel_lhm.cs
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
using System;
|
||||||
|
using System.Globalization;
|
||||||
|
using LibreHardwareMonitor.Hardware;
|
||||||
|
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
static void Main()
|
||||||
|
{
|
||||||
|
var computer = new Computer
|
||||||
|
{
|
||||||
|
IsCpuEnabled = true,
|
||||||
|
IsGpuEnabled = true,
|
||||||
|
IsMemoryEnabled = true,
|
||||||
|
IsMotherboardEnabled = true,
|
||||||
|
IsStorageEnabled = true,
|
||||||
|
// IsPsuEnabled = true,
|
||||||
|
// IsNetworkEnabled = true,
|
||||||
|
};
|
||||||
|
computer.Open();
|
||||||
|
|
||||||
|
var reader = Console.In;
|
||||||
|
var writer = Console.Out;
|
||||||
|
|
||||||
|
string line;
|
||||||
|
while ((line = reader.ReadLine()) != null)
|
||||||
|
{
|
||||||
|
if (line.Trim().Equals("getTemps", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
foreach (var hw in computer.Hardware)
|
||||||
|
{
|
||||||
|
// process main hardware sensors
|
||||||
|
ProcessSensors(hw, writer);
|
||||||
|
|
||||||
|
// process subhardware sensors
|
||||||
|
foreach (var subhardware in hw.SubHardware)
|
||||||
|
{
|
||||||
|
ProcessSensors(subhardware, writer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// send empty line to signal end of sensor data
|
||||||
|
writer.WriteLine();
|
||||||
|
writer.Flush();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
computer.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ProcessSensors(IHardware hardware, System.IO.TextWriter writer)
|
||||||
|
{
|
||||||
|
var updated = false;
|
||||||
|
foreach (var sensor in hardware.Sensors)
|
||||||
|
{
|
||||||
|
var validTemp = sensor.SensorType == SensorType.Temperature && sensor.Value.HasValue;
|
||||||
|
if (!validTemp || sensor.Name.Contains("Distance"))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!updated)
|
||||||
|
{
|
||||||
|
hardware.Update();
|
||||||
|
updated = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
var name = sensor.Name;
|
||||||
|
// if sensor.Name starts with "Temperature" replace with hardware.Identifier but retain the rest of the name.
|
||||||
|
// usually this is a number like Temperature 3
|
||||||
|
if (sensor.Name.StartsWith("Temperature"))
|
||||||
|
{
|
||||||
|
name = hardware.Identifier.ToString().Replace("/", "_").TrimStart('_') + sensor.Name.Substring(11);
|
||||||
|
}
|
||||||
|
|
||||||
|
// invariant culture assures the value is parsable as a float
|
||||||
|
var value = sensor.Value.Value.ToString("0.##", CultureInfo.InvariantCulture);
|
||||||
|
// write the name and value to the writer
|
||||||
|
writer.WriteLine($"{name}|{value}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
11
beszel/internal/agent/lhm/beszel_lhm.csproj
Normal file
11
beszel/internal/agent/lhm/beszel_lhm.csproj
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net48</TargetFramework>
|
||||||
|
<Platforms>x64</Platforms>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="LibreHardwareMonitorLib" Version="0.9.4" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
@@ -6,8 +6,10 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"path"
|
"path"
|
||||||
|
"runtime"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"unicode/utf8"
|
||||||
|
|
||||||
"github.com/shirou/gopsutil/v4/common"
|
"github.com/shirou/gopsutil/v4/common"
|
||||||
"github.com/shirou/gopsutil/v4/sensors"
|
"github.com/shirou/gopsutil/v4/sensors"
|
||||||
@@ -82,10 +84,10 @@ func (a *Agent) updateTemperatures(systemStats *system.Stats) {
|
|||||||
// reset high temp
|
// reset high temp
|
||||||
a.systemInfo.DashboardTemp = 0
|
a.systemInfo.DashboardTemp = 0
|
||||||
|
|
||||||
temps, err := a.getTempsWithPanicRecovery(sensors.TemperaturesWithContext)
|
temps, err := a.getTempsWithPanicRecovery(getSensorTemps)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// retry once on panic (gopsutil/issues/1832)
|
// retry once on panic (gopsutil/issues/1832)
|
||||||
temps, err = a.getTempsWithPanicRecovery(sensors.TemperaturesWithContext)
|
temps, err = a.getTempsWithPanicRecovery(getSensorTemps)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Warn("Error updating temperatures", "err", err)
|
slog.Warn("Error updating temperatures", "err", err)
|
||||||
if len(systemStats.Temperatures) > 0 {
|
if len(systemStats.Temperatures) > 0 {
|
||||||
@@ -103,6 +105,11 @@ func (a *Agent) updateTemperatures(systemStats *system.Stats) {
|
|||||||
|
|
||||||
systemStats.Temperatures = make(map[string]float64, len(temps))
|
systemStats.Temperatures = make(map[string]float64, len(temps))
|
||||||
for i, sensor := range temps {
|
for i, sensor := range temps {
|
||||||
|
// check for malformed strings on darwin (gopsutil/issues/1832)
|
||||||
|
if runtime.GOOS == "darwin" && !utf8.ValidString(sensor.SensorKey) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
// scale temperature
|
// scale temperature
|
||||||
if sensor.Temperature != 0 && sensor.Temperature < 1 {
|
if sensor.Temperature != 0 && sensor.Temperature < 1 {
|
||||||
sensor.Temperature = scaleTemperature(sensor.Temperature)
|
sensor.Temperature = scaleTemperature(sensor.Temperature)
|
||||||
|
|||||||
9
beszel/internal/agent/sensors_default.go
Normal file
9
beszel/internal/agent/sensors_default.go
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
//go:build !windows
|
||||||
|
|
||||||
|
package agent
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/shirou/gopsutil/v4/sensors"
|
||||||
|
)
|
||||||
|
|
||||||
|
var getSensorTemps = sensors.TemperaturesWithContext
|
||||||
281
beszel/internal/agent/sensors_windows.go
Normal file
281
beszel/internal/agent/sensors_windows.go
Normal file
@@ -0,0 +1,281 @@
|
|||||||
|
//go:build windows
|
||||||
|
|
||||||
|
//go:generate dotnet build -c Release lhm/beszel_lhm.csproj
|
||||||
|
|
||||||
|
package agent
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"context"
|
||||||
|
"embed"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"log/slog"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"path"
|
||||||
|
"path/filepath"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/shirou/gopsutil/v4/sensors"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Note: This is always called from Agent.gatherStats() which holds Agent.Lock(),
|
||||||
|
// so no internal concurrency protection is needed.
|
||||||
|
|
||||||
|
// lhmProcess is a wrapper around the LHM .NET process.
|
||||||
|
type lhmProcess struct {
|
||||||
|
cmd *exec.Cmd
|
||||||
|
stdin io.WriteCloser
|
||||||
|
stdout io.ReadCloser
|
||||||
|
scanner *bufio.Scanner
|
||||||
|
isRunning bool
|
||||||
|
stoppedNoSensors bool
|
||||||
|
consecutiveNoSensors uint8
|
||||||
|
execPath string
|
||||||
|
tempDir string
|
||||||
|
}
|
||||||
|
|
||||||
|
//go:embed all:lhm/bin/Release/net48
|
||||||
|
var lhmFs embed.FS
|
||||||
|
|
||||||
|
var (
|
||||||
|
beszelLhm *lhmProcess
|
||||||
|
beszelLhmOnce sync.Once
|
||||||
|
)
|
||||||
|
|
||||||
|
var errNoSensors = errors.New("no sensors found (try running as admin)")
|
||||||
|
|
||||||
|
// newlhmProcess copies the embedded LHM executable to a temporary directory and starts it.
|
||||||
|
func newlhmProcess() (*lhmProcess, error) {
|
||||||
|
destDir := filepath.Join(os.TempDir(), "beszel")
|
||||||
|
execPath := filepath.Join(destDir, "beszel_lhm.exe")
|
||||||
|
|
||||||
|
if err := os.MkdirAll(destDir, 0755); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to create temp directory: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only copy if executable doesn't exist
|
||||||
|
if _, err := os.Stat(execPath); os.IsNotExist(err) {
|
||||||
|
if err := copyEmbeddedDir(lhmFs, "lhm/bin/Release/net48", destDir); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to copy embedded directory: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lhm := &lhmProcess{
|
||||||
|
execPath: execPath,
|
||||||
|
tempDir: destDir,
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := lhm.startProcess(); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to start process: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return lhm, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// startProcess starts the external LHM process
|
||||||
|
func (lhm *lhmProcess) startProcess() error {
|
||||||
|
// Clean up any existing process
|
||||||
|
lhm.cleanupProcess()
|
||||||
|
|
||||||
|
cmd := exec.Command(lhm.execPath)
|
||||||
|
stdin, err := cmd.StdinPipe()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
stdout, err := cmd.StdoutPipe()
|
||||||
|
if err != nil {
|
||||||
|
stdin.Close()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := cmd.Start(); err != nil {
|
||||||
|
stdin.Close()
|
||||||
|
stdout.Close()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update process state
|
||||||
|
lhm.cmd = cmd
|
||||||
|
lhm.stdin = stdin
|
||||||
|
lhm.stdout = stdout
|
||||||
|
lhm.scanner = bufio.NewScanner(stdout)
|
||||||
|
lhm.isRunning = true
|
||||||
|
|
||||||
|
// Give process a moment to initialize
|
||||||
|
time.Sleep(100 * time.Millisecond)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// cleanupProcess terminates the process and closes resources but preserves files
|
||||||
|
func (lhm *lhmProcess) cleanupProcess() {
|
||||||
|
lhm.isRunning = false
|
||||||
|
|
||||||
|
if lhm.cmd != nil && lhm.cmd.Process != nil {
|
||||||
|
lhm.cmd.Process.Kill()
|
||||||
|
lhm.cmd.Wait()
|
||||||
|
}
|
||||||
|
|
||||||
|
if lhm.stdin != nil {
|
||||||
|
lhm.stdin.Close()
|
||||||
|
lhm.stdin = nil
|
||||||
|
}
|
||||||
|
if lhm.stdout != nil {
|
||||||
|
lhm.stdout.Close()
|
||||||
|
lhm.stdout = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
lhm.cmd = nil
|
||||||
|
lhm.scanner = nil
|
||||||
|
lhm.stoppedNoSensors = false
|
||||||
|
lhm.consecutiveNoSensors = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (lhm *lhmProcess) getTemps(ctx context.Context) (temps []sensors.TemperatureStat, err error) {
|
||||||
|
if lhm.stoppedNoSensors {
|
||||||
|
// Fall back to gopsutil if we can't get sensors from LHM
|
||||||
|
return sensors.TemperaturesWithContext(ctx)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start process if it's not running
|
||||||
|
if !lhm.isRunning || lhm.stdin == nil || lhm.scanner == nil {
|
||||||
|
err := lhm.startProcess()
|
||||||
|
if err != nil {
|
||||||
|
return temps, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send command to process
|
||||||
|
_, err = fmt.Fprintln(lhm.stdin, "getTemps")
|
||||||
|
if err != nil {
|
||||||
|
lhm.isRunning = false
|
||||||
|
return temps, fmt.Errorf("failed to send command: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read all sensor lines until we hit an empty line or EOF
|
||||||
|
for lhm.scanner.Scan() {
|
||||||
|
line := strings.TrimSpace(lhm.scanner.Text())
|
||||||
|
if line == "" {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
parts := strings.Split(line, "|")
|
||||||
|
if len(parts) != 2 {
|
||||||
|
slog.Debug("Invalid sensor format", "line", line)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
name := strings.TrimSpace(parts[0])
|
||||||
|
valueStr := strings.TrimSpace(parts[1])
|
||||||
|
|
||||||
|
value, err := strconv.ParseFloat(valueStr, 64)
|
||||||
|
if err != nil {
|
||||||
|
slog.Debug("Failed to parse sensor", "err", err, "line", line)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if name == "" || value <= 0 || value > 150 {
|
||||||
|
slog.Debug("Invalid sensor", "name", name, "val", value, "line", line)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
temps = append(temps, sensors.TemperatureStat{
|
||||||
|
SensorKey: name,
|
||||||
|
Temperature: value,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := lhm.scanner.Err(); err != nil {
|
||||||
|
lhm.isRunning = false
|
||||||
|
return temps, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle no sensors case
|
||||||
|
if len(temps) == 0 {
|
||||||
|
lhm.consecutiveNoSensors++
|
||||||
|
if lhm.consecutiveNoSensors >= 3 {
|
||||||
|
lhm.stoppedNoSensors = true
|
||||||
|
slog.Warn(errNoSensors.Error())
|
||||||
|
lhm.cleanup()
|
||||||
|
}
|
||||||
|
return sensors.TemperaturesWithContext(ctx)
|
||||||
|
}
|
||||||
|
|
||||||
|
lhm.consecutiveNoSensors = 0
|
||||||
|
|
||||||
|
return temps, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// getSensorTemps attempts to pull sensor temperatures from the embedded LHM process.
|
||||||
|
// NB: LibreHardwareMonitorLib requires admin privileges to access all available sensors.
|
||||||
|
func getSensorTemps(ctx context.Context) (temps []sensors.TemperatureStat, err error) {
|
||||||
|
defer func() {
|
||||||
|
if err != nil {
|
||||||
|
slog.Debug("Error reading sensors", "err", err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
// Initialize process once
|
||||||
|
beszelLhmOnce.Do(func() {
|
||||||
|
beszelLhm, err = newlhmProcess()
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return temps, fmt.Errorf("failed to initialize lhm: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if beszelLhm == nil {
|
||||||
|
return temps, fmt.Errorf("lhm not available")
|
||||||
|
}
|
||||||
|
|
||||||
|
return beszelLhm.getTemps(ctx)
|
||||||
|
}
|
||||||
|
|
||||||
|
// cleanup terminates the process and closes resources
|
||||||
|
func (lhm *lhmProcess) cleanup() {
|
||||||
|
lhm.cleanupProcess()
|
||||||
|
if lhm.tempDir != "" {
|
||||||
|
os.RemoveAll(lhm.tempDir)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// copyEmbeddedDir copies the embedded directory to the destination path
|
||||||
|
func copyEmbeddedDir(fs embed.FS, srcPath, destPath string) error {
|
||||||
|
entries, err := fs.ReadDir(srcPath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := os.MkdirAll(destPath, 0755); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, entry := range entries {
|
||||||
|
srcEntryPath := path.Join(srcPath, entry.Name())
|
||||||
|
destEntryPath := filepath.Join(destPath, entry.Name())
|
||||||
|
|
||||||
|
if entry.IsDir() {
|
||||||
|
if err := copyEmbeddedDir(fs, srcEntryPath, destEntryPath); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
data, err := fs.ReadFile(srcEntryPath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := os.WriteFile(destEntryPath, data, 0755); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@@ -473,11 +473,11 @@ func TestWriteToSessionEncoding(t *testing.T) {
|
|||||||
hubVersion: "0.12.0-beta0",
|
hubVersion: "0.12.0-beta0",
|
||||||
expectedUsesCbor: false,
|
expectedUsesCbor: false,
|
||||||
},
|
},
|
||||||
{
|
// {
|
||||||
name: "matching beta version should use CBOR",
|
// name: "matching beta version should use CBOR",
|
||||||
hubVersion: "0.12.0-beta1",
|
// hubVersion: "0.12.0-beta2",
|
||||||
expectedUsesCbor: true,
|
// expectedUsesCbor: true,
|
||||||
},
|
// },
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import (
|
|||||||
"github.com/shirou/gopsutil/v4/cpu"
|
"github.com/shirou/gopsutil/v4/cpu"
|
||||||
"github.com/shirou/gopsutil/v4/disk"
|
"github.com/shirou/gopsutil/v4/disk"
|
||||||
"github.com/shirou/gopsutil/v4/host"
|
"github.com/shirou/gopsutil/v4/host"
|
||||||
|
"github.com/shirou/gopsutil/v4/load"
|
||||||
"github.com/shirou/gopsutil/v4/mem"
|
"github.com/shirou/gopsutil/v4/mem"
|
||||||
psutilNet "github.com/shirou/gopsutil/v4/net"
|
psutilNet "github.com/shirou/gopsutil/v4/net"
|
||||||
)
|
)
|
||||||
@@ -77,6 +78,17 @@ func (a *Agent) getSystemStats() system.Stats {
|
|||||||
systemStats.Cpu = twoDecimals(cpuPct[0])
|
systemStats.Cpu = twoDecimals(cpuPct[0])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// load average
|
||||||
|
if avgstat, err := load.Avg(); err == nil {
|
||||||
|
// TODO: remove these in future release in favor of load avg array
|
||||||
|
systemStats.LoadAvg[0] = avgstat.Load1
|
||||||
|
systemStats.LoadAvg[1] = avgstat.Load5
|
||||||
|
systemStats.LoadAvg[2] = avgstat.Load15
|
||||||
|
slog.Debug("Load average", "5m", avgstat.Load5, "15m", avgstat.Load15)
|
||||||
|
} else {
|
||||||
|
slog.Error("Error getting load average", "err", err)
|
||||||
|
}
|
||||||
|
|
||||||
// memory
|
// memory
|
||||||
if v, err := mem.VirtualMemory(); err == nil {
|
if v, err := mem.VirtualMemory(); err == nil {
|
||||||
// swap
|
// swap
|
||||||
@@ -163,24 +175,27 @@ func (a *Agent) getSystemStats() system.Stats {
|
|||||||
a.initializeNetIoStats()
|
a.initializeNetIoStats()
|
||||||
}
|
}
|
||||||
if netIO, err := psutilNet.IOCounters(true); err == nil {
|
if netIO, err := psutilNet.IOCounters(true); err == nil {
|
||||||
secondsElapsed := time.Since(a.netIoStats.Time).Seconds()
|
msElapsed := uint64(time.Since(a.netIoStats.Time).Milliseconds())
|
||||||
a.netIoStats.Time = time.Now()
|
a.netIoStats.Time = time.Now()
|
||||||
bytesSent := uint64(0)
|
totalBytesSent := uint64(0)
|
||||||
bytesRecv := uint64(0)
|
totalBytesRecv := uint64(0)
|
||||||
// sum all bytes sent and received
|
// sum all bytes sent and received
|
||||||
for _, v := range netIO {
|
for _, v := range netIO {
|
||||||
// skip if not in valid network interfaces list
|
// skip if not in valid network interfaces list
|
||||||
if _, exists := a.netInterfaces[v.Name]; !exists {
|
if _, exists := a.netInterfaces[v.Name]; !exists {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
bytesSent += v.BytesSent
|
totalBytesSent += v.BytesSent
|
||||||
bytesRecv += v.BytesRecv
|
totalBytesRecv += v.BytesRecv
|
||||||
}
|
}
|
||||||
// add to systemStats
|
// add to systemStats
|
||||||
sentPerSecond := float64(bytesSent-a.netIoStats.BytesSent) / secondsElapsed
|
var bytesSentPerSecond, bytesRecvPerSecond uint64
|
||||||
recvPerSecond := float64(bytesRecv-a.netIoStats.BytesRecv) / secondsElapsed
|
if msElapsed > 0 {
|
||||||
networkSentPs := bytesToMegabytes(sentPerSecond)
|
bytesSentPerSecond = (totalBytesSent - a.netIoStats.BytesSent) * 1000 / msElapsed
|
||||||
networkRecvPs := bytesToMegabytes(recvPerSecond)
|
bytesRecvPerSecond = (totalBytesRecv - a.netIoStats.BytesRecv) * 1000 / msElapsed
|
||||||
|
}
|
||||||
|
networkSentPs := bytesToMegabytes(float64(bytesSentPerSecond))
|
||||||
|
networkRecvPs := bytesToMegabytes(float64(bytesRecvPerSecond))
|
||||||
// add check for issue (#150) where sent is a massive number
|
// add check for issue (#150) where sent is a massive number
|
||||||
if networkSentPs > 10_000 || networkRecvPs > 10_000 {
|
if networkSentPs > 10_000 || networkRecvPs > 10_000 {
|
||||||
slog.Warn("Invalid net stats. Resetting.", "sent", networkSentPs, "recv", networkRecvPs)
|
slog.Warn("Invalid net stats. Resetting.", "sent", networkSentPs, "recv", networkRecvPs)
|
||||||
@@ -195,9 +210,10 @@ func (a *Agent) getSystemStats() system.Stats {
|
|||||||
} else {
|
} else {
|
||||||
systemStats.NetworkSent = networkSentPs
|
systemStats.NetworkSent = networkSentPs
|
||||||
systemStats.NetworkRecv = networkRecvPs
|
systemStats.NetworkRecv = networkRecvPs
|
||||||
|
systemStats.Bandwidth[0], systemStats.Bandwidth[1] = bytesSentPerSecond, bytesRecvPerSecond
|
||||||
// update netIoStats
|
// update netIoStats
|
||||||
a.netIoStats.BytesSent = bytesSent
|
a.netIoStats.BytesSent = totalBytesSent
|
||||||
a.netIoStats.BytesRecv = bytesRecv
|
a.netIoStats.BytesRecv = totalBytesRecv
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -240,10 +256,17 @@ func (a *Agent) getSystemStats() system.Stats {
|
|||||||
|
|
||||||
// update base system info
|
// update base system info
|
||||||
a.systemInfo.Cpu = systemStats.Cpu
|
a.systemInfo.Cpu = systemStats.Cpu
|
||||||
|
a.systemInfo.LoadAvg = systemStats.LoadAvg
|
||||||
|
// TODO: remove these in future release in favor of load avg array
|
||||||
|
a.systemInfo.LoadAvg1 = systemStats.LoadAvg[0]
|
||||||
|
a.systemInfo.LoadAvg5 = systemStats.LoadAvg[1]
|
||||||
|
a.systemInfo.LoadAvg15 = systemStats.LoadAvg[2]
|
||||||
a.systemInfo.MemPct = systemStats.MemPct
|
a.systemInfo.MemPct = systemStats.MemPct
|
||||||
a.systemInfo.DiskPct = systemStats.DiskPct
|
a.systemInfo.DiskPct = systemStats.DiskPct
|
||||||
a.systemInfo.Uptime, _ = host.Uptime()
|
a.systemInfo.Uptime, _ = host.Uptime()
|
||||||
|
// TODO: in future release, remove MB bandwidth values in favor of bytes
|
||||||
a.systemInfo.Bandwidth = twoDecimals(systemStats.NetworkSent + systemStats.NetworkRecv)
|
a.systemInfo.Bandwidth = twoDecimals(systemStats.NetworkSent + systemStats.NetworkRecv)
|
||||||
|
a.systemInfo.BandwidthBytes = systemStats.Bandwidth[0] + systemStats.Bandwidth[1]
|
||||||
slog.Debug("sysinfo", "data", a.systemInfo)
|
slog.Debug("sysinfo", "data", a.systemInfo)
|
||||||
|
|
||||||
return systemStats
|
return systemStats
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ type SystemAlertStats struct {
|
|||||||
NetSent float64 `json:"ns"`
|
NetSent float64 `json:"ns"`
|
||||||
NetRecv float64 `json:"nr"`
|
NetRecv float64 `json:"nr"`
|
||||||
Temperatures map[string]float32 `json:"t"`
|
Temperatures map[string]float32 `json:"t"`
|
||||||
|
LoadAvg [3]float64 `json:"la"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type SystemAlertData struct {
|
type SystemAlertData struct {
|
||||||
@@ -90,10 +91,18 @@ func NewAlertManager(app hubLike) *AlertManager {
|
|||||||
alertQueue: make(chan alertTask),
|
alertQueue: make(chan alertTask),
|
||||||
stopChan: make(chan struct{}),
|
stopChan: make(chan struct{}),
|
||||||
}
|
}
|
||||||
|
am.bindEvents()
|
||||||
go am.startWorker()
|
go am.startWorker()
|
||||||
return am
|
return am
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Bind events to the alerts collection lifecycle
|
||||||
|
func (am *AlertManager) bindEvents() {
|
||||||
|
am.hub.OnRecordAfterUpdateSuccess("alerts").BindFunc(updateHistoryOnAlertUpdate)
|
||||||
|
am.hub.OnRecordAfterDeleteSuccess("alerts").BindFunc(resolveHistoryOnAlertDelete)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SendAlert sends an alert to the user
|
||||||
func (am *AlertManager) SendAlert(data AlertMessageData) error {
|
func (am *AlertManager) SendAlert(data AlertMessageData) error {
|
||||||
// get user settings
|
// get user settings
|
||||||
record, err := am.hub.FindFirstRecordByFilter(
|
record, err := am.hub.FindFirstRecordByFilter(
|
||||||
|
|||||||
85
beszel/internal/alerts/alerts_history.go
Normal file
85
beszel/internal/alerts/alerts_history.go
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
package alerts
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/pocketbase/dbx"
|
||||||
|
"github.com/pocketbase/pocketbase/core"
|
||||||
|
)
|
||||||
|
|
||||||
|
// On triggered alert record delete, set matching alert history record to resolved
|
||||||
|
func resolveHistoryOnAlertDelete(e *core.RecordEvent) error {
|
||||||
|
if !e.Record.GetBool("triggered") {
|
||||||
|
return e.Next()
|
||||||
|
}
|
||||||
|
_ = resolveAlertHistoryRecord(e.App, e.Record)
|
||||||
|
return e.Next()
|
||||||
|
}
|
||||||
|
|
||||||
|
// On alert record update, update alert history record
|
||||||
|
func updateHistoryOnAlertUpdate(e *core.RecordEvent) error {
|
||||||
|
original := e.Record.Original()
|
||||||
|
new := e.Record
|
||||||
|
|
||||||
|
originalTriggered := original.GetBool("triggered")
|
||||||
|
newTriggered := new.GetBool("triggered")
|
||||||
|
|
||||||
|
// no need to update alert history if triggered state has not changed
|
||||||
|
if originalTriggered == newTriggered {
|
||||||
|
return e.Next()
|
||||||
|
}
|
||||||
|
|
||||||
|
// if new state is triggered, create new alert history record
|
||||||
|
if newTriggered {
|
||||||
|
_, _ = createAlertHistoryRecord(e.App, new)
|
||||||
|
return e.Next()
|
||||||
|
}
|
||||||
|
|
||||||
|
// if new state is not triggered, check for matching alert history record and set it to resolved
|
||||||
|
_ = resolveAlertHistoryRecord(e.App, new)
|
||||||
|
return e.Next()
|
||||||
|
}
|
||||||
|
|
||||||
|
// resolveAlertHistoryRecord sets the resolved field to the current time
|
||||||
|
func resolveAlertHistoryRecord(app core.App, alertRecord *core.Record) error {
|
||||||
|
alertHistoryRecords, err := app.FindRecordsByFilter(
|
||||||
|
"alerts_history",
|
||||||
|
"alert_id={:alert_id} && resolved=null",
|
||||||
|
"-created",
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
dbx.Params{"alert_id": alertRecord.Id},
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(alertHistoryRecords) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
alertHistoryRecord := alertHistoryRecords[0] // there should be only one record
|
||||||
|
alertHistoryRecord.Set("resolved", time.Now().UTC())
|
||||||
|
err = app.Save(alertHistoryRecord)
|
||||||
|
if err != nil {
|
||||||
|
app.Logger().Error("Failed to resolve alert history", "err", err)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// createAlertHistoryRecord creates a new alert history record
|
||||||
|
func createAlertHistoryRecord(app core.App, alertRecord *core.Record) (alertHistoryRecord *core.Record, err error) {
|
||||||
|
alertHistoryCollection, err := app.FindCachedCollectionByNameOrId("alerts_history")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
alertHistoryRecord = core.NewRecord(alertHistoryCollection)
|
||||||
|
alertHistoryRecord.Set("alert_id", alertRecord.Id)
|
||||||
|
alertHistoryRecord.Set("user", alertRecord.GetString("user"))
|
||||||
|
alertHistoryRecord.Set("system", alertRecord.GetString("system"))
|
||||||
|
alertHistoryRecord.Set("name", alertRecord.GetString("name"))
|
||||||
|
alertHistoryRecord.Set("value", alertRecord.GetFloat("value"))
|
||||||
|
err = app.Save(alertHistoryRecord)
|
||||||
|
if err != nil {
|
||||||
|
app.Logger().Error("Failed to save alert history", "err", err)
|
||||||
|
}
|
||||||
|
return alertHistoryRecord, err
|
||||||
|
}
|
||||||
@@ -136,6 +136,14 @@ func (am *AlertManager) handleSystemUp(systemName string, alertRecords []*core.R
|
|||||||
|
|
||||||
// sendStatusAlert sends a status alert ("up" or "down") to the users associated with the alert records.
|
// sendStatusAlert sends a status alert ("up" or "down") to the users associated with the alert records.
|
||||||
func (am *AlertManager) sendStatusAlert(alertStatus string, systemName string, alertRecord *core.Record) error {
|
func (am *AlertManager) sendStatusAlert(alertStatus string, systemName string, alertRecord *core.Record) error {
|
||||||
|
switch alertStatus {
|
||||||
|
case "up":
|
||||||
|
alertRecord.Set("triggered", false)
|
||||||
|
case "down":
|
||||||
|
alertRecord.Set("triggered", true)
|
||||||
|
}
|
||||||
|
am.hub.Save(alertRecord)
|
||||||
|
|
||||||
var emoji string
|
var emoji string
|
||||||
if alertStatus == "up" {
|
if alertStatus == "up" {
|
||||||
emoji = "\u2705" // Green checkmark emoji
|
emoji = "\u2705" // Green checkmark emoji
|
||||||
@@ -146,16 +154,16 @@ func (am *AlertManager) sendStatusAlert(alertStatus string, systemName string, a
|
|||||||
title := fmt.Sprintf("Connection to %s is %s %v", systemName, alertStatus, emoji)
|
title := fmt.Sprintf("Connection to %s is %s %v", systemName, alertStatus, emoji)
|
||||||
message := strings.TrimSuffix(title, emoji)
|
message := strings.TrimSuffix(title, emoji)
|
||||||
|
|
||||||
if errs := am.hub.ExpandRecord(alertRecord, []string{"user"}, nil); len(errs) > 0 {
|
// if errs := am.hub.ExpandRecord(alertRecord, []string{"user"}, nil); len(errs) > 0 {
|
||||||
return errs["user"]
|
// return errs["user"]
|
||||||
}
|
// }
|
||||||
user := alertRecord.ExpandedOne("user")
|
// user := alertRecord.ExpandedOne("user")
|
||||||
if user == nil {
|
// if user == nil {
|
||||||
return nil
|
// return nil
|
||||||
}
|
// }
|
||||||
|
|
||||||
return am.SendAlert(AlertMessageData{
|
return am.SendAlert(AlertMessageData{
|
||||||
UserID: user.Id,
|
UserID: alertRecord.GetString("user"),
|
||||||
Title: title,
|
Title: title,
|
||||||
Message: message,
|
Message: message,
|
||||||
Link: am.hub.MakeLink("system", systemName),
|
Link: am.hub.MakeLink("system", systemName),
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import (
|
|||||||
|
|
||||||
func (am *AlertManager) HandleSystemAlerts(systemRecord *core.Record, data *system.CombinedData) error {
|
func (am *AlertManager) HandleSystemAlerts(systemRecord *core.Record, data *system.CombinedData) error {
|
||||||
alertRecords, err := am.hub.FindAllRecords("alerts",
|
alertRecords, err := am.hub.FindAllRecords("alerts",
|
||||||
dbx.NewExp("system={:system}", dbx.Params{"system": systemRecord.Id}),
|
dbx.NewExp("system={:system} AND name!='Status'", dbx.Params{"system": systemRecord.Id}),
|
||||||
)
|
)
|
||||||
if err != nil || len(alertRecords) == 0 {
|
if err != nil || len(alertRecords) == 0 {
|
||||||
// log.Println("no alerts found for system")
|
// log.Println("no alerts found for system")
|
||||||
@@ -54,6 +54,15 @@ func (am *AlertManager) HandleSystemAlerts(systemRecord *core.Record, data *syst
|
|||||||
}
|
}
|
||||||
val = data.Info.DashboardTemp
|
val = data.Info.DashboardTemp
|
||||||
unit = "°C"
|
unit = "°C"
|
||||||
|
case "LoadAvg1":
|
||||||
|
val = data.Info.LoadAvg[0]
|
||||||
|
unit = ""
|
||||||
|
case "LoadAvg5":
|
||||||
|
val = data.Info.LoadAvg[1]
|
||||||
|
unit = ""
|
||||||
|
case "LoadAvg15":
|
||||||
|
val = data.Info.LoadAvg[2]
|
||||||
|
unit = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
triggered := alertRecord.GetBool("triggered")
|
triggered := alertRecord.GetBool("triggered")
|
||||||
@@ -190,6 +199,12 @@ func (am *AlertManager) HandleSystemAlerts(systemRecord *core.Record, data *syst
|
|||||||
}
|
}
|
||||||
alert.mapSums[key] += temp
|
alert.mapSums[key] += temp
|
||||||
}
|
}
|
||||||
|
case "LoadAvg1":
|
||||||
|
alert.val += stats.LoadAvg[0]
|
||||||
|
case "LoadAvg5":
|
||||||
|
alert.val += stats.LoadAvg[1]
|
||||||
|
case "LoadAvg15":
|
||||||
|
alert.val += stats.LoadAvg[2]
|
||||||
default:
|
default:
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -247,6 +262,10 @@ func (am *AlertManager) sendSystemAlert(alert SystemAlertData) {
|
|||||||
if alert.name == "Disk" {
|
if alert.name == "Disk" {
|
||||||
alert.name += " usage"
|
alert.name += " usage"
|
||||||
}
|
}
|
||||||
|
// format LoadAvg5 and LoadAvg15
|
||||||
|
if after, ok := strings.CutPrefix(alert.name, "LoadAvg"); ok {
|
||||||
|
alert.name = after + "m Load"
|
||||||
|
}
|
||||||
|
|
||||||
// make title alert name lowercase if not CPU
|
// make title alert name lowercase if not CPU
|
||||||
titleAlertName := alert.name
|
titleAlertName := alert.name
|
||||||
@@ -274,18 +293,11 @@ func (am *AlertManager) sendSystemAlert(alert SystemAlertData) {
|
|||||||
// app.Logger().Error("failed to save alert record", "err", err)
|
// app.Logger().Error("failed to save alert record", "err", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// expand the user relation and send the alert
|
|
||||||
if errs := am.hub.ExpandRecord(alert.alertRecord, []string{"user"}, nil); len(errs) > 0 {
|
|
||||||
// app.Logger().Error("failed to expand user relation", "errs", errs)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if user := alert.alertRecord.ExpandedOne("user"); user != nil {
|
|
||||||
am.SendAlert(AlertMessageData{
|
am.SendAlert(AlertMessageData{
|
||||||
UserID: user.Id,
|
UserID: alert.alertRecord.GetString("user"),
|
||||||
Title: subject,
|
Title: subject,
|
||||||
Message: body,
|
Message: body,
|
||||||
Link: am.hub.MakeLink("system", systemName),
|
Link: am.hub.MakeLink("system", systemName),
|
||||||
LinkText: "View " + systemName,
|
LinkText: "View " + systemName,
|
||||||
})
|
})
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,6 +31,13 @@ type Stats struct {
|
|||||||
Temperatures map[string]float64 `json:"t,omitempty" cbor:"20,keyasint,omitempty"`
|
Temperatures map[string]float64 `json:"t,omitempty" cbor:"20,keyasint,omitempty"`
|
||||||
ExtraFs map[string]*FsStats `json:"efs,omitempty" cbor:"21,keyasint,omitempty"`
|
ExtraFs map[string]*FsStats `json:"efs,omitempty" cbor:"21,keyasint,omitempty"`
|
||||||
GPUData map[string]GPUData `json:"g,omitempty" cbor:"22,keyasint,omitempty"`
|
GPUData map[string]GPUData `json:"g,omitempty" cbor:"22,keyasint,omitempty"`
|
||||||
|
LoadAvg1 float64 `json:"l1,omitempty" cbor:"23,keyasint,omitempty"`
|
||||||
|
LoadAvg5 float64 `json:"l5,omitempty" cbor:"24,keyasint,omitempty"`
|
||||||
|
LoadAvg15 float64 `json:"l15,omitempty" cbor:"25,keyasint,omitempty"`
|
||||||
|
Bandwidth [2]uint64 `json:"b,omitzero" cbor:"26,keyasint,omitzero"` // [sent bytes, recv bytes]
|
||||||
|
MaxBandwidth [2]uint64 `json:"bm,omitzero" cbor:"27,keyasint,omitzero"` // [sent bytes, recv bytes]
|
||||||
|
LoadAvg [3]float64 `json:"la,omitempty" cbor:"28,keyasint"`
|
||||||
|
// TODO: remove other load fields in future release in favor of load avg array
|
||||||
}
|
}
|
||||||
|
|
||||||
type GPUData struct {
|
type GPUData struct {
|
||||||
@@ -89,6 +96,12 @@ type Info struct {
|
|||||||
GpuPct float64 `json:"g,omitempty" cbor:"12,keyasint,omitempty"`
|
GpuPct float64 `json:"g,omitempty" cbor:"12,keyasint,omitempty"`
|
||||||
DashboardTemp float64 `json:"dt,omitempty" cbor:"13,keyasint,omitempty"`
|
DashboardTemp float64 `json:"dt,omitempty" cbor:"13,keyasint,omitempty"`
|
||||||
Os Os `json:"os" cbor:"14,keyasint"`
|
Os Os `json:"os" cbor:"14,keyasint"`
|
||||||
|
LoadAvg1 float64 `json:"l1,omitempty" cbor:"15,keyasint,omitempty"`
|
||||||
|
LoadAvg5 float64 `json:"l5,omitempty" cbor:"16,keyasint,omitempty"`
|
||||||
|
LoadAvg15 float64 `json:"l15,omitempty" cbor:"17,keyasint,omitempty"`
|
||||||
|
BandwidthBytes uint64 `json:"bb" cbor:"18,keyasint"`
|
||||||
|
LoadAvg [3]float64 `json:"la,omitempty" cbor:"19,keyasint"`
|
||||||
|
// TODO: remove load fields in future release in favor of load avg array
|
||||||
}
|
}
|
||||||
|
|
||||||
// Final data structure to return to the hub
|
// Final data structure to return to the hub
|
||||||
|
|||||||
@@ -5,10 +5,10 @@ import (
|
|||||||
"beszel/internal/hub/expirymap"
|
"beszel/internal/hub/expirymap"
|
||||||
"beszel/internal/hub/ws"
|
"beszel/internal/hub/ws"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/blang/semver"
|
"github.com/blang/semver"
|
||||||
@@ -17,118 +17,96 @@ import (
|
|||||||
"github.com/pocketbase/pocketbase/core"
|
"github.com/pocketbase/pocketbase/core"
|
||||||
)
|
)
|
||||||
|
|
||||||
// tokenMap maps tokens to user IDs for universal tokens
|
// agentConnectRequest holds information related to an agent's connection attempt.
|
||||||
var tokenMap *expirymap.ExpiryMap[string]
|
|
||||||
|
|
||||||
type agentConnectRequest struct {
|
type agentConnectRequest struct {
|
||||||
|
hub *Hub
|
||||||
|
req *http.Request
|
||||||
|
res http.ResponseWriter
|
||||||
token string
|
token string
|
||||||
agentSemVer semver.Version
|
agentSemVer semver.Version
|
||||||
// for universal token
|
// isUniversalToken is true if the token is a universal token.
|
||||||
isUniversalToken bool
|
isUniversalToken bool
|
||||||
|
// userId is the user ID associated with the universal token.
|
||||||
userId string
|
userId string
|
||||||
remoteAddr string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// validateAgentHeaders validates the required headers from agent connection requests.
|
// universalTokenMap stores active universal tokens and their associated user IDs.
|
||||||
func (h *Hub) validateAgentHeaders(headers http.Header) (string, string, error) {
|
var universalTokenMap tokenMap
|
||||||
token := headers.Get("X-Token")
|
|
||||||
agentVersion := headers.Get("X-Beszel")
|
|
||||||
|
|
||||||
if agentVersion == "" || token == "" || len(token) > 512 {
|
type tokenMap struct {
|
||||||
return "", "", errors.New("")
|
store *expirymap.ExpiryMap[string]
|
||||||
}
|
once sync.Once
|
||||||
return token, agentVersion, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// getFingerprintRecord retrieves fingerprint data from the database by token.
|
// getMap returns the expirymap, creating it if necessary.
|
||||||
func (h *Hub) getFingerprintRecord(token string, recordData *ws.FingerprintRecord) error {
|
func (tm *tokenMap) GetMap() *expirymap.ExpiryMap[string] {
|
||||||
err := h.DB().NewQuery("SELECT id, system, fingerprint, token FROM fingerprints WHERE token = {:token}").
|
tm.once.Do(func() {
|
||||||
Bind(dbx.Params{
|
tm.store = expirymap.New[string](time.Hour)
|
||||||
"token": token,
|
})
|
||||||
}).
|
return tm.store
|
||||||
One(recordData)
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// sendResponseError sends an HTTP error response with the given status code and message.
|
// handleAgentConnect is the HTTP handler for an agent's connection request.
|
||||||
func sendResponseError(res http.ResponseWriter, code int, message string) error {
|
|
||||||
res.WriteHeader(code)
|
|
||||||
if message != "" {
|
|
||||||
res.Write([]byte(message))
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// handleAgentConnect handles the incoming connection request from the agent.
|
|
||||||
func (h *Hub) handleAgentConnect(e *core.RequestEvent) error {
|
func (h *Hub) handleAgentConnect(e *core.RequestEvent) error {
|
||||||
if err := h.agentConnect(e.Request, e.Response); err != nil {
|
agentRequest := agentConnectRequest{req: e.Request, res: e.Response, hub: h}
|
||||||
return err
|
_ = agentRequest.agentConnect()
|
||||||
}
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// agentConnect handles agent connection requests, validating credentials and upgrading to WebSocket.
|
// agentConnect validates agent credentials and upgrades the connection to a WebSocket.
|
||||||
func (h *Hub) agentConnect(req *http.Request, res http.ResponseWriter) (err error) {
|
func (acr *agentConnectRequest) agentConnect() (err error) {
|
||||||
var agentConnectRequest agentConnectRequest
|
|
||||||
var agentVersion string
|
var agentVersion string
|
||||||
// check if user agent and token are valid
|
|
||||||
agentConnectRequest.token, agentVersion, err = h.validateAgentHeaders(req.Header)
|
acr.token, agentVersion, err = acr.validateAgentHeaders(acr.req.Header)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return sendResponseError(res, http.StatusUnauthorized, "")
|
return acr.sendResponseError(acr.res, http.StatusBadRequest, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pull fingerprint from database matching token
|
// Check if token is an active universal token
|
||||||
var fpRecord ws.FingerprintRecord
|
acr.userId, acr.isUniversalToken = universalTokenMap.GetMap().GetOk(acr.token)
|
||||||
err = h.getFingerprintRecord(agentConnectRequest.token, &fpRecord)
|
|
||||||
|
|
||||||
// if no existing record, check if token is a universal token
|
// Find matching fingerprint records for this token
|
||||||
if err != nil {
|
fpRecords := getFingerprintRecordsByToken(acr.token, acr.hub)
|
||||||
if err = checkUniversalToken(&agentConnectRequest); err == nil {
|
if len(fpRecords) == 0 && !acr.isUniversalToken {
|
||||||
// if this is a universal token, set the remote address and new record token
|
// Invalid token - no records found and not a universal token
|
||||||
agentConnectRequest.remoteAddr = getRealIP(req)
|
return acr.sendResponseError(acr.res, http.StatusUnauthorized, "Invalid token")
|
||||||
fpRecord.Token = agentConnectRequest.token
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If no matching token, return unauthorized
|
|
||||||
if err != nil {
|
|
||||||
return sendResponseError(res, http.StatusUnauthorized, "Invalid token")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate agent version
|
// Validate agent version
|
||||||
agentConnectRequest.agentSemVer, err = semver.Parse(agentVersion)
|
acr.agentSemVer, err = semver.Parse(agentVersion)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return sendResponseError(res, http.StatusUnauthorized, "Invalid agent version")
|
return acr.sendResponseError(acr.res, http.StatusUnauthorized, "Invalid agent version")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Upgrade connection to WebSocket
|
// Upgrade connection to WebSocket
|
||||||
conn, err := ws.GetUpgrader().Upgrade(res, req)
|
conn, err := ws.GetUpgrader().Upgrade(acr.res, acr.req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return sendResponseError(res, http.StatusInternalServerError, "WebSocket upgrade failed")
|
return acr.sendResponseError(acr.res, http.StatusInternalServerError, "WebSocket upgrade failed")
|
||||||
}
|
}
|
||||||
|
|
||||||
go h.verifyWsConn(conn, agentConnectRequest, fpRecord)
|
go acr.verifyWsConn(conn, fpRecords)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// verifyWsConn verifies the WebSocket connection using agent's fingerprint and SSH key signature.
|
// verifyWsConn verifies the WebSocket connection using the agent's fingerprint and
|
||||||
func (h *Hub) verifyWsConn(conn *gws.Conn, acr agentConnectRequest, fpRecord ws.FingerprintRecord) (err error) {
|
// SSH key signature, then adds the system to the system manager.
|
||||||
|
func (acr *agentConnectRequest) verifyWsConn(conn *gws.Conn, fpRecords []ws.FingerprintRecord) (err error) {
|
||||||
wsConn := ws.NewWsConnection(conn)
|
wsConn := ws.NewWsConnection(conn)
|
||||||
// must be set before the read loop
|
|
||||||
|
// must set wsConn in connection store before the read loop
|
||||||
conn.Session().Store("wsConn", wsConn)
|
conn.Session().Store("wsConn", wsConn)
|
||||||
|
|
||||||
// make sure connection is closed if there is an error
|
// make sure connection is closed if there is an error
|
||||||
defer func() {
|
defer func() {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
wsConn.Close()
|
wsConn.Close([]byte(err.Error()))
|
||||||
h.Logger().Error("WebSocket error", "error", err, "system", fpRecord.SystemId)
|
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
go conn.ReadLoop()
|
go conn.ReadLoop()
|
||||||
|
|
||||||
signer, err := h.GetSSHKey("")
|
signer, err := acr.hub.GetSSHKey("")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -138,40 +116,152 @@ func (h *Hub) verifyWsConn(conn *gws.Conn, acr agentConnectRequest, fpRecord ws.
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create system if using universal token
|
// Find or create the appropriate system for this token and fingerprint
|
||||||
if acr.isUniversalToken {
|
fpRecord, err := acr.findOrCreateSystemForToken(fpRecords, agentFingerprint)
|
||||||
if acr.userId == "" {
|
|
||||||
return errors.New("token user not found")
|
|
||||||
}
|
|
||||||
fpRecord.SystemId, err = h.createSystemFromAgentData(&acr, agentFingerprint)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to create system from universal token: %w", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch {
|
|
||||||
// If no current fingerprint, update with new fingerprint (first time connecting)
|
|
||||||
case fpRecord.Fingerprint == "":
|
|
||||||
if err := h.SetFingerprint(&fpRecord, agentFingerprint.Fingerprint); err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
// Abort if fingerprint exists but doesn't match (different machine)
|
|
||||||
case fpRecord.Fingerprint != agentFingerprint.Fingerprint:
|
|
||||||
return errors.New("fingerprint mismatch")
|
|
||||||
}
|
|
||||||
|
|
||||||
return h.sm.AddWebSocketSystem(fpRecord.SystemId, acr.agentSemVer, wsConn)
|
return acr.hub.sm.AddWebSocketSystem(fpRecord.SystemId, acr.agentSemVer, wsConn)
|
||||||
}
|
}
|
||||||
|
|
||||||
// createSystemFromAgentData creates a new system record using data from the agent
|
// validateAgentHeaders extracts and validates the token and agent version from HTTP headers.
|
||||||
func (h *Hub) createSystemFromAgentData(acr *agentConnectRequest, agentFingerprint common.FingerprintResponse) (recordId string, err error) {
|
func (acr *agentConnectRequest) validateAgentHeaders(headers http.Header) (string, string, error) {
|
||||||
systemsCollection, err := h.FindCollectionByNameOrId("systems")
|
token := headers.Get("X-Token")
|
||||||
if err != nil {
|
agentVersion := headers.Get("X-Beszel")
|
||||||
return "", fmt.Errorf("failed to find systems collection: %w", err)
|
|
||||||
|
if agentVersion == "" || token == "" || len(token) > 64 {
|
||||||
|
return "", "", errors.New("")
|
||||||
}
|
}
|
||||||
|
return token, agentVersion, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// sendResponseError writes an HTTP error response.
|
||||||
|
func (acr *agentConnectRequest) sendResponseError(res http.ResponseWriter, code int, message string) error {
|
||||||
|
res.WriteHeader(code)
|
||||||
|
if message != "" {
|
||||||
|
res.Write([]byte(message))
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// getFingerprintRecordsByToken retrieves all fingerprint records associated with a given token.
|
||||||
|
func getFingerprintRecordsByToken(token string, h *Hub) []ws.FingerprintRecord {
|
||||||
|
var records []ws.FingerprintRecord
|
||||||
|
// All will populate empty slice even on error
|
||||||
|
_ = h.DB().NewQuery("SELECT id, system, fingerprint, token FROM fingerprints WHERE token = {:token}").
|
||||||
|
Bind(dbx.Params{
|
||||||
|
"token": token,
|
||||||
|
}).
|
||||||
|
All(&records)
|
||||||
|
return records
|
||||||
|
}
|
||||||
|
|
||||||
|
// findOrCreateSystemForToken finds an existing system matching the token and fingerprint,
|
||||||
|
// or creates a new one for a universal token.
|
||||||
|
func (acr *agentConnectRequest) findOrCreateSystemForToken(fpRecords []ws.FingerprintRecord, agentFingerprint common.FingerprintResponse) (ws.FingerprintRecord, error) {
|
||||||
|
// No records - only valid for active universal tokens
|
||||||
|
if len(fpRecords) == 0 {
|
||||||
|
return acr.handleNoRecords(agentFingerprint)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Single record - handle as regular token
|
||||||
|
if len(fpRecords) == 1 && !acr.isUniversalToken {
|
||||||
|
return acr.handleSingleRecord(fpRecords[0], agentFingerprint)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Multiple records or universal token - look for matching fingerprint
|
||||||
|
return acr.handleMultipleRecordsOrUniversalToken(fpRecords, agentFingerprint)
|
||||||
|
}
|
||||||
|
|
||||||
|
// handleNoRecords handles the case where no fingerprint records are found for a token.
|
||||||
|
// A new system is created if the token is a valid universal token.
|
||||||
|
func (acr *agentConnectRequest) handleNoRecords(agentFingerprint common.FingerprintResponse) (ws.FingerprintRecord, error) {
|
||||||
|
var fpRecord ws.FingerprintRecord
|
||||||
|
|
||||||
|
if !acr.isUniversalToken || acr.userId == "" {
|
||||||
|
return fpRecord, errors.New("no matching fingerprints")
|
||||||
|
}
|
||||||
|
|
||||||
|
return acr.createNewSystemForUniversalToken(agentFingerprint)
|
||||||
|
}
|
||||||
|
|
||||||
|
// handleSingleRecord handles the case with a single fingerprint record. It validates
|
||||||
|
// the agent's fingerprint against the stored one, or sets it on first connect.
|
||||||
|
func (acr *agentConnectRequest) handleSingleRecord(fpRecord ws.FingerprintRecord, agentFingerprint common.FingerprintResponse) (ws.FingerprintRecord, error) {
|
||||||
|
// If no current fingerprint, update with new fingerprint (first time connecting)
|
||||||
|
if fpRecord.Fingerprint == "" {
|
||||||
|
if err := acr.hub.SetFingerprint(&fpRecord, agentFingerprint.Fingerprint); err != nil {
|
||||||
|
return fpRecord, err
|
||||||
|
}
|
||||||
|
// Update the record with the fingerprint that was set
|
||||||
|
fpRecord.Fingerprint = agentFingerprint.Fingerprint
|
||||||
|
return fpRecord, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Abort if fingerprint exists but doesn't match (different machine)
|
||||||
|
if fpRecord.Fingerprint != agentFingerprint.Fingerprint {
|
||||||
|
return fpRecord, errors.New("fingerprint mismatch")
|
||||||
|
}
|
||||||
|
|
||||||
|
return fpRecord, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// handleMultipleRecordsOrUniversalToken finds a matching fingerprint from multiple records.
|
||||||
|
// If no match is found and the token is a universal token, a new system is created.
|
||||||
|
func (acr *agentConnectRequest) handleMultipleRecordsOrUniversalToken(fpRecords []ws.FingerprintRecord, agentFingerprint common.FingerprintResponse) (ws.FingerprintRecord, error) {
|
||||||
|
// Return existing record with matching fingerprint if found
|
||||||
|
for i := range fpRecords {
|
||||||
|
if fpRecords[i].Fingerprint == agentFingerprint.Fingerprint {
|
||||||
|
return fpRecords[i], nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// No matching fingerprint record found, but it's
|
||||||
|
// an active universal token so create a new system
|
||||||
|
if acr.isUniversalToken {
|
||||||
|
return acr.createNewSystemForUniversalToken(agentFingerprint)
|
||||||
|
}
|
||||||
|
|
||||||
|
return ws.FingerprintRecord{}, errors.New("fingerprint mismatch")
|
||||||
|
}
|
||||||
|
|
||||||
|
// createNewSystemForUniversalToken creates a new system and fingerprint record for a universal token.
|
||||||
|
func (acr *agentConnectRequest) createNewSystemForUniversalToken(agentFingerprint common.FingerprintResponse) (ws.FingerprintRecord, error) {
|
||||||
|
var fpRecord ws.FingerprintRecord
|
||||||
|
if !acr.isUniversalToken || acr.userId == "" {
|
||||||
|
return fpRecord, errors.New("invalid token")
|
||||||
|
}
|
||||||
|
|
||||||
|
fpRecord.Token = acr.token
|
||||||
|
|
||||||
|
systemId, err := acr.createSystem(agentFingerprint)
|
||||||
|
if err != nil {
|
||||||
|
return fpRecord, err
|
||||||
|
}
|
||||||
|
fpRecord.SystemId = systemId
|
||||||
|
|
||||||
|
// Set the fingerprint for the new system
|
||||||
|
if err := acr.hub.SetFingerprint(&fpRecord, agentFingerprint.Fingerprint); err != nil {
|
||||||
|
return fpRecord, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update the record with the fingerprint that was set
|
||||||
|
fpRecord.Fingerprint = agentFingerprint.Fingerprint
|
||||||
|
|
||||||
|
return fpRecord, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// createSystem creates a new system record in the database using details from the agent.
|
||||||
|
func (acr *agentConnectRequest) createSystem(agentFingerprint common.FingerprintResponse) (recordId string, err error) {
|
||||||
|
systemsCollection, err := acr.hub.FindCachedCollectionByNameOrId("systems")
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
remoteAddr := getRealIP(acr.req)
|
||||||
// separate port from address
|
// separate port from address
|
||||||
if agentFingerprint.Hostname == "" {
|
if agentFingerprint.Hostname == "" {
|
||||||
agentFingerprint.Hostname = acr.remoteAddr
|
agentFingerprint.Hostname = remoteAddr
|
||||||
}
|
}
|
||||||
if agentFingerprint.Port == "" {
|
if agentFingerprint.Port == "" {
|
||||||
agentFingerprint.Port = "45876"
|
agentFingerprint.Port = "45876"
|
||||||
@@ -179,14 +269,14 @@ func (h *Hub) createSystemFromAgentData(acr *agentConnectRequest, agentFingerpri
|
|||||||
// create new record
|
// create new record
|
||||||
systemRecord := core.NewRecord(systemsCollection)
|
systemRecord := core.NewRecord(systemsCollection)
|
||||||
systemRecord.Set("name", agentFingerprint.Hostname)
|
systemRecord.Set("name", agentFingerprint.Hostname)
|
||||||
systemRecord.Set("host", acr.remoteAddr)
|
systemRecord.Set("host", remoteAddr)
|
||||||
systemRecord.Set("port", agentFingerprint.Port)
|
systemRecord.Set("port", agentFingerprint.Port)
|
||||||
systemRecord.Set("users", []string{acr.userId})
|
systemRecord.Set("users", []string{acr.userId})
|
||||||
|
|
||||||
return systemRecord.Id, h.Save(systemRecord)
|
return systemRecord.Id, acr.hub.Save(systemRecord)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetFingerprint updates the fingerprint for a given record ID.
|
// SetFingerprint creates or updates a fingerprint record in the database.
|
||||||
func (h *Hub) SetFingerprint(fpRecord *ws.FingerprintRecord, fingerprint string) (err error) {
|
func (h *Hub) SetFingerprint(fpRecord *ws.FingerprintRecord, fingerprint string) (err error) {
|
||||||
// // can't use raw query here because it doesn't trigger SSE
|
// // can't use raw query here because it doesn't trigger SSE
|
||||||
var record *core.Record
|
var record *core.Record
|
||||||
@@ -207,25 +297,8 @@ func (h *Hub) SetFingerprint(fpRecord *ws.FingerprintRecord, fingerprint string)
|
|||||||
return h.SaveNoValidate(record)
|
return h.SaveNoValidate(record)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getTokenMap() *expirymap.ExpiryMap[string] {
|
// getRealIP extracts the client's real IP address from request headers,
|
||||||
if tokenMap == nil {
|
// checking common proxy headers before falling back to the remote address.
|
||||||
tokenMap = expirymap.New[string](time.Hour)
|
|
||||||
}
|
|
||||||
return tokenMap
|
|
||||||
}
|
|
||||||
|
|
||||||
func checkUniversalToken(acr *agentConnectRequest) (err error) {
|
|
||||||
if tokenMap == nil {
|
|
||||||
tokenMap = expirymap.New[string](time.Hour)
|
|
||||||
}
|
|
||||||
acr.userId, acr.isUniversalToken = tokenMap.GetOk(acr.token)
|
|
||||||
if !acr.isUniversalToken {
|
|
||||||
return errors.New("invalid token")
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// getRealIP attempts to extract the real IP address from the request headers.
|
|
||||||
func getRealIP(r *http.Request) string {
|
func getRealIP(r *http.Request) string {
|
||||||
if ip := r.Header.Get("CF-Connecting-IP"); ip != "" {
|
if ip := r.Header.Get("CF-Connecting-IP"); ip != "" {
|
||||||
return ip
|
return ip
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -215,7 +215,7 @@ func (h *Hub) startServer(se *core.ServeEvent) error {
|
|||||||
|
|
||||||
// registerCronJobs sets up scheduled tasks
|
// registerCronJobs sets up scheduled tasks
|
||||||
func (h *Hub) registerCronJobs(_ *core.ServeEvent) error {
|
func (h *Hub) registerCronJobs(_ *core.ServeEvent) error {
|
||||||
// delete old records once every hour
|
// delete old system_stats and alerts_history records once every hour
|
||||||
h.Cron().MustAdd("delete old records", "8 * * * *", h.rm.DeleteOldRecords)
|
h.Cron().MustAdd("delete old records", "8 * * * *", h.rm.DeleteOldRecords)
|
||||||
// create longer records every 10 minutes
|
// create longer records every 10 minutes
|
||||||
h.Cron().MustAdd("create longer records", "*/10 * * * *", h.rm.CreateLongerRecords)
|
h.Cron().MustAdd("create longer records", "*/10 * * * *", h.rm.CreateLongerRecords)
|
||||||
@@ -259,7 +259,7 @@ func (h *Hub) getUniversalToken(e *core.RequestEvent) error {
|
|||||||
return apis.NewForbiddenError("Forbidden", nil)
|
return apis.NewForbiddenError("Forbidden", nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
tokenMap := getTokenMap()
|
tokenMap := universalTokenMap.GetMap()
|
||||||
userID := info.Auth.Id
|
userID := info.Auth.Id
|
||||||
query := e.Request.URL.Query()
|
query := e.Request.URL.Query()
|
||||||
token := query.Get("token")
|
token := query.Get("token")
|
||||||
|
|||||||
@@ -254,5 +254,3 @@ func TestGetSSHKey(t *testing.T) {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// Helper function to create test records
|
|
||||||
|
|||||||
@@ -365,7 +365,7 @@ func (sys *System) closeSSHConnection() {
|
|||||||
// The system will be set as down a few seconds later if the connection is not re-established.
|
// The system will be set as down a few seconds later if the connection is not re-established.
|
||||||
func (sys *System) closeWebSocketConnection() {
|
func (sys *System) closeWebSocketConnection() {
|
||||||
if sys.WsConn != nil {
|
if sys.WsConn != nil {
|
||||||
sys.WsConn.Close()
|
sys.WsConn.Close(nil)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -159,8 +159,10 @@ func (sm *SystemManager) onRecordUpdate(e *core.RecordEvent) error {
|
|||||||
// - down: Triggers status change alerts
|
// - down: Triggers status change alerts
|
||||||
func (sm *SystemManager) onRecordAfterUpdateSuccess(e *core.RecordEvent) error {
|
func (sm *SystemManager) onRecordAfterUpdateSuccess(e *core.RecordEvent) error {
|
||||||
newStatus := e.Record.GetString("status")
|
newStatus := e.Record.GetString("status")
|
||||||
|
prevStatus := pending
|
||||||
system, ok := sm.systems.GetOk(e.Record.Id)
|
system, ok := sm.systems.GetOk(e.Record.Id)
|
||||||
if ok {
|
if ok {
|
||||||
|
prevStatus = system.Status
|
||||||
system.Status = newStatus
|
system.Status = newStatus
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -182,6 +184,7 @@ func (sm *SystemManager) onRecordAfterUpdateSuccess(e *core.RecordEvent) error {
|
|||||||
if err := sm.AddRecord(e.Record, nil); err != nil {
|
if err := sm.AddRecord(e.Record, nil); err != nil {
|
||||||
e.App.Logger().Error("Error adding record", "err", err)
|
e.App.Logger().Error("Error adding record", "err", err)
|
||||||
}
|
}
|
||||||
|
_ = deactivateAlerts(e.App, e.Record.Id)
|
||||||
return e.Next()
|
return e.Next()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -190,8 +193,6 @@ func (sm *SystemManager) onRecordAfterUpdateSuccess(e *core.RecordEvent) error {
|
|||||||
return sm.AddRecord(e.Record, nil)
|
return sm.AddRecord(e.Record, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
prevStatus := system.Status
|
|
||||||
|
|
||||||
// Trigger system alerts when system comes online
|
// Trigger system alerts when system comes online
|
||||||
if newStatus == up {
|
if newStatus == up {
|
||||||
if err := sm.hub.HandleSystemAlerts(e.Record, system.data); err != nil {
|
if err := sm.hub.HandleSystemAlerts(e.Record, system.data); err != nil {
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ func (h *Handler) OnMessage(conn *gws.Conn, message *gws.Message) {
|
|||||||
case wsConn.(*WsConn).responseChan <- message:
|
case wsConn.(*WsConn).responseChan <- message:
|
||||||
default:
|
default:
|
||||||
// close if the connection is not expecting a response
|
// close if the connection is not expecting a response
|
||||||
wsConn.(*WsConn).Close()
|
wsConn.(*WsConn).Close(nil)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,9 +100,9 @@ func (h *Handler) OnClose(conn *gws.Conn, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Close terminates the WebSocket connection gracefully.
|
// Close terminates the WebSocket connection gracefully.
|
||||||
func (ws *WsConn) Close() {
|
func (ws *WsConn) Close(msg []byte) {
|
||||||
if ws.IsConnected() {
|
if ws.IsConnected() {
|
||||||
ws.conn.WriteClose(1000, nil)
|
ws.conn.WriteClose(1000, msg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,6 +114,9 @@ func (ws *WsConn) Ping() error {
|
|||||||
|
|
||||||
// sendMessage encodes data to CBOR and sends it as a binary message to the agent.
|
// sendMessage encodes data to CBOR and sends it as a binary message to the agent.
|
||||||
func (ws *WsConn) sendMessage(data common.HubRequest[any]) error {
|
func (ws *WsConn) sendMessage(data common.HubRequest[any]) error {
|
||||||
|
if ws.conn == nil {
|
||||||
|
return gws.ErrConnClosed
|
||||||
|
}
|
||||||
bytes, err := cbor.Marshal(data)
|
bytes, err := cbor.Marshal(data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -130,7 +133,7 @@ func (ws *WsConn) RequestSystemData(data *system.CombinedData) error {
|
|||||||
})
|
})
|
||||||
select {
|
select {
|
||||||
case <-time.After(10 * time.Second):
|
case <-time.After(10 * time.Second):
|
||||||
ws.Close()
|
ws.Close(nil)
|
||||||
return gws.ErrConnClosed
|
return gws.ErrConnClosed
|
||||||
case message = <-ws.responseChan:
|
case message = <-ws.responseChan:
|
||||||
}
|
}
|
||||||
@@ -140,11 +143,12 @@ func (ws *WsConn) RequestSystemData(data *system.CombinedData) error {
|
|||||||
|
|
||||||
// GetFingerprint authenticates with the agent using SSH signature and returns the agent's fingerprint.
|
// GetFingerprint authenticates with the agent using SSH signature and returns the agent's fingerprint.
|
||||||
func (ws *WsConn) GetFingerprint(token string, signer ssh.Signer, needSysInfo bool) (common.FingerprintResponse, error) {
|
func (ws *WsConn) GetFingerprint(token string, signer ssh.Signer, needSysInfo bool) (common.FingerprintResponse, error) {
|
||||||
|
var clientFingerprint common.FingerprintResponse
|
||||||
challenge := []byte(token)
|
challenge := []byte(token)
|
||||||
|
|
||||||
signature, err := signer.Sign(nil, challenge)
|
signature, err := signer.Sign(nil, challenge)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return common.FingerprintResponse{}, err
|
return clientFingerprint, err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = ws.sendMessage(common.HubRequest[any]{
|
err = ws.sendMessage(common.HubRequest[any]{
|
||||||
@@ -155,24 +159,19 @@ func (ws *WsConn) GetFingerprint(token string, signer ssh.Signer, needSysInfo bo
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return common.FingerprintResponse{}, err
|
return clientFingerprint, err
|
||||||
}
|
}
|
||||||
|
|
||||||
var message *gws.Message
|
var message *gws.Message
|
||||||
var clientFingerprint common.FingerprintResponse
|
|
||||||
select {
|
select {
|
||||||
case message = <-ws.responseChan:
|
case message = <-ws.responseChan:
|
||||||
case <-time.After(10 * time.Second):
|
case <-time.After(10 * time.Second):
|
||||||
return common.FingerprintResponse{}, errors.New("request expired")
|
return clientFingerprint, errors.New("request expired")
|
||||||
}
|
}
|
||||||
defer message.Close()
|
defer message.Close()
|
||||||
|
|
||||||
err = cbor.Unmarshal(message.Data.Bytes(), &clientFingerprint)
|
err = cbor.Unmarshal(message.Data.Bytes(), &clientFingerprint)
|
||||||
if err != nil {
|
return clientFingerprint, err
|
||||||
return common.FingerprintResponse{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return clientFingerprint, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsConnected returns true if the WebSocket connection is active.
|
// IsConnected returns true if the WebSocket connection is active.
|
||||||
|
|||||||
221
beszel/internal/hub/ws/ws_test.go
Normal file
221
beszel/internal/hub/ws/ws_test.go
Normal file
@@ -0,0 +1,221 @@
|
|||||||
|
//go:build testing
|
||||||
|
// +build testing
|
||||||
|
|
||||||
|
package ws
|
||||||
|
|
||||||
|
import (
|
||||||
|
"beszel/internal/common"
|
||||||
|
"crypto/ed25519"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/fxamacker/cbor/v2"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
"golang.org/x/crypto/ssh"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TestGetUpgrader tests the singleton upgrader
|
||||||
|
func TestGetUpgrader(t *testing.T) {
|
||||||
|
// Reset the global upgrader to test singleton behavior
|
||||||
|
upgrader = nil
|
||||||
|
|
||||||
|
// First call should create the upgrader
|
||||||
|
upgrader1 := GetUpgrader()
|
||||||
|
assert.NotNil(t, upgrader1, "Upgrader should not be nil")
|
||||||
|
|
||||||
|
// Second call should return the same instance
|
||||||
|
upgrader2 := GetUpgrader()
|
||||||
|
assert.Same(t, upgrader1, upgrader2, "Should return the same upgrader instance")
|
||||||
|
|
||||||
|
// Verify it's properly configured
|
||||||
|
assert.NotNil(t, upgrader1, "Upgrader should be configured")
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestNewWsConnection tests WebSocket connection creation
|
||||||
|
func TestNewWsConnection(t *testing.T) {
|
||||||
|
// We can't easily mock gws.Conn, so we'll pass nil and test the structure
|
||||||
|
wsConn := NewWsConnection(nil)
|
||||||
|
|
||||||
|
assert.NotNil(t, wsConn, "WebSocket connection should not be nil")
|
||||||
|
assert.Nil(t, wsConn.conn, "Connection should be nil as passed")
|
||||||
|
assert.NotNil(t, wsConn.responseChan, "Response channel should be initialized")
|
||||||
|
assert.NotNil(t, wsConn.DownChan, "Down channel should be initialized")
|
||||||
|
assert.Equal(t, 1, cap(wsConn.responseChan), "Response channel should have capacity of 1")
|
||||||
|
assert.Equal(t, 1, cap(wsConn.DownChan), "Down channel should have capacity of 1")
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestWsConn_IsConnected tests the connection status check
|
||||||
|
func TestWsConn_IsConnected(t *testing.T) {
|
||||||
|
// Test with nil connection
|
||||||
|
wsConn := NewWsConnection(nil)
|
||||||
|
assert.False(t, wsConn.IsConnected(), "Should not be connected when conn is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestWsConn_Close tests the connection closing with nil connection
|
||||||
|
func TestWsConn_Close(t *testing.T) {
|
||||||
|
wsConn := NewWsConnection(nil)
|
||||||
|
|
||||||
|
// Should handle nil connection gracefully
|
||||||
|
assert.NotPanics(t, func() {
|
||||||
|
wsConn.Close([]byte("test message"))
|
||||||
|
}, "Should not panic when closing nil connection")
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestWsConn_SendMessage_CBOR tests CBOR encoding in sendMessage
|
||||||
|
func TestWsConn_SendMessage_CBOR(t *testing.T) {
|
||||||
|
wsConn := NewWsConnection(nil)
|
||||||
|
|
||||||
|
testData := common.HubRequest[any]{
|
||||||
|
Action: common.GetData,
|
||||||
|
Data: "test data",
|
||||||
|
}
|
||||||
|
|
||||||
|
// This will fail because conn is nil, but we can test the CBOR encoding logic
|
||||||
|
// by checking that the function properly encodes to CBOR before failing
|
||||||
|
err := wsConn.sendMessage(testData)
|
||||||
|
assert.Error(t, err, "Should error with nil connection")
|
||||||
|
|
||||||
|
// Test CBOR encoding separately
|
||||||
|
bytes, err := cbor.Marshal(testData)
|
||||||
|
assert.NoError(t, err, "Should encode to CBOR successfully")
|
||||||
|
|
||||||
|
// Verify we can decode it back
|
||||||
|
var decodedData common.HubRequest[any]
|
||||||
|
err = cbor.Unmarshal(bytes, &decodedData)
|
||||||
|
assert.NoError(t, err, "Should decode from CBOR successfully")
|
||||||
|
assert.Equal(t, testData.Action, decodedData.Action, "Action should match")
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestWsConn_GetFingerprint_SignatureGeneration tests signature creation logic
|
||||||
|
func TestWsConn_GetFingerprint_SignatureGeneration(t *testing.T) {
|
||||||
|
// Generate test key pair
|
||||||
|
_, privKey, err := ed25519.GenerateKey(nil)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
signer, err := ssh.NewSignerFromKey(privKey)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
token := "test-token"
|
||||||
|
|
||||||
|
// This will timeout since conn is nil, but we can verify the signature logic
|
||||||
|
// We can't test the full flow, but we can test that the signature is created properly
|
||||||
|
challenge := []byte(token)
|
||||||
|
signature, err := signer.Sign(nil, challenge)
|
||||||
|
assert.NoError(t, err, "Should create signature successfully")
|
||||||
|
assert.NotEmpty(t, signature.Blob, "Signature blob should not be empty")
|
||||||
|
assert.Equal(t, signer.PublicKey().Type(), signature.Format, "Signature format should match key type")
|
||||||
|
|
||||||
|
// Test the fingerprint request structure
|
||||||
|
fpRequest := common.FingerprintRequest{
|
||||||
|
Signature: signature.Blob,
|
||||||
|
NeedSysInfo: true,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test CBOR encoding of fingerprint request
|
||||||
|
fpData, err := cbor.Marshal(fpRequest)
|
||||||
|
assert.NoError(t, err, "Should encode fingerprint request to CBOR")
|
||||||
|
|
||||||
|
var decodedFpRequest common.FingerprintRequest
|
||||||
|
err = cbor.Unmarshal(fpData, &decodedFpRequest)
|
||||||
|
assert.NoError(t, err, "Should decode fingerprint request from CBOR")
|
||||||
|
assert.Equal(t, fpRequest.Signature, decodedFpRequest.Signature, "Signature should match")
|
||||||
|
assert.Equal(t, fpRequest.NeedSysInfo, decodedFpRequest.NeedSysInfo, "NeedSysInfo should match")
|
||||||
|
|
||||||
|
// Test the full hub request structure
|
||||||
|
hubRequest := common.HubRequest[any]{
|
||||||
|
Action: common.CheckFingerprint,
|
||||||
|
Data: fpRequest,
|
||||||
|
}
|
||||||
|
|
||||||
|
hubData, err := cbor.Marshal(hubRequest)
|
||||||
|
assert.NoError(t, err, "Should encode hub request to CBOR")
|
||||||
|
|
||||||
|
var decodedHubRequest common.HubRequest[cbor.RawMessage]
|
||||||
|
err = cbor.Unmarshal(hubData, &decodedHubRequest)
|
||||||
|
assert.NoError(t, err, "Should decode hub request from CBOR")
|
||||||
|
assert.Equal(t, common.CheckFingerprint, decodedHubRequest.Action, "Action should be CheckFingerprint")
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestWsConn_RequestSystemData_RequestFormat tests system data request format
|
||||||
|
func TestWsConn_RequestSystemData_RequestFormat(t *testing.T) {
|
||||||
|
// Test the request format that would be sent
|
||||||
|
request := common.HubRequest[any]{
|
||||||
|
Action: common.GetData,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test CBOR encoding
|
||||||
|
data, err := cbor.Marshal(request)
|
||||||
|
assert.NoError(t, err, "Should encode request to CBOR")
|
||||||
|
|
||||||
|
// Test decoding
|
||||||
|
var decodedRequest common.HubRequest[any]
|
||||||
|
err = cbor.Unmarshal(data, &decodedRequest)
|
||||||
|
assert.NoError(t, err, "Should decode request from CBOR")
|
||||||
|
assert.Equal(t, common.GetData, decodedRequest.Action, "Should have GetData action")
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestFingerprintRecord tests the FingerprintRecord struct
|
||||||
|
func TestFingerprintRecord(t *testing.T) {
|
||||||
|
record := FingerprintRecord{
|
||||||
|
Id: "test-id",
|
||||||
|
SystemId: "system-123",
|
||||||
|
Fingerprint: "test-fingerprint",
|
||||||
|
Token: "test-token",
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.Equal(t, "test-id", record.Id)
|
||||||
|
assert.Equal(t, "system-123", record.SystemId)
|
||||||
|
assert.Equal(t, "test-fingerprint", record.Fingerprint)
|
||||||
|
assert.Equal(t, "test-token", record.Token)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestDeadlineConstant tests that the deadline constant is reasonable
|
||||||
|
func TestDeadlineConstant(t *testing.T) {
|
||||||
|
assert.Equal(t, 70*time.Second, deadline, "Deadline should be 70 seconds")
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestCommonActions tests that the common actions are properly defined
|
||||||
|
func TestCommonActions(t *testing.T) {
|
||||||
|
// Test that the actions we use exist and have expected values
|
||||||
|
assert.Equal(t, common.WebSocketAction(0), common.GetData, "GetData should be action 0")
|
||||||
|
assert.Equal(t, common.WebSocketAction(1), common.CheckFingerprint, "CheckFingerprint should be action 1")
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestHandler tests that we can create a Handler
|
||||||
|
func TestHandler(t *testing.T) {
|
||||||
|
handler := &Handler{}
|
||||||
|
assert.NotNil(t, handler, "Handler should be created successfully")
|
||||||
|
|
||||||
|
// The Handler embeds gws.BuiltinEventHandler, so it should have the embedded type
|
||||||
|
assert.NotNil(t, handler.BuiltinEventHandler, "Should have embedded BuiltinEventHandler")
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestWsConnChannelBehavior tests channel behavior without WebSocket connections
|
||||||
|
func TestWsConnChannelBehavior(t *testing.T) {
|
||||||
|
wsConn := NewWsConnection(nil)
|
||||||
|
|
||||||
|
// Test that channels are properly initialized and can be used
|
||||||
|
select {
|
||||||
|
case wsConn.DownChan <- struct{}{}:
|
||||||
|
// Should be able to write to channel
|
||||||
|
default:
|
||||||
|
t.Error("Should be able to write to DownChan")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test reading from DownChan
|
||||||
|
select {
|
||||||
|
case <-wsConn.DownChan:
|
||||||
|
// Should be able to read from channel
|
||||||
|
case <-time.After(10 * time.Millisecond):
|
||||||
|
t.Error("Should be able to read from DownChan")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Response channel should be empty initially
|
||||||
|
select {
|
||||||
|
case <-wsConn.responseChan:
|
||||||
|
t.Error("Response channel should be empty initially")
|
||||||
|
default:
|
||||||
|
// Expected - channel should be empty
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -203,12 +203,19 @@ func (rm *RecordManager) AverageSystemStats(db dbx.Builder, records RecordIds) *
|
|||||||
sum.DiskWritePs += stats.DiskWritePs
|
sum.DiskWritePs += stats.DiskWritePs
|
||||||
sum.NetworkSent += stats.NetworkSent
|
sum.NetworkSent += stats.NetworkSent
|
||||||
sum.NetworkRecv += stats.NetworkRecv
|
sum.NetworkRecv += stats.NetworkRecv
|
||||||
|
sum.LoadAvg[0] += stats.LoadAvg[0]
|
||||||
|
sum.LoadAvg[1] += stats.LoadAvg[1]
|
||||||
|
sum.LoadAvg[2] += stats.LoadAvg[2]
|
||||||
|
sum.Bandwidth[0] += stats.Bandwidth[0]
|
||||||
|
sum.Bandwidth[1] += stats.Bandwidth[1]
|
||||||
// Set peak values
|
// Set peak values
|
||||||
sum.MaxCpu = max(sum.MaxCpu, stats.MaxCpu, stats.Cpu)
|
sum.MaxCpu = max(sum.MaxCpu, stats.MaxCpu, stats.Cpu)
|
||||||
sum.MaxNetworkSent = max(sum.MaxNetworkSent, stats.MaxNetworkSent, stats.NetworkSent)
|
sum.MaxNetworkSent = max(sum.MaxNetworkSent, stats.MaxNetworkSent, stats.NetworkSent)
|
||||||
sum.MaxNetworkRecv = max(sum.MaxNetworkRecv, stats.MaxNetworkRecv, stats.NetworkRecv)
|
sum.MaxNetworkRecv = max(sum.MaxNetworkRecv, stats.MaxNetworkRecv, stats.NetworkRecv)
|
||||||
sum.MaxDiskReadPs = max(sum.MaxDiskReadPs, stats.MaxDiskReadPs, stats.DiskReadPs)
|
sum.MaxDiskReadPs = max(sum.MaxDiskReadPs, stats.MaxDiskReadPs, stats.DiskReadPs)
|
||||||
sum.MaxDiskWritePs = max(sum.MaxDiskWritePs, stats.MaxDiskWritePs, stats.DiskWritePs)
|
sum.MaxDiskWritePs = max(sum.MaxDiskWritePs, stats.MaxDiskWritePs, stats.DiskWritePs)
|
||||||
|
sum.MaxBandwidth[0] = max(sum.MaxBandwidth[0], stats.MaxBandwidth[0], stats.Bandwidth[0])
|
||||||
|
sum.MaxBandwidth[1] = max(sum.MaxBandwidth[1], stats.MaxBandwidth[1], stats.Bandwidth[1])
|
||||||
|
|
||||||
// Accumulate temperatures
|
// Accumulate temperatures
|
||||||
if stats.Temperatures != nil {
|
if stats.Temperatures != nil {
|
||||||
@@ -278,7 +285,11 @@ func (rm *RecordManager) AverageSystemStats(db dbx.Builder, records RecordIds) *
|
|||||||
sum.DiskWritePs = twoDecimals(sum.DiskWritePs / count)
|
sum.DiskWritePs = twoDecimals(sum.DiskWritePs / count)
|
||||||
sum.NetworkSent = twoDecimals(sum.NetworkSent / count)
|
sum.NetworkSent = twoDecimals(sum.NetworkSent / count)
|
||||||
sum.NetworkRecv = twoDecimals(sum.NetworkRecv / count)
|
sum.NetworkRecv = twoDecimals(sum.NetworkRecv / count)
|
||||||
|
sum.LoadAvg[0] = twoDecimals(sum.LoadAvg[0] / count)
|
||||||
|
sum.LoadAvg[1] = twoDecimals(sum.LoadAvg[1] / count)
|
||||||
|
sum.LoadAvg[2] = twoDecimals(sum.LoadAvg[2] / count)
|
||||||
|
sum.Bandwidth[0] = sum.Bandwidth[0] / uint64(count)
|
||||||
|
sum.Bandwidth[1] = sum.Bandwidth[1] / uint64(count)
|
||||||
// Average temperatures
|
// Average temperatures
|
||||||
if sum.Temperatures != nil && tempCount > 0 {
|
if sum.Temperatures != nil && tempCount > 0 {
|
||||||
for key := range sum.Temperatures {
|
for key := range sum.Temperatures {
|
||||||
@@ -361,12 +372,46 @@ func (rm *RecordManager) AverageContainerStats(db dbx.Builder, records RecordIds
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// Deletes records older than what is displayed in the UI
|
// Delete old records
|
||||||
func (rm *RecordManager) DeleteOldRecords() {
|
func (rm *RecordManager) DeleteOldRecords() {
|
||||||
// Define the collections to process
|
rm.app.RunInTransaction(func(txApp core.App) error {
|
||||||
|
err := deleteOldSystemStats(txApp)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = deleteOldAlertsHistory(txApp, 200, 250)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete old alerts history records
|
||||||
|
func deleteOldAlertsHistory(app core.App, countToKeep, countBeforeDeletion int) error {
|
||||||
|
db := app.DB()
|
||||||
|
var users []struct {
|
||||||
|
Id string `db:"user"`
|
||||||
|
}
|
||||||
|
err := db.NewQuery("SELECT user, COUNT(*) as count FROM alerts_history GROUP BY user HAVING count > {:countBeforeDeletion}").Bind(dbx.Params{"countBeforeDeletion": countBeforeDeletion}).All(&users)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for _, user := range users {
|
||||||
|
_, err = db.NewQuery("DELETE FROM alerts_history WHERE user = {:user} AND id NOT IN (SELECT id FROM alerts_history WHERE user = {:user} ORDER BY created DESC LIMIT {:countToKeep})").Bind(dbx.Params{"user": user.Id, "countToKeep": countToKeep}).Execute()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deletes system_stats records older than what is displayed in the UI
|
||||||
|
func deleteOldSystemStats(app core.App) error {
|
||||||
|
// Collections to process
|
||||||
collections := [2]string{"system_stats", "container_stats"}
|
collections := [2]string{"system_stats", "container_stats"}
|
||||||
|
|
||||||
// Define record types and their retention periods
|
// Record types and their retention periods
|
||||||
type RecordDeletionData struct {
|
type RecordDeletionData struct {
|
||||||
recordType string
|
recordType string
|
||||||
retention time.Duration
|
retention time.Duration
|
||||||
@@ -382,10 +427,9 @@ func (rm *RecordManager) DeleteOldRecords() {
|
|||||||
now := time.Now().UTC()
|
now := time.Now().UTC()
|
||||||
|
|
||||||
for _, collection := range collections {
|
for _, collection := range collections {
|
||||||
// Build the WHERE clause dynamically
|
// Build the WHERE clause
|
||||||
var conditionParts []string
|
var conditionParts []string
|
||||||
var params dbx.Params = make(map[string]any)
|
var params dbx.Params = make(map[string]any)
|
||||||
|
|
||||||
for i := range recordData {
|
for i := range recordData {
|
||||||
rd := recordData[i]
|
rd := recordData[i]
|
||||||
// Create parameterized condition for this record type
|
// Create parameterized condition for this record type
|
||||||
@@ -393,19 +437,15 @@ func (rm *RecordManager) DeleteOldRecords() {
|
|||||||
conditionParts = append(conditionParts, fmt.Sprintf("(type = '%s' AND created < {:%s})", rd.recordType, dateParam))
|
conditionParts = append(conditionParts, fmt.Sprintf("(type = '%s' AND created < {:%s})", rd.recordType, dateParam))
|
||||||
params[dateParam] = now.Add(-rd.retention)
|
params[dateParam] = now.Add(-rd.retention)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Combine conditions with OR
|
// Combine conditions with OR
|
||||||
conditionStr := strings.Join(conditionParts, " OR ")
|
conditionStr := strings.Join(conditionParts, " OR ")
|
||||||
|
// Construct and execute the full raw query
|
||||||
// Construct the full raw query
|
|
||||||
rawQuery := fmt.Sprintf("DELETE FROM %s WHERE %s", collection, conditionStr)
|
rawQuery := fmt.Sprintf("DELETE FROM %s WHERE %s", collection, conditionStr)
|
||||||
|
if _, err := app.DB().NewQuery(rawQuery).Bind(params).Execute(); err != nil {
|
||||||
// Execute the query with parameters
|
return fmt.Errorf("failed to delete from %s: %v", collection, err)
|
||||||
if _, err := rm.app.DB().NewQuery(rawQuery).Bind(params).Execute(); err != nil {
|
|
||||||
// return fmt.Errorf("failed to delete from %s: %v", collection, err)
|
|
||||||
rm.app.Logger().Error("failed to delete", "collection", collection, "error", err)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Round float to two decimals */
|
/* Round float to two decimals */
|
||||||
|
|||||||
381
beszel/internal/records/records_test.go
Normal file
381
beszel/internal/records/records_test.go
Normal file
@@ -0,0 +1,381 @@
|
|||||||
|
//go:build testing
|
||||||
|
// +build testing
|
||||||
|
|
||||||
|
package records_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"beszel/internal/records"
|
||||||
|
"beszel/internal/tests"
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/pocketbase/dbx"
|
||||||
|
"github.com/pocketbase/pocketbase/core"
|
||||||
|
"github.com/pocketbase/pocketbase/tools/types"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TestDeleteOldRecords tests the main DeleteOldRecords function
|
||||||
|
func TestDeleteOldRecords(t *testing.T) {
|
||||||
|
hub, err := tests.NewTestHub(t.TempDir())
|
||||||
|
require.NoError(t, err)
|
||||||
|
defer hub.Cleanup()
|
||||||
|
|
||||||
|
rm := records.NewRecordManager(hub)
|
||||||
|
|
||||||
|
// Create test user for alerts history
|
||||||
|
user, err := tests.CreateUser(hub, "test@example.com", "testtesttest")
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
// Create test system
|
||||||
|
system, err := tests.CreateRecord(hub, "systems", map[string]any{
|
||||||
|
"name": "test-system",
|
||||||
|
"host": "localhost",
|
||||||
|
"port": "45876",
|
||||||
|
"status": "up",
|
||||||
|
"users": []string{user.Id},
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
now := time.Now()
|
||||||
|
|
||||||
|
// Create old system_stats records that should be deleted
|
||||||
|
var record *core.Record
|
||||||
|
record, err = tests.CreateRecord(hub, "system_stats", map[string]any{
|
||||||
|
"system": system.Id,
|
||||||
|
"type": "1m",
|
||||||
|
"stats": `{"cpu": 50.0, "mem": 1024}`,
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
// created is autodate field, so we need to set it manually
|
||||||
|
record.SetRaw("created", now.UTC().Add(-2*time.Hour).Format(types.DefaultDateLayout))
|
||||||
|
err = hub.SaveNoValidate(record)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NotNil(t, record)
|
||||||
|
require.InDelta(t, record.GetDateTime("created").Time().UTC().Unix(), now.UTC().Add(-2*time.Hour).Unix(), 1)
|
||||||
|
require.Equal(t, record.Get("system"), system.Id)
|
||||||
|
require.Equal(t, record.Get("type"), "1m")
|
||||||
|
|
||||||
|
// Create recent system_stats record that should be kept
|
||||||
|
_, err = tests.CreateRecord(hub, "system_stats", map[string]any{
|
||||||
|
"system": system.Id,
|
||||||
|
"type": "1m",
|
||||||
|
"stats": `{"cpu": 30.0, "mem": 512}`,
|
||||||
|
"created": now.Add(-30 * time.Minute), // 30 minutes old, should be kept
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
// Create many alerts history records to trigger deletion
|
||||||
|
for i := range 260 { // More than countBeforeDeletion (250)
|
||||||
|
_, err = tests.CreateRecord(hub, "alerts_history", map[string]any{
|
||||||
|
"user": user.Id,
|
||||||
|
"name": "CPU",
|
||||||
|
"value": i + 1,
|
||||||
|
"system": system.Id,
|
||||||
|
"created": now.Add(-time.Duration(i) * time.Minute),
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Count records before deletion
|
||||||
|
systemStatsCountBefore, err := hub.CountRecords("system_stats")
|
||||||
|
require.NoError(t, err)
|
||||||
|
alertsCountBefore, err := hub.CountRecords("alerts_history")
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
// Run deletion
|
||||||
|
rm.DeleteOldRecords()
|
||||||
|
|
||||||
|
// Count records after deletion
|
||||||
|
systemStatsCountAfter, err := hub.CountRecords("system_stats")
|
||||||
|
require.NoError(t, err)
|
||||||
|
alertsCountAfter, err := hub.CountRecords("alerts_history")
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
// Verify old system stats were deleted
|
||||||
|
assert.Less(t, systemStatsCountAfter, systemStatsCountBefore, "Old system stats should be deleted")
|
||||||
|
|
||||||
|
// Verify alerts history was trimmed
|
||||||
|
assert.Less(t, alertsCountAfter, alertsCountBefore, "Excessive alerts history should be deleted")
|
||||||
|
assert.Equal(t, alertsCountAfter, int64(200), "Alerts count should be equal to countToKeep (200)")
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestDeleteOldSystemStats tests the deleteOldSystemStats function
|
||||||
|
func TestDeleteOldSystemStats(t *testing.T) {
|
||||||
|
hub, err := tests.NewTestHub(t.TempDir())
|
||||||
|
require.NoError(t, err)
|
||||||
|
defer hub.Cleanup()
|
||||||
|
|
||||||
|
// Create test system
|
||||||
|
user, err := tests.CreateUser(hub, "test@example.com", "testtesttest")
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
system, err := tests.CreateRecord(hub, "systems", map[string]any{
|
||||||
|
"name": "test-system",
|
||||||
|
"host": "localhost",
|
||||||
|
"port": "45876",
|
||||||
|
"status": "up",
|
||||||
|
"users": []string{user.Id},
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
now := time.Now().UTC()
|
||||||
|
|
||||||
|
// Test data for different record types and their retention periods
|
||||||
|
testCases := []struct {
|
||||||
|
recordType string
|
||||||
|
retention time.Duration
|
||||||
|
shouldBeKept bool
|
||||||
|
ageFromNow time.Duration
|
||||||
|
description string
|
||||||
|
}{
|
||||||
|
{"1m", time.Hour, true, 30 * time.Minute, "1m record within 1 hour should be kept"},
|
||||||
|
{"1m", time.Hour, false, 2 * time.Hour, "1m record older than 1 hour should be deleted"},
|
||||||
|
{"10m", 12 * time.Hour, true, 6 * time.Hour, "10m record within 12 hours should be kept"},
|
||||||
|
{"10m", 12 * time.Hour, false, 24 * time.Hour, "10m record older than 12 hours should be deleted"},
|
||||||
|
{"20m", 24 * time.Hour, true, 12 * time.Hour, "20m record within 24 hours should be kept"},
|
||||||
|
{"20m", 24 * time.Hour, false, 48 * time.Hour, "20m record older than 24 hours should be deleted"},
|
||||||
|
{"120m", 7 * 24 * time.Hour, true, 3 * 24 * time.Hour, "120m record within 7 days should be kept"},
|
||||||
|
{"120m", 7 * 24 * time.Hour, false, 10 * 24 * time.Hour, "120m record older than 7 days should be deleted"},
|
||||||
|
{"480m", 30 * 24 * time.Hour, true, 15 * 24 * time.Hour, "480m record within 30 days should be kept"},
|
||||||
|
{"480m", 30 * 24 * time.Hour, false, 45 * 24 * time.Hour, "480m record older than 30 days should be deleted"},
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create test records for both system_stats and container_stats
|
||||||
|
collections := []string{"system_stats", "container_stats"}
|
||||||
|
recordIds := make(map[string][]string)
|
||||||
|
|
||||||
|
for _, collection := range collections {
|
||||||
|
recordIds[collection] = make([]string, 0)
|
||||||
|
|
||||||
|
for i, tc := range testCases {
|
||||||
|
recordTime := now.Add(-tc.ageFromNow)
|
||||||
|
|
||||||
|
var stats string
|
||||||
|
if collection == "system_stats" {
|
||||||
|
stats = fmt.Sprintf(`{"cpu": %d.0, "mem": %d}`, i*10, i*100)
|
||||||
|
} else {
|
||||||
|
stats = fmt.Sprintf(`[{"name": "container%d", "cpu": %d.0, "mem": %d}]`, i, i*5, i*50)
|
||||||
|
}
|
||||||
|
|
||||||
|
record, err := tests.CreateRecord(hub, collection, map[string]any{
|
||||||
|
"system": system.Id,
|
||||||
|
"type": tc.recordType,
|
||||||
|
"stats": stats,
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
record.SetRaw("created", recordTime.Format(types.DefaultDateLayout))
|
||||||
|
err = hub.SaveNoValidate(record)
|
||||||
|
require.NoError(t, err)
|
||||||
|
recordIds[collection] = append(recordIds[collection], record.Id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run deletion
|
||||||
|
err = records.TestDeleteOldSystemStats(hub)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
// Verify results
|
||||||
|
for _, collection := range collections {
|
||||||
|
for i, tc := range testCases {
|
||||||
|
recordId := recordIds[collection][i]
|
||||||
|
|
||||||
|
// Try to find the record
|
||||||
|
_, err := hub.FindRecordById(collection, recordId)
|
||||||
|
|
||||||
|
if tc.shouldBeKept {
|
||||||
|
assert.NoError(t, err, "Record should exist: %s", tc.description)
|
||||||
|
} else {
|
||||||
|
assert.Error(t, err, "Record should be deleted: %s", tc.description)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestDeleteOldAlertsHistory tests the deleteOldAlertsHistory function
|
||||||
|
func TestDeleteOldAlertsHistory(t *testing.T) {
|
||||||
|
hub, err := tests.NewTestHub(t.TempDir())
|
||||||
|
require.NoError(t, err)
|
||||||
|
defer hub.Cleanup()
|
||||||
|
|
||||||
|
// Create test users
|
||||||
|
user1, err := tests.CreateUser(hub, "user1@example.com", "testtesttest")
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
user2, err := tests.CreateUser(hub, "user2@example.com", "testtesttest")
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
system, err := tests.CreateRecord(hub, "systems", map[string]any{
|
||||||
|
"name": "test-system",
|
||||||
|
"host": "localhost",
|
||||||
|
"port": "45876",
|
||||||
|
"status": "up",
|
||||||
|
"users": []string{user1.Id, user2.Id},
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
now := time.Now().UTC()
|
||||||
|
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
user *core.Record
|
||||||
|
alertCount int
|
||||||
|
countToKeep int
|
||||||
|
countBeforeDeletion int
|
||||||
|
expectedAfterDeletion int
|
||||||
|
description string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "User with few alerts (below threshold)",
|
||||||
|
user: user1,
|
||||||
|
alertCount: 100,
|
||||||
|
countToKeep: 50,
|
||||||
|
countBeforeDeletion: 150,
|
||||||
|
expectedAfterDeletion: 100, // No deletion because below threshold
|
||||||
|
description: "User with alerts below countBeforeDeletion should not have any deleted",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "User with many alerts (above threshold)",
|
||||||
|
user: user2,
|
||||||
|
alertCount: 300,
|
||||||
|
countToKeep: 100,
|
||||||
|
countBeforeDeletion: 200,
|
||||||
|
expectedAfterDeletion: 100, // Should be trimmed to countToKeep
|
||||||
|
description: "User with alerts above countBeforeDeletion should be trimmed to countToKeep",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
// Create alerts for this user
|
||||||
|
for i := 0; i < tc.alertCount; i++ {
|
||||||
|
_, err := tests.CreateRecord(hub, "alerts_history", map[string]any{
|
||||||
|
"user": tc.user.Id,
|
||||||
|
"name": "CPU",
|
||||||
|
"value": i + 1,
|
||||||
|
"system": system.Id,
|
||||||
|
"created": now.Add(-time.Duration(i) * time.Minute),
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Count before deletion
|
||||||
|
countBefore, err := hub.CountRecords("alerts_history",
|
||||||
|
dbx.NewExp("user = {:user}", dbx.Params{"user": tc.user.Id}))
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Equal(t, int64(tc.alertCount), countBefore, "Initial count should match")
|
||||||
|
|
||||||
|
// Run deletion
|
||||||
|
err = records.TestDeleteOldAlertsHistory(hub, tc.countToKeep, tc.countBeforeDeletion)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
// Count after deletion
|
||||||
|
countAfter, err := hub.CountRecords("alerts_history",
|
||||||
|
dbx.NewExp("user = {:user}", dbx.Params{"user": tc.user.Id}))
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
assert.Equal(t, int64(tc.expectedAfterDeletion), countAfter, tc.description)
|
||||||
|
|
||||||
|
// If deletion occurred, verify the most recent records were kept
|
||||||
|
if tc.expectedAfterDeletion < tc.alertCount {
|
||||||
|
records, err := hub.FindRecordsByFilter("alerts_history",
|
||||||
|
"user = {:user}",
|
||||||
|
"-created", // Order by created DESC
|
||||||
|
tc.countToKeep,
|
||||||
|
0,
|
||||||
|
map[string]any{"user": tc.user.Id})
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Len(t, records, tc.expectedAfterDeletion, "Should have exactly countToKeep records")
|
||||||
|
|
||||||
|
// Verify records are in descending order by created time
|
||||||
|
for i := 1; i < len(records); i++ {
|
||||||
|
prev := records[i-1].GetDateTime("created").Time()
|
||||||
|
curr := records[i].GetDateTime("created").Time()
|
||||||
|
assert.True(t, prev.After(curr) || prev.Equal(curr),
|
||||||
|
"Records should be ordered by created time (newest first)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestDeleteOldAlertsHistoryEdgeCases tests edge cases for alerts history deletion
|
||||||
|
func TestDeleteOldAlertsHistoryEdgeCases(t *testing.T) {
|
||||||
|
hub, err := tests.NewTestHub(t.TempDir())
|
||||||
|
require.NoError(t, err)
|
||||||
|
defer hub.Cleanup()
|
||||||
|
|
||||||
|
t.Run("No users with excessive alerts", func(t *testing.T) {
|
||||||
|
// Create user with few alerts
|
||||||
|
user, err := tests.CreateUser(hub, "few@example.com", "testtesttest")
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
system, err := tests.CreateRecord(hub, "systems", map[string]any{
|
||||||
|
"name": "test-system",
|
||||||
|
"host": "localhost",
|
||||||
|
"port": "45876",
|
||||||
|
"status": "up",
|
||||||
|
"users": []string{user.Id},
|
||||||
|
})
|
||||||
|
|
||||||
|
// Create only 5 alerts (well below threshold)
|
||||||
|
for i := range 5 {
|
||||||
|
_, err := tests.CreateRecord(hub, "alerts_history", map[string]any{
|
||||||
|
"user": user.Id,
|
||||||
|
"name": "CPU",
|
||||||
|
"value": i + 1,
|
||||||
|
"system": system.Id,
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Should not error and should not delete anything
|
||||||
|
err = records.TestDeleteOldAlertsHistory(hub, 10, 20)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
count, err := hub.CountRecords("alerts_history")
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Equal(t, int64(5), count, "All alerts should remain")
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("Empty alerts_history table", func(t *testing.T) {
|
||||||
|
// Clear any existing alerts
|
||||||
|
_, err := hub.DB().NewQuery("DELETE FROM alerts_history").Execute()
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
// Should not error with empty table
|
||||||
|
err = records.TestDeleteOldAlertsHistory(hub, 10, 20)
|
||||||
|
require.NoError(t, err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestRecordManagerCreation tests RecordManager creation
|
||||||
|
func TestRecordManagerCreation(t *testing.T) {
|
||||||
|
hub, err := tests.NewTestHub(t.TempDir())
|
||||||
|
require.NoError(t, err)
|
||||||
|
defer hub.Cleanup()
|
||||||
|
|
||||||
|
rm := records.NewRecordManager(hub)
|
||||||
|
assert.NotNil(t, rm, "RecordManager should not be nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestTwoDecimals tests the twoDecimals helper function
|
||||||
|
func TestTwoDecimals(t *testing.T) {
|
||||||
|
testCases := []struct {
|
||||||
|
input float64
|
||||||
|
expected float64
|
||||||
|
}{
|
||||||
|
{1.234567, 1.23},
|
||||||
|
{1.235, 1.24}, // Should round up
|
||||||
|
{1.0, 1.0},
|
||||||
|
{0.0, 0.0},
|
||||||
|
{-1.234567, -1.23},
|
||||||
|
{-1.235, -1.23}, // Negative rounding
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
result := records.TestTwoDecimals(tc.input)
|
||||||
|
assert.InDelta(t, tc.expected, result, 0.02, "twoDecimals(%f) should equal %f", tc.input, tc.expected)
|
||||||
|
}
|
||||||
|
}
|
||||||
23
beszel/internal/records/records_test_helpers.go
Normal file
23
beszel/internal/records/records_test_helpers.go
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
//go:build testing
|
||||||
|
// +build testing
|
||||||
|
|
||||||
|
package records
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/pocketbase/pocketbase/core"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TestDeleteOldSystemStats exposes deleteOldSystemStats for testing
|
||||||
|
func TestDeleteOldSystemStats(app core.App) error {
|
||||||
|
return deleteOldSystemStats(app)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestDeleteOldAlertsHistory exposes deleteOldAlertsHistory for testing
|
||||||
|
func TestDeleteOldAlertsHistory(app core.App, countToKeep, countBeforeDeletion int) error {
|
||||||
|
return deleteOldAlertsHistory(app, countToKeep, countBeforeDeletion)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestTwoDecimals exposes twoDecimals for testing
|
||||||
|
func TestTwoDecimals(value float64) float64 {
|
||||||
|
return twoDecimals(value)
|
||||||
|
}
|
||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/pocketbase/dbx"
|
||||||
"github.com/pocketbase/pocketbase/core"
|
"github.com/pocketbase/pocketbase/core"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -13,13 +14,6 @@ type UserManager struct {
|
|||||||
app core.App
|
app core.App
|
||||||
}
|
}
|
||||||
|
|
||||||
type UserSettings struct {
|
|
||||||
ChartTime string `json:"chartTime"`
|
|
||||||
NotificationEmails []string `json:"emails"`
|
|
||||||
NotificationWebhooks []string `json:"webhooks"`
|
|
||||||
// Language string `json:"lang"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewUserManager(app core.App) *UserManager {
|
func NewUserManager(app core.App) *UserManager {
|
||||||
return &UserManager{
|
return &UserManager{
|
||||||
app: app,
|
app: app,
|
||||||
@@ -37,30 +31,26 @@ func (um *UserManager) InitializeUserRole(e *core.RecordEvent) error {
|
|||||||
// Initialize user settings with defaults if not set
|
// Initialize user settings with defaults if not set
|
||||||
func (um *UserManager) InitializeUserSettings(e *core.RecordEvent) error {
|
func (um *UserManager) InitializeUserSettings(e *core.RecordEvent) error {
|
||||||
record := e.Record
|
record := e.Record
|
||||||
// intialize settings with defaults
|
// intialize settings with defaults (zero values can be ignored)
|
||||||
settings := UserSettings{
|
settings := struct {
|
||||||
// Language: "en",
|
ChartTime string `json:"chartTime"`
|
||||||
|
Emails []string `json:"emails"`
|
||||||
|
}{
|
||||||
ChartTime: "1h",
|
ChartTime: "1h",
|
||||||
NotificationEmails: []string{},
|
|
||||||
NotificationWebhooks: []string{},
|
|
||||||
}
|
}
|
||||||
record.UnmarshalJSONField("settings", &settings)
|
record.UnmarshalJSONField("settings", &settings)
|
||||||
if len(settings.NotificationEmails) == 0 {
|
|
||||||
// get user email from auth record
|
// get user email from auth record
|
||||||
if errs := um.app.ExpandRecord(record, []string{"user"}, nil); len(errs) == 0 {
|
var user struct {
|
||||||
// app.Logger().Error("failed to expand user relation", "errs", errs)
|
Email string `db:"email"`
|
||||||
if user := record.ExpandedOne("user"); user != nil {
|
|
||||||
settings.NotificationEmails = []string{user.GetString("email")}
|
|
||||||
} else {
|
|
||||||
log.Println("Failed to get user email from auth record")
|
|
||||||
}
|
}
|
||||||
} else {
|
err := e.App.DB().NewQuery("SELECT email FROM users WHERE id = {:id}").Bind(dbx.Params{
|
||||||
log.Println("failed to expand user relation", "errs", errs)
|
"id": record.GetString("user"),
|
||||||
|
}).One(&user)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("failed to get user email", "err", err)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
}
|
settings.Emails = []string{user.Email}
|
||||||
// if len(settings.NotificationWebhooks) == 0 {
|
|
||||||
// settings.NotificationWebhooks = []string{""}
|
|
||||||
// }
|
|
||||||
record.Set("settings", settings)
|
record.Set("settings", settings)
|
||||||
return e.Next()
|
return e.Next()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,7 +75,10 @@ func init() {
|
|||||||
"Memory",
|
"Memory",
|
||||||
"Disk",
|
"Disk",
|
||||||
"Temperature",
|
"Temperature",
|
||||||
"Bandwidth"
|
"Bandwidth",
|
||||||
|
"LoadAvg1",
|
||||||
|
"LoadAvg5",
|
||||||
|
"LoadAvg15"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -137,6 +140,124 @@ func init() {
|
|||||||
],
|
],
|
||||||
"system": false
|
"system": false
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "pbc_1697146157",
|
||||||
|
"listRule": "@request.auth.id != \"\" && user.id = @request.auth.id",
|
||||||
|
"viewRule": "@request.auth.id != \"\" && user.id = @request.auth.id",
|
||||||
|
"createRule": null,
|
||||||
|
"updateRule": null,
|
||||||
|
"deleteRule": "@request.auth.id != \"\" && user.id = @request.auth.id",
|
||||||
|
"name": "alerts_history",
|
||||||
|
"type": "base",
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"autogeneratePattern": "[a-z0-9]{15}",
|
||||||
|
"hidden": false,
|
||||||
|
"id": "text3208210256",
|
||||||
|
"max": 15,
|
||||||
|
"min": 15,
|
||||||
|
"name": "id",
|
||||||
|
"pattern": "^[a-z0-9]+$",
|
||||||
|
"presentable": false,
|
||||||
|
"primaryKey": true,
|
||||||
|
"required": true,
|
||||||
|
"system": true,
|
||||||
|
"type": "text"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cascadeDelete": true,
|
||||||
|
"collectionId": "_pb_users_auth_",
|
||||||
|
"hidden": false,
|
||||||
|
"id": "relation2375276105",
|
||||||
|
"maxSelect": 1,
|
||||||
|
"minSelect": 0,
|
||||||
|
"name": "user",
|
||||||
|
"presentable": false,
|
||||||
|
"required": true,
|
||||||
|
"system": false,
|
||||||
|
"type": "relation"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cascadeDelete": true,
|
||||||
|
"collectionId": "2hz5ncl8tizk5nx",
|
||||||
|
"hidden": false,
|
||||||
|
"id": "relation3377271179",
|
||||||
|
"maxSelect": 1,
|
||||||
|
"minSelect": 0,
|
||||||
|
"name": "system",
|
||||||
|
"presentable": false,
|
||||||
|
"required": true,
|
||||||
|
"system": false,
|
||||||
|
"type": "relation"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"autogeneratePattern": "",
|
||||||
|
"hidden": false,
|
||||||
|
"id": "text2466471794",
|
||||||
|
"max": 0,
|
||||||
|
"min": 0,
|
||||||
|
"name": "alert_id",
|
||||||
|
"pattern": "",
|
||||||
|
"presentable": false,
|
||||||
|
"primaryKey": false,
|
||||||
|
"required": false,
|
||||||
|
"system": false,
|
||||||
|
"type": "text"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"autogeneratePattern": "",
|
||||||
|
"hidden": false,
|
||||||
|
"id": "text1579384326",
|
||||||
|
"max": 0,
|
||||||
|
"min": 0,
|
||||||
|
"name": "name",
|
||||||
|
"pattern": "",
|
||||||
|
"presentable": false,
|
||||||
|
"primaryKey": false,
|
||||||
|
"required": true,
|
||||||
|
"system": false,
|
||||||
|
"type": "text"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"hidden": false,
|
||||||
|
"id": "number494360628",
|
||||||
|
"max": null,
|
||||||
|
"min": null,
|
||||||
|
"name": "value",
|
||||||
|
"onlyInt": false,
|
||||||
|
"presentable": false,
|
||||||
|
"required": false,
|
||||||
|
"system": false,
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"hidden": false,
|
||||||
|
"id": "autodate2990389176",
|
||||||
|
"name": "created",
|
||||||
|
"onCreate": true,
|
||||||
|
"onUpdate": false,
|
||||||
|
"presentable": false,
|
||||||
|
"system": false,
|
||||||
|
"type": "autodate"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"hidden": false,
|
||||||
|
"id": "date2276568630",
|
||||||
|
"max": "",
|
||||||
|
"min": "",
|
||||||
|
"name": "resolved",
|
||||||
|
"presentable": false,
|
||||||
|
"required": false,
|
||||||
|
"system": false,
|
||||||
|
"type": "date"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"indexes": [
|
||||||
|
"CREATE INDEX ` + "`" + `idx_YdGnup5aqB` + "`" + ` ON ` + "`" + `alerts_history` + "`" + ` (` + "`" + `user` + "`" + `)",
|
||||||
|
"CREATE INDEX ` + "`" + `idx_taLet9VdME` + "`" + ` ON ` + "`" + `alerts_history` + "`" + ` (` + "`" + `created` + "`" + `)"
|
||||||
|
],
|
||||||
|
"system": false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "juohu4jipgc13v7",
|
"id": "juohu4jipgc13v7",
|
||||||
"listRule": "@request.auth.id != \"\"",
|
"listRule": "@request.auth.id != \"\"",
|
||||||
@@ -754,7 +875,6 @@ func init() {
|
|||||||
LEFT JOIN fingerprints f ON s.id = f.system
|
LEFT JOIN fingerprints f ON s.id = f.system
|
||||||
WHERE f.system IS NULL
|
WHERE f.system IS NULL
|
||||||
`).Column(&systemIds)
|
`).Column(&systemIds)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
m "github.com/pocketbase/pocketbase/migrations"
|
m "github.com/pocketbase/pocketbase/migrations"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
const (
|
||||||
TempAdminEmail = "_@b.b"
|
TempAdminEmail = "_@b.b"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@@ -4,7 +4,7 @@
|
|||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<link rel="manifest" href="./static/manifest.json" />
|
<link rel="manifest" href="./static/manifest.json" />
|
||||||
<link rel="icon" type="image/svg+xml" href="./static/favicon.svg" />
|
<link rel="icon" type="image/svg+xml" href="./static/favicon.svg" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.0, user-scalable=no, viewport-fit=cover" />
|
||||||
<title>Beszel</title>
|
<title>Beszel</title>
|
||||||
<script>
|
<script>
|
||||||
globalThis.BESZEL = {
|
globalThis.BESZEL = {
|
||||||
|
|||||||
3541
beszel/site/package-lock.json
generated
3541
beszel/site/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "beszel",
|
"name": "beszel",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "0.12.0-beta1",
|
"version": "0.12.2",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
@@ -13,9 +13,9 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@henrygd/queue": "^1.0.7",
|
"@henrygd/queue": "^1.0.7",
|
||||||
"@henrygd/semaphore": "^0.0.2",
|
"@henrygd/semaphore": "^0.0.2",
|
||||||
"@lingui/detect-locale": "^5.3.2",
|
"@lingui/detect-locale": "^5.3.3",
|
||||||
"@lingui/macro": "^5.3.2",
|
"@lingui/macro": "^5.3.3",
|
||||||
"@lingui/react": "^5.3.2",
|
"@lingui/react": "^5.3.3",
|
||||||
"@nanostores/react": "^0.7.3",
|
"@nanostores/react": "^0.7.3",
|
||||||
"@nanostores/router": "^0.11.0",
|
"@nanostores/router": "^0.11.0",
|
||||||
"@radix-ui/react-alert-dialog": "^1.1.14",
|
"@radix-ui/react-alert-dialog": "^1.1.14",
|
||||||
@@ -39,24 +39,25 @@
|
|||||||
"d3-time": "^3.1.0",
|
"d3-time": "^3.1.0",
|
||||||
"lucide-react": "^0.452.0",
|
"lucide-react": "^0.452.0",
|
||||||
"nanostores": "^0.11.4",
|
"nanostores": "^0.11.4",
|
||||||
"pocketbase": "^0.26.0",
|
"pocketbase": "^0.26.2",
|
||||||
"react": "^18.3.1",
|
"react": "^18.3.1",
|
||||||
"react-dom": "^18.3.1",
|
"react-dom": "^18.3.1",
|
||||||
"recharts": "^2.15.3",
|
"recharts": "^2.15.4",
|
||||||
"tailwind-merge": "^2.6.0",
|
"tailwind-merge": "^2.6.0",
|
||||||
"tailwindcss-animate": "^1.0.7",
|
"tailwindcss-animate": "^1.0.7",
|
||||||
"valibot": "^0.42.1"
|
"valibot": "^0.42.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@lingui/cli": "^5.3.2",
|
"@lingui/cli": "^5.3.3",
|
||||||
"@lingui/swc-plugin": "^5.5.2",
|
"@lingui/swc-plugin": "^5.5.2",
|
||||||
"@lingui/vite-plugin": "^5.3.2",
|
"@lingui/vite-plugin": "^5.3.3",
|
||||||
"@types/bun": "^1.2.15",
|
"@tailwindcss/container-queries": "^0.1.1",
|
||||||
|
"@types/bun": "^1.2.19",
|
||||||
"@types/react": "^18.3.23",
|
"@types/react": "^18.3.23",
|
||||||
"@types/react-dom": "^18.3.7",
|
"@types/react-dom": "^18.3.7",
|
||||||
"@vitejs/plugin-react-swc": "^3.10.1",
|
"@vitejs/plugin-react-swc": "^3.11.0",
|
||||||
"autoprefixer": "^10.4.21",
|
"autoprefixer": "^10.4.21",
|
||||||
"postcss": "^8.5.4",
|
"postcss": "^8.5.6",
|
||||||
"tailwindcss": "^3.4.17",
|
"tailwindcss": "^3.4.17",
|
||||||
"tailwindcss-rtl": "^0.9.0",
|
"tailwindcss-rtl": "^0.9.0",
|
||||||
"typescript": "^5.8.3",
|
"typescript": "^5.8.3",
|
||||||
|
|||||||
164
beszel/site/src/components/alerts-history-columns.tsx
Normal file
164
beszel/site/src/components/alerts-history-columns.tsx
Normal file
@@ -0,0 +1,164 @@
|
|||||||
|
import { ColumnDef } from "@tanstack/react-table"
|
||||||
|
import { AlertsHistoryRecord } from "@/types"
|
||||||
|
import { Button } from "@/components/ui/button"
|
||||||
|
import { Badge } from "@/components/ui/badge"
|
||||||
|
import { alertInfo, formatShortDate, toFixedFloat, formatDuration, cn } from "@/lib/utils"
|
||||||
|
import { Trans } from "@lingui/react/macro"
|
||||||
|
import { t } from "@lingui/core/macro"
|
||||||
|
|
||||||
|
export const alertsHistoryColumns: ColumnDef<AlertsHistoryRecord>[] = [
|
||||||
|
{
|
||||||
|
accessorKey: "system",
|
||||||
|
enableSorting: true,
|
||||||
|
header: ({ column }) => (
|
||||||
|
<Button variant="ghost" onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}>
|
||||||
|
<Trans>System</Trans>
|
||||||
|
</Button>
|
||||||
|
),
|
||||||
|
cell: ({ row }) => <span className="ps-2">{row.original.expand?.system?.name || row.original.system}</span>,
|
||||||
|
filterFn: (row, _, filterValue) => {
|
||||||
|
const display = row.original.expand?.system?.name || row.original.system || ""
|
||||||
|
return display.toLowerCase().includes(filterValue.toLowerCase())
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// accessorKey: "name",
|
||||||
|
id: "name",
|
||||||
|
accessorFn: (record) => {
|
||||||
|
const name = record.name
|
||||||
|
const info = alertInfo[name]
|
||||||
|
return info?.name().replace("cpu", "CPU") || name
|
||||||
|
},
|
||||||
|
header: ({ column }) => (
|
||||||
|
<Button variant="ghost" onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}>
|
||||||
|
<Trans>Name</Trans>
|
||||||
|
</Button>
|
||||||
|
),
|
||||||
|
cell: ({ getValue, row }) => {
|
||||||
|
let name = getValue() as string
|
||||||
|
const info = alertInfo[row.original.name]
|
||||||
|
const Icon = info?.icon
|
||||||
|
|
||||||
|
return (
|
||||||
|
<span className="flex items-center gap-2 ps-1 min-w-40">
|
||||||
|
{Icon && <Icon className="size-3.5" />}
|
||||||
|
{name}
|
||||||
|
</span>
|
||||||
|
)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorKey: "value",
|
||||||
|
enableSorting: false,
|
||||||
|
header: () => (
|
||||||
|
<Button variant="ghost">
|
||||||
|
<Trans>Value</Trans>
|
||||||
|
</Button>
|
||||||
|
),
|
||||||
|
cell({ row, getValue }) {
|
||||||
|
const name = row.original.name
|
||||||
|
if (name === "Status") {
|
||||||
|
return <span className="ps-2">{t`Down`}</span>
|
||||||
|
}
|
||||||
|
const value = getValue() as number
|
||||||
|
const unit = alertInfo[name]?.unit
|
||||||
|
return (
|
||||||
|
<span className="tabular-nums ps-2.5">
|
||||||
|
{toFixedFloat(value, value < 10 ? 2 : 1)}
|
||||||
|
{unit}
|
||||||
|
</span>
|
||||||
|
)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorKey: "state",
|
||||||
|
enableSorting: true,
|
||||||
|
sortingFn: (rowA, rowB) => (rowA.original.resolved ? 1 : 0) - (rowB.original.resolved ? 1 : 0),
|
||||||
|
header: ({ column }) => (
|
||||||
|
<Button variant="ghost" onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}>
|
||||||
|
<Trans comment="Context: alert state (active or resolved)">State</Trans>
|
||||||
|
</Button>
|
||||||
|
),
|
||||||
|
cell: ({ row }) => {
|
||||||
|
const resolved = row.original.resolved
|
||||||
|
return (
|
||||||
|
<Badge
|
||||||
|
className={cn(
|
||||||
|
"capitalize pointer-events-none",
|
||||||
|
resolved
|
||||||
|
? "bg-green-100 text-green-800 border-green-200 dark:opacity-80"
|
||||||
|
: "bg-yellow-100 text-yellow-800 border-yellow-200"
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
{/* {resolved ? <CircleCheckIcon className="size-3 me-0.5" /> : <CircleAlertIcon className="size-3 me-0.5" />} */}
|
||||||
|
{resolved ? <Trans>Resolved</Trans> : <Trans>Active</Trans>}
|
||||||
|
</Badge>
|
||||||
|
)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorKey: "created",
|
||||||
|
accessorFn: (record) => formatShortDate(record.created),
|
||||||
|
enableSorting: true,
|
||||||
|
invertSorting: true,
|
||||||
|
header: ({ column }) => (
|
||||||
|
<Button variant="ghost" onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}>
|
||||||
|
<Trans comment="Context: date created">Created</Trans>
|
||||||
|
</Button>
|
||||||
|
),
|
||||||
|
cell: ({ getValue, row }) => (
|
||||||
|
<span className="ps-1 tabular-nums tracking-tight" title={`${row.original.created} UTC`}>
|
||||||
|
{getValue() as string}
|
||||||
|
</span>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorKey: "resolved",
|
||||||
|
enableSorting: true,
|
||||||
|
invertSorting: true,
|
||||||
|
header: ({ column }) => (
|
||||||
|
<Button variant="ghost" onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}>
|
||||||
|
<Trans>Resolved</Trans>
|
||||||
|
</Button>
|
||||||
|
),
|
||||||
|
cell: ({ row, getValue }) => {
|
||||||
|
const resolved = getValue() as string | null
|
||||||
|
if (!resolved) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<span className="ps-1 tabular-nums tracking-tight" title={`${row.original.resolved} UTC`}>
|
||||||
|
{formatShortDate(resolved)}
|
||||||
|
</span>
|
||||||
|
)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorKey: "duration",
|
||||||
|
invertSorting: true,
|
||||||
|
enableSorting: true,
|
||||||
|
sortingFn: (rowA, rowB) => {
|
||||||
|
const aCreated = new Date(rowA.original.created)
|
||||||
|
const bCreated = new Date(rowB.original.created)
|
||||||
|
const aResolved = rowA.original.resolved ? new Date(rowA.original.resolved) : null
|
||||||
|
const bResolved = rowB.original.resolved ? new Date(rowB.original.resolved) : null
|
||||||
|
const aDuration = aResolved ? aResolved.getTime() - aCreated.getTime() : null
|
||||||
|
const bDuration = bResolved ? bResolved.getTime() - bCreated.getTime() : null
|
||||||
|
if (!aDuration && bDuration) return -1
|
||||||
|
if (aDuration && !bDuration) return 1
|
||||||
|
return (aDuration || 0) - (bDuration || 0)
|
||||||
|
},
|
||||||
|
header: ({ column }) => (
|
||||||
|
<Button variant="ghost" onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}>
|
||||||
|
<Trans>Duration</Trans>
|
||||||
|
</Button>
|
||||||
|
),
|
||||||
|
cell: ({ row }) => {
|
||||||
|
const duration = formatDuration(row.original.created, row.original.resolved)
|
||||||
|
if (!duration) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
return <span className="ps-2">{duration}</span>
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]
|
||||||
@@ -39,31 +39,51 @@ export default memo(function AlertsButton({ system }: { system: SystemRecord })
|
|||||||
/>
|
/>
|
||||||
</Button>
|
</Button>
|
||||||
</DialogTrigger>
|
</DialogTrigger>
|
||||||
<DialogContent className="max-h-full overflow-auto max-w-[35rem]">
|
<DialogContent className="max-h-full sm:max-h-[95svh] overflow-auto max-w-[37rem]">
|
||||||
{opened && <AlertDialogContent system={system} />}
|
{opened && <AlertDialogContent system={system} />}
|
||||||
</DialogContent>
|
</DialogContent>
|
||||||
</Dialog>
|
</Dialog>
|
||||||
),
|
),
|
||||||
[opened, hasAlert]
|
[opened, hasAlert]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// return useMemo(
|
||||||
|
// () => (
|
||||||
|
// <Sheet>
|
||||||
|
// <SheetTrigger asChild>
|
||||||
|
// <Button variant="ghost" size="icon" aria-label={t`Alerts`} data-nolink onClick={() => setOpened(true)}>
|
||||||
|
// <BellIcon
|
||||||
|
// className={cn("h-[1.2em] w-[1.2em] pointer-events-none", {
|
||||||
|
// "fill-primary": hasAlert,
|
||||||
|
// })}
|
||||||
|
// />
|
||||||
|
// </Button>
|
||||||
|
// </SheetTrigger>
|
||||||
|
// <SheetContent className="max-h-full overflow-auto w-[35em] p-4 sm:p-5">
|
||||||
|
// {opened && <AlertDialogContent system={system} />}
|
||||||
|
// </SheetContent>
|
||||||
|
// </Sheet>
|
||||||
|
// ),
|
||||||
|
// [opened, hasAlert]
|
||||||
|
// )
|
||||||
})
|
})
|
||||||
|
|
||||||
function AlertDialogContent({ system }: { system: SystemRecord }) {
|
function AlertDialogContent({ system }: { system: SystemRecord }) {
|
||||||
const alerts = useStore($alerts)
|
const alerts = useStore($alerts)
|
||||||
const [overwriteExisting, setOverwriteExisting] = useState<boolean | "indeterminate">(false)
|
const [overwriteExisting, setOverwriteExisting] = useState<boolean | "indeterminate">(false)
|
||||||
|
|
||||||
// alertsSignature changes only when alerts for this system change
|
/* key to prevent re-rendering */
|
||||||
let alertsSignature = ""
|
const alertsSignature: string[] = []
|
||||||
|
|
||||||
const systemAlerts = alerts.filter((alert) => {
|
const systemAlerts = alerts.filter((alert) => {
|
||||||
if (alert.system === system.id) {
|
if (alert.system === system.id) {
|
||||||
alertsSignature += alert.name + alert.min + alert.value
|
alertsSignature.push(alert.name, alert.min, alert.value)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}) as AlertRecord[]
|
}) as AlertRecord[]
|
||||||
|
|
||||||
return useMemo(() => {
|
return useMemo(() => {
|
||||||
// console.log("render modal", system.name, alertsSignature)
|
|
||||||
const data = Object.keys(alertInfo).map((name) => {
|
const data = Object.keys(alertInfo).map((name) => {
|
||||||
const alert = alertInfo[name as keyof typeof alertInfo]
|
const alert = alertInfo[name as keyof typeof alertInfo]
|
||||||
return {
|
return {
|
||||||
@@ -129,5 +149,5 @@ function AlertDialogContent({ system }: { system: SystemRecord }) {
|
|||||||
</Tabs>
|
</Tabs>
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
}, [alertsSignature, overwriteExisting])
|
}, [alertsSignature.join(""), overwriteExisting])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -217,7 +217,7 @@ function AlertContent({ data }: { data: AlertData }) {
|
|||||||
|
|
||||||
const [checked, setChecked] = useState(data.checked || false)
|
const [checked, setChecked] = useState(data.checked || false)
|
||||||
const [min, setMin] = useState(data.min || 10)
|
const [min, setMin] = useState(data.min || 10)
|
||||||
const [value, setValue] = useState(data.val || (singleDescription ? 0 : 80))
|
const [value, setValue] = useState(data.val || (singleDescription ? 0 : data.alert.start ?? 80))
|
||||||
|
|
||||||
const Icon = alertInfo[name].icon
|
const Icon = alertInfo[name].icon
|
||||||
|
|
||||||
@@ -268,7 +268,8 @@ function AlertContent({ data }: { data: AlertData }) {
|
|||||||
onValueChange={(val) => {
|
onValueChange={(val) => {
|
||||||
setValue(val[0])
|
setValue(val[0])
|
||||||
}}
|
}}
|
||||||
min={1}
|
step={data.alert.step ?? 1}
|
||||||
|
min={data.alert.min ?? 1}
|
||||||
max={alertInfo[name].max ?? 99}
|
max={alertInfo[name].max ?? 99}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,88 +1,42 @@
|
|||||||
import { t } from "@lingui/core/macro"
|
|
||||||
|
|
||||||
import { Area, AreaChart, CartesianGrid, YAxis } from "recharts"
|
import { Area, AreaChart, CartesianGrid, YAxis } from "recharts"
|
||||||
import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from "@/components/ui/chart"
|
import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from "@/components/ui/chart"
|
||||||
import {
|
import { useYAxisWidth, cn, formatShortDate, chartMargin } from "@/lib/utils"
|
||||||
useYAxisWidth,
|
import { ChartData, SystemStatsRecord } from "@/types"
|
||||||
cn,
|
import { useMemo } from "react"
|
||||||
formatShortDate,
|
|
||||||
toFixedWithoutTrailingZeros,
|
|
||||||
decimalString,
|
|
||||||
chartMargin,
|
|
||||||
} from "@/lib/utils"
|
|
||||||
// import Spinner from '../spinner'
|
|
||||||
import { ChartData } from "@/types"
|
|
||||||
import { memo, useMemo } from "react"
|
|
||||||
import { useLingui } from "@lingui/react/macro"
|
|
||||||
|
|
||||||
/** [label, key, color, opacity] */
|
export type DataPoint = {
|
||||||
type DataKeys = [string, string, number, number]
|
label: string
|
||||||
|
dataKey: (data: SystemStatsRecord) => number | undefined
|
||||||
const getNestedValue = (path: string, max = false, data: any): number | null => {
|
color: string
|
||||||
// fallback value (obj?.stats?.cpum ? 0 : null) should only come into play when viewing
|
opacity: number
|
||||||
// a max value which doesn't exist, or the value was zero and omitted from the stats object.
|
|
||||||
// so we check if cpum is present. if so, return 0 to make sure the zero value is displayed.
|
|
||||||
// if not, return null - there is no max data so do not display anything.
|
|
||||||
return `stats.${path}${max ? "m" : ""}`
|
|
||||||
.split(".")
|
|
||||||
.reduce((acc: any, key: string) => acc?.[key] ?? (data.stats?.cpum ? 0 : null), data)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default memo(function AreaChartDefault({
|
export default function AreaChartDefault({
|
||||||
maxToggled = false,
|
|
||||||
unit = " MB/s",
|
|
||||||
chartName,
|
|
||||||
chartData,
|
chartData,
|
||||||
max,
|
max,
|
||||||
|
maxToggled,
|
||||||
tickFormatter,
|
tickFormatter,
|
||||||
contentFormatter,
|
contentFormatter,
|
||||||
}: {
|
dataPoints,
|
||||||
maxToggled?: boolean
|
}: // logRender = false,
|
||||||
unit?: string
|
{
|
||||||
chartName: string
|
|
||||||
chartData: ChartData
|
chartData: ChartData
|
||||||
max?: number
|
max?: number
|
||||||
tickFormatter?: (value: number) => string
|
maxToggled?: boolean
|
||||||
contentFormatter?: (value: number) => string
|
tickFormatter: (value: number, index: number) => string
|
||||||
|
contentFormatter: ({ value, payload }: { value: number; payload: SystemStatsRecord }) => string
|
||||||
|
dataPoints?: DataPoint[]
|
||||||
|
// logRender?: boolean
|
||||||
}) {
|
}) {
|
||||||
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
|
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
|
||||||
const { i18n } = useLingui()
|
|
||||||
|
|
||||||
const { chartTime } = chartData
|
|
||||||
|
|
||||||
const showMax = chartTime !== "1h" && maxToggled
|
|
||||||
|
|
||||||
const dataKeys: DataKeys[] = useMemo(() => {
|
|
||||||
// [label, key, color, opacity]
|
|
||||||
if (chartName === "CPU Usage") {
|
|
||||||
return [[t`CPU Usage`, "cpu", 1, 0.4]]
|
|
||||||
} else if (chartName === "dio") {
|
|
||||||
return [
|
|
||||||
[t({ message: "Write", comment: "Disk write" }), "dw", 3, 0.3],
|
|
||||||
[t({ message: "Read", comment: "Disk read" }), "dr", 1, 0.3],
|
|
||||||
]
|
|
||||||
} else if (chartName === "bw") {
|
|
||||||
return [
|
|
||||||
[t({ message: "Sent", comment: "Network bytes sent (upload)" }), "ns", 5, 0.2],
|
|
||||||
[t({ message: "Received", comment: "Network bytes received (download)" }), "nr", 2, 0.2],
|
|
||||||
]
|
|
||||||
} else if (chartName.startsWith("efs")) {
|
|
||||||
return [
|
|
||||||
[t`Write`, `${chartName}.w`, 3, 0.3],
|
|
||||||
[t`Read`, `${chartName}.r`, 1, 0.3],
|
|
||||||
]
|
|
||||||
} else if (chartName.startsWith("g.")) {
|
|
||||||
return [chartName.includes("mu") ? [t`Used`, chartName, 2, 0.25] : [t`Usage`, chartName, 1, 0.4]]
|
|
||||||
}
|
|
||||||
return []
|
|
||||||
}, [chartName, i18n.locale])
|
|
||||||
|
|
||||||
// console.log('Rendered at', new Date())
|
|
||||||
|
|
||||||
|
return useMemo(() => {
|
||||||
if (chartData.systemStats.length === 0) {
|
if (chartData.systemStats.length === 0) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
// if (logRender) {
|
||||||
|
// console.log("Rendered at", new Date())
|
||||||
|
// }
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<ChartContainer
|
<ChartContainer
|
||||||
@@ -98,15 +52,7 @@ export default memo(function AreaChartDefault({
|
|||||||
className="tracking-tighter"
|
className="tracking-tighter"
|
||||||
width={yAxisWidth}
|
width={yAxisWidth}
|
||||||
domain={[0, max ?? "auto"]}
|
domain={[0, max ?? "auto"]}
|
||||||
tickFormatter={(value) => {
|
tickFormatter={(value, index) => updateYAxisWidth(tickFormatter(value, index))}
|
||||||
let val: string
|
|
||||||
if (tickFormatter) {
|
|
||||||
val = tickFormatter(value)
|
|
||||||
} else {
|
|
||||||
val = toFixedWithoutTrailingZeros(value, 2) + unit
|
|
||||||
}
|
|
||||||
return updateYAxisWidth(val)
|
|
||||||
}}
|
|
||||||
tickLine={false}
|
tickLine={false}
|
||||||
axisLine={false}
|
axisLine={false}
|
||||||
/>
|
/>
|
||||||
@@ -117,26 +63,20 @@ export default memo(function AreaChartDefault({
|
|||||||
content={
|
content={
|
||||||
<ChartTooltipContent
|
<ChartTooltipContent
|
||||||
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
|
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
|
||||||
contentFormatter={({ value }) => {
|
contentFormatter={contentFormatter}
|
||||||
if (contentFormatter) {
|
|
||||||
return contentFormatter(value)
|
|
||||||
}
|
|
||||||
return decimalString(value) + unit
|
|
||||||
}}
|
|
||||||
// indicator="line"
|
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
{dataKeys.map((key, i) => {
|
{dataPoints?.map((dataPoint, i) => {
|
||||||
const color = `hsl(var(--chart-${key[2]}))`
|
const color = `hsl(var(--chart-${dataPoint.color}))`
|
||||||
return (
|
return (
|
||||||
<Area
|
<Area
|
||||||
key={i}
|
key={i}
|
||||||
dataKey={getNestedValue.bind(null, key[1], showMax)}
|
dataKey={dataPoint.dataKey}
|
||||||
name={key[0]}
|
name={dataPoint.label}
|
||||||
type="monotoneX"
|
type="monotoneX"
|
||||||
fill={color}
|
fill={color}
|
||||||
fillOpacity={key[3]}
|
fillOpacity={dataPoint.opacity}
|
||||||
stroke={color}
|
stroke={color}
|
||||||
isAnimationActive={false}
|
isAnimationActive={false}
|
||||||
/>
|
/>
|
||||||
@@ -147,4 +87,5 @@ export default memo(function AreaChartDefault({
|
|||||||
</ChartContainer>
|
</ChartContainer>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
})
|
}, [chartData.systemStats.at(-1), yAxisWidth, maxToggled])
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,22 +1,13 @@
|
|||||||
import { Area, AreaChart, CartesianGrid, YAxis } from "recharts"
|
import { Area, AreaChart, CartesianGrid, YAxis } from "recharts"
|
||||||
import { ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from "@/components/ui/chart"
|
import { ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from "@/components/ui/chart"
|
||||||
import { memo, useMemo } from "react"
|
import { memo, useMemo } from "react"
|
||||||
import {
|
import { useYAxisWidth, cn, formatShortDate, chartMargin, toFixedFloat, formatBytes, decimalString } from "@/lib/utils"
|
||||||
useYAxisWidth,
|
|
||||||
cn,
|
|
||||||
formatShortDate,
|
|
||||||
decimalString,
|
|
||||||
chartMargin,
|
|
||||||
toFixedFloat,
|
|
||||||
getSizeAndUnit,
|
|
||||||
toFixedWithoutTrailingZeros,
|
|
||||||
} from "@/lib/utils"
|
|
||||||
// import Spinner from '../spinner'
|
// import Spinner from '../spinner'
|
||||||
import { useStore } from "@nanostores/react"
|
import { useStore } from "@nanostores/react"
|
||||||
import { $containerFilter } from "@/lib/stores"
|
import { $containerFilter, $userSettings } from "@/lib/stores"
|
||||||
import { ChartData } from "@/types"
|
import { ChartData } from "@/types"
|
||||||
import { Separator } from "../ui/separator"
|
import { Separator } from "../ui/separator"
|
||||||
import { ChartType } from "@/lib/enums"
|
import { ChartType, Unit } from "@/lib/enums"
|
||||||
|
|
||||||
export default memo(function ContainerChart({
|
export default memo(function ContainerChart({
|
||||||
dataKey,
|
dataKey,
|
||||||
@@ -30,6 +21,7 @@ export default memo(function ContainerChart({
|
|||||||
unit?: string
|
unit?: string
|
||||||
}) {
|
}) {
|
||||||
const filter = useStore($containerFilter)
|
const filter = useStore($containerFilter)
|
||||||
|
const userSettings = useStore($userSettings)
|
||||||
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
|
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
|
||||||
|
|
||||||
const { containerData } = chartData
|
const { containerData } = chartData
|
||||||
@@ -84,13 +76,14 @@ export default memo(function ContainerChart({
|
|||||||
// tick formatter
|
// tick formatter
|
||||||
if (chartType === ChartType.CPU) {
|
if (chartType === ChartType.CPU) {
|
||||||
obj.tickFormatter = (value) => {
|
obj.tickFormatter = (value) => {
|
||||||
const val = toFixedWithoutTrailingZeros(value, 2) + unit
|
const val = toFixedFloat(value, 2) + unit
|
||||||
return updateYAxisWidth(val)
|
return updateYAxisWidth(val)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
obj.tickFormatter = (value) => {
|
const chartUnit = isNetChart ? userSettings.unitNet : Unit.Bytes
|
||||||
const { v, u } = getSizeAndUnit(value, false)
|
obj.tickFormatter = (val) => {
|
||||||
return updateYAxisWidth(`${toFixedFloat(v, 2)}${u}${isNetChart ? "/s" : ""}`)
|
const { value, unit } = formatBytes(val, isNetChart, chartUnit, true)
|
||||||
|
return updateYAxisWidth(toFixedFloat(value, value >= 10 ? 0 : 1) + " " + unit)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// tooltip formatter
|
// tooltip formatter
|
||||||
@@ -99,12 +92,14 @@ export default memo(function ContainerChart({
|
|||||||
try {
|
try {
|
||||||
const sent = item?.payload?.[key]?.ns ?? 0
|
const sent = item?.payload?.[key]?.ns ?? 0
|
||||||
const received = item?.payload?.[key]?.nr ?? 0
|
const received = item?.payload?.[key]?.nr ?? 0
|
||||||
|
const { value: receivedValue, unit: receivedUnit } = formatBytes(received, true, userSettings.unitNet, true)
|
||||||
|
const { value: sentValue, unit: sentUnit } = formatBytes(sent, true, userSettings.unitNet, true)
|
||||||
return (
|
return (
|
||||||
<span className="flex">
|
<span className="flex">
|
||||||
{decimalString(received)} MB/s
|
{decimalString(receivedValue)} {receivedUnit}
|
||||||
<span className="opacity-70 ms-0.5"> rx </span>
|
<span className="opacity-70 ms-0.5"> rx </span>
|
||||||
<Separator orientation="vertical" className="h-3 mx-1.5 bg-primary/40" />
|
<Separator orientation="vertical" className="h-3 mx-1.5 bg-primary/40" />
|
||||||
{decimalString(sent)} MB/s
|
{decimalString(sentValue)} {sentUnit}
|
||||||
<span className="opacity-70 ms-0.5"> tx</span>
|
<span className="opacity-70 ms-0.5"> tx</span>
|
||||||
</span>
|
</span>
|
||||||
)
|
)
|
||||||
@@ -114,8 +109,8 @@ export default memo(function ContainerChart({
|
|||||||
}
|
}
|
||||||
} else if (chartType === ChartType.Memory) {
|
} else if (chartType === ChartType.Memory) {
|
||||||
obj.toolTipFormatter = (item: any) => {
|
obj.toolTipFormatter = (item: any) => {
|
||||||
const { v, u } = getSizeAndUnit(item.value, false)
|
const { value, unit } = formatBytes(item.value, false, Unit.Bytes, true)
|
||||||
return decimalString(v, 2) + u
|
return decimalString(value) + " " + unit
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
obj.toolTipFormatter = (item: any) => decimalString(item.value) + unit
|
obj.toolTipFormatter = (item: any) => decimalString(item.value) + unit
|
||||||
|
|||||||
@@ -1,17 +1,10 @@
|
|||||||
import { Area, AreaChart, CartesianGrid, YAxis } from "recharts"
|
import { Area, AreaChart, CartesianGrid, YAxis } from "recharts"
|
||||||
import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from "@/components/ui/chart"
|
import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from "@/components/ui/chart"
|
||||||
import {
|
import { useYAxisWidth, cn, formatShortDate, decimalString, chartMargin, formatBytes, toFixedFloat } from "@/lib/utils"
|
||||||
useYAxisWidth,
|
|
||||||
cn,
|
|
||||||
formatShortDate,
|
|
||||||
decimalString,
|
|
||||||
toFixedFloat,
|
|
||||||
chartMargin,
|
|
||||||
getSizeAndUnit,
|
|
||||||
} from "@/lib/utils"
|
|
||||||
import { ChartData } from "@/types"
|
import { ChartData } from "@/types"
|
||||||
import { memo } from "react"
|
import { memo } from "react"
|
||||||
import { useLingui } from "@lingui/react/macro"
|
import { useLingui } from "@lingui/react/macro"
|
||||||
|
import { Unit } from "@/lib/enums"
|
||||||
|
|
||||||
export default memo(function DiskChart({
|
export default memo(function DiskChart({
|
||||||
dataKey,
|
dataKey,
|
||||||
@@ -53,9 +46,9 @@ export default memo(function DiskChart({
|
|||||||
minTickGap={6}
|
minTickGap={6}
|
||||||
tickLine={false}
|
tickLine={false}
|
||||||
axisLine={false}
|
axisLine={false}
|
||||||
tickFormatter={(value) => {
|
tickFormatter={(val) => {
|
||||||
const { v, u } = getSizeAndUnit(value)
|
const { value, unit } = formatBytes(val * 1024, false, Unit.Bytes, true)
|
||||||
return updateYAxisWidth(toFixedFloat(v, 2) + u)
|
return updateYAxisWidth(toFixedFloat(value, value >= 10 ? 0 : 1) + " " + unit)
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
{xAxis(chartData)}
|
{xAxis(chartData)}
|
||||||
@@ -66,8 +59,8 @@ export default memo(function DiskChart({
|
|||||||
<ChartTooltipContent
|
<ChartTooltipContent
|
||||||
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
|
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
|
||||||
contentFormatter={({ value }) => {
|
contentFormatter={({ value }) => {
|
||||||
const { v, u } = getSizeAndUnit(value)
|
const { value: convertedValue, unit } = formatBytes(value * 1024, false, Unit.Bytes, true)
|
||||||
return decimalString(v) + u
|
return decimalString(convertedValue) + " " + unit
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,14 +8,7 @@ import {
|
|||||||
ChartTooltipContent,
|
ChartTooltipContent,
|
||||||
xAxis,
|
xAxis,
|
||||||
} from "@/components/ui/chart"
|
} from "@/components/ui/chart"
|
||||||
import {
|
import { useYAxisWidth, cn, formatShortDate, toFixedFloat, decimalString, chartMargin } from "@/lib/utils"
|
||||||
useYAxisWidth,
|
|
||||||
cn,
|
|
||||||
formatShortDate,
|
|
||||||
toFixedWithoutTrailingZeros,
|
|
||||||
decimalString,
|
|
||||||
chartMargin,
|
|
||||||
} from "@/lib/utils"
|
|
||||||
import { ChartData } from "@/types"
|
import { ChartData } from "@/types"
|
||||||
import { memo, useMemo } from "react"
|
import { memo, useMemo } from "react"
|
||||||
|
|
||||||
@@ -72,7 +65,7 @@ export default memo(function GpuPowerChart({ chartData }: { chartData: ChartData
|
|||||||
domain={[0, "auto"]}
|
domain={[0, "auto"]}
|
||||||
width={yAxisWidth}
|
width={yAxisWidth}
|
||||||
tickFormatter={(value) => {
|
tickFormatter={(value) => {
|
||||||
const val = toFixedWithoutTrailingZeros(value, 2)
|
const val = toFixedFloat(value, 2)
|
||||||
return updateYAxisWidth(val + "W")
|
return updateYAxisWidth(val + "W")
|
||||||
}}
|
}}
|
||||||
tickLine={false}
|
tickLine={false}
|
||||||
|
|||||||
96
beszel/site/src/components/charts/load-average-chart.tsx
Normal file
96
beszel/site/src/components/charts/load-average-chart.tsx
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
import { CartesianGrid, Line, LineChart, YAxis } from "recharts"
|
||||||
|
|
||||||
|
import {
|
||||||
|
ChartContainer,
|
||||||
|
ChartLegend,
|
||||||
|
ChartLegendContent,
|
||||||
|
ChartTooltip,
|
||||||
|
ChartTooltipContent,
|
||||||
|
xAxis,
|
||||||
|
} from "@/components/ui/chart"
|
||||||
|
import { useYAxisWidth, cn, formatShortDate, toFixedFloat, decimalString, chartMargin } from "@/lib/utils"
|
||||||
|
import { ChartData, SystemStats } from "@/types"
|
||||||
|
import { memo } from "react"
|
||||||
|
import { t } from "@lingui/core/macro"
|
||||||
|
|
||||||
|
export default memo(function LoadAverageChart({ chartData }: { chartData: ChartData }) {
|
||||||
|
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
|
||||||
|
|
||||||
|
const keys: { legacy: keyof SystemStats; color: string; label: string }[] = [
|
||||||
|
{
|
||||||
|
legacy: "l1",
|
||||||
|
color: "hsl(271, 81%, 60%)", // Purple
|
||||||
|
label: t({ message: `1 min`, comment: "Load average" }),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
legacy: "l5",
|
||||||
|
color: "hsl(217, 91%, 60%)", // Blue
|
||||||
|
label: t({ message: `5 min`, comment: "Load average" }),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
legacy: "l15",
|
||||||
|
color: "hsl(25, 95%, 53%)", // Orange
|
||||||
|
label: t({ message: `15 min`, comment: "Load average" }),
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<ChartContainer
|
||||||
|
className={cn("h-full w-full absolute aspect-auto bg-card opacity-0 transition-opacity", {
|
||||||
|
"opacity-100": yAxisWidth,
|
||||||
|
})}
|
||||||
|
>
|
||||||
|
<LineChart accessibilityLayer data={chartData.systemStats} margin={chartMargin}>
|
||||||
|
<CartesianGrid vertical={false} />
|
||||||
|
<YAxis
|
||||||
|
direction="ltr"
|
||||||
|
orientation={chartData.orientation}
|
||||||
|
className="tracking-tighter"
|
||||||
|
domain={[0, "auto"]}
|
||||||
|
width={yAxisWidth}
|
||||||
|
tickFormatter={(value) => {
|
||||||
|
return updateYAxisWidth(String(toFixedFloat(value, 2)))
|
||||||
|
}}
|
||||||
|
tickLine={false}
|
||||||
|
axisLine={false}
|
||||||
|
/>
|
||||||
|
{xAxis(chartData)}
|
||||||
|
<ChartTooltip
|
||||||
|
animationEasing="ease-out"
|
||||||
|
animationDuration={150}
|
||||||
|
// @ts-ignore
|
||||||
|
// itemSorter={(a, b) => b.value - a.value}
|
||||||
|
content={
|
||||||
|
<ChartTooltipContent
|
||||||
|
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
|
||||||
|
contentFormatter={(item) => decimalString(item.value)}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
{keys.map(({ legacy, color, label }, i) => {
|
||||||
|
const dataKey = (value: { stats: SystemStats }) => {
|
||||||
|
if (chartData.agentVersion.patch < 1) {
|
||||||
|
return value.stats?.[legacy]
|
||||||
|
}
|
||||||
|
return value.stats?.la?.[i] ?? value.stats?.[legacy]
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<Line
|
||||||
|
key={i}
|
||||||
|
dataKey={dataKey}
|
||||||
|
name={label}
|
||||||
|
type="monotoneX"
|
||||||
|
dot={false}
|
||||||
|
strokeWidth={1.5}
|
||||||
|
stroke={color}
|
||||||
|
isAnimationActive={false}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
})}
|
||||||
|
<ChartLegend content={<ChartLegendContent />} />
|
||||||
|
</LineChart>
|
||||||
|
</ChartContainer>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
})
|
||||||
@@ -1,9 +1,10 @@
|
|||||||
import { Area, AreaChart, CartesianGrid, YAxis } from "recharts"
|
import { Area, AreaChart, CartesianGrid, YAxis } from "recharts"
|
||||||
import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from "@/components/ui/chart"
|
import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from "@/components/ui/chart"
|
||||||
import { useYAxisWidth, cn, toFixedFloat, decimalString, formatShortDate, chartMargin } from "@/lib/utils"
|
import { useYAxisWidth, cn, decimalString, formatShortDate, chartMargin, formatBytes, toFixedFloat } from "@/lib/utils"
|
||||||
import { memo } from "react"
|
import { memo } from "react"
|
||||||
import { ChartData } from "@/types"
|
import { ChartData } from "@/types"
|
||||||
import { useLingui } from "@lingui/react/macro"
|
import { useLingui } from "@lingui/react/macro"
|
||||||
|
import { Unit } from "@/lib/enums"
|
||||||
|
|
||||||
export default memo(function MemChart({ chartData }: { chartData: ChartData }) {
|
export default memo(function MemChart({ chartData }: { chartData: ChartData }) {
|
||||||
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
|
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
|
||||||
@@ -39,8 +40,8 @@ export default memo(function MemChart({ chartData }: { chartData: ChartData }) {
|
|||||||
tickLine={false}
|
tickLine={false}
|
||||||
axisLine={false}
|
axisLine={false}
|
||||||
tickFormatter={(value) => {
|
tickFormatter={(value) => {
|
||||||
const val = toFixedFloat(value, 1)
|
const { value: convertedValue, unit } = formatBytes(value * 1024, false, Unit.Bytes, true)
|
||||||
return updateYAxisWidth(val + " GB")
|
return updateYAxisWidth(toFixedFloat(convertedValue, value >= 10 ? 0 : 1) + " " + unit)
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
@@ -54,8 +55,11 @@ export default memo(function MemChart({ chartData }: { chartData: ChartData }) {
|
|||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
itemSorter={(a, b) => a.order - b.order}
|
itemSorter={(a, b) => a.order - b.order}
|
||||||
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
|
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
|
||||||
contentFormatter={(item) => decimalString(item.value) + " GB"}
|
contentFormatter={({ value }) => {
|
||||||
// indicator="line"
|
// mem values are supplied as GB
|
||||||
|
const { value: convertedValue, unit } = formatBytes(value * 1024, false, Unit.Bytes, true)
|
||||||
|
return decimalString(convertedValue, convertedValue >= 100 ? 1 : 2) + " " + unit
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -1,20 +1,16 @@
|
|||||||
import { t } from "@lingui/core/macro";
|
import { t } from "@lingui/core/macro"
|
||||||
|
|
||||||
import { Area, AreaChart, CartesianGrid, YAxis } from "recharts"
|
import { Area, AreaChart, CartesianGrid, YAxis } from "recharts"
|
||||||
import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from "@/components/ui/chart"
|
import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from "@/components/ui/chart"
|
||||||
import {
|
import { useYAxisWidth, cn, formatShortDate, decimalString, chartMargin, formatBytes, toFixedFloat } from "@/lib/utils"
|
||||||
useYAxisWidth,
|
|
||||||
cn,
|
|
||||||
formatShortDate,
|
|
||||||
toFixedWithoutTrailingZeros,
|
|
||||||
decimalString,
|
|
||||||
chartMargin,
|
|
||||||
} from "@/lib/utils"
|
|
||||||
import { ChartData } from "@/types"
|
import { ChartData } from "@/types"
|
||||||
import { memo } from "react"
|
import { memo } from "react"
|
||||||
|
import { $userSettings } from "@/lib/stores"
|
||||||
|
import { useStore } from "@nanostores/react"
|
||||||
|
|
||||||
export default memo(function SwapChart({ chartData }: { chartData: ChartData }) {
|
export default memo(function SwapChart({ chartData }: { chartData: ChartData }) {
|
||||||
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
|
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
|
||||||
|
const userSettings = useStore($userSettings)
|
||||||
|
|
||||||
if (chartData.systemStats.length === 0) {
|
if (chartData.systemStats.length === 0) {
|
||||||
return null
|
return null
|
||||||
@@ -33,11 +29,14 @@ export default memo(function SwapChart({ chartData }: { chartData: ChartData })
|
|||||||
direction="ltr"
|
direction="ltr"
|
||||||
orientation={chartData.orientation}
|
orientation={chartData.orientation}
|
||||||
className="tracking-tighter"
|
className="tracking-tighter"
|
||||||
domain={[0, () => toFixedWithoutTrailingZeros(chartData.systemStats.at(-1)?.stats.s ?? 0.04, 2)]}
|
domain={[0, () => toFixedFloat(chartData.systemStats.at(-1)?.stats.s ?? 0.04, 2)]}
|
||||||
width={yAxisWidth}
|
width={yAxisWidth}
|
||||||
tickLine={false}
|
tickLine={false}
|
||||||
axisLine={false}
|
axisLine={false}
|
||||||
tickFormatter={(value) => updateYAxisWidth(value + " GB")}
|
tickFormatter={(value) => {
|
||||||
|
const { value: convertedValue, unit } = formatBytes(value * 1024, false, userSettings.unitDisk, true)
|
||||||
|
return updateYAxisWidth(toFixedFloat(convertedValue, value >= 10 ? 0 : 1) + " " + unit)
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
{xAxis(chartData)}
|
{xAxis(chartData)}
|
||||||
<ChartTooltip
|
<ChartTooltip
|
||||||
@@ -46,7 +45,11 @@ export default memo(function SwapChart({ chartData }: { chartData: ChartData })
|
|||||||
content={
|
content={
|
||||||
<ChartTooltipContent
|
<ChartTooltipContent
|
||||||
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
|
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
|
||||||
contentFormatter={(item) => decimalString(item.value) + " GB"}
|
contentFormatter={({ value }) => {
|
||||||
|
// mem values are supplied as GB
|
||||||
|
const { value: convertedValue, unit } = formatBytes(value * 1024, false, userSettings.unitDisk, true)
|
||||||
|
return decimalString(convertedValue, convertedValue >= 100 ? 1 : 2) + " " + unit
|
||||||
|
}}
|
||||||
// indicator="line"
|
// indicator="line"
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,17 +12,19 @@ import {
|
|||||||
useYAxisWidth,
|
useYAxisWidth,
|
||||||
cn,
|
cn,
|
||||||
formatShortDate,
|
formatShortDate,
|
||||||
toFixedWithoutTrailingZeros,
|
toFixedFloat,
|
||||||
decimalString,
|
|
||||||
chartMargin,
|
chartMargin,
|
||||||
|
formatTemperature,
|
||||||
|
decimalString,
|
||||||
} from "@/lib/utils"
|
} from "@/lib/utils"
|
||||||
import { ChartData } from "@/types"
|
import { ChartData } from "@/types"
|
||||||
import { memo, useMemo } from "react"
|
import { memo, useMemo } from "react"
|
||||||
import { $temperatureFilter } from "@/lib/stores"
|
import { $temperatureFilter, $userSettings } from "@/lib/stores"
|
||||||
import { useStore } from "@nanostores/react"
|
import { useStore } from "@nanostores/react"
|
||||||
|
|
||||||
export default memo(function TemperatureChart({ chartData }: { chartData: ChartData }) {
|
export default memo(function TemperatureChart({ chartData }: { chartData: ChartData }) {
|
||||||
const filter = useStore($temperatureFilter)
|
const filter = useStore($temperatureFilter)
|
||||||
|
const userSettings = useStore($userSettings)
|
||||||
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
|
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
|
||||||
|
|
||||||
if (chartData.systemStats.length === 0) {
|
if (chartData.systemStats.length === 0) {
|
||||||
@@ -72,9 +74,9 @@ export default memo(function TemperatureChart({ chartData }: { chartData: ChartD
|
|||||||
className="tracking-tighter"
|
className="tracking-tighter"
|
||||||
domain={[0, "auto"]}
|
domain={[0, "auto"]}
|
||||||
width={yAxisWidth}
|
width={yAxisWidth}
|
||||||
tickFormatter={(value) => {
|
tickFormatter={(val) => {
|
||||||
const val = toFixedWithoutTrailingZeros(value, 2)
|
const { value, unit } = formatTemperature(val, userSettings.unitTemp)
|
||||||
return updateYAxisWidth(val + " °C")
|
return updateYAxisWidth(toFixedFloat(value, 2) + " " + unit)
|
||||||
}}
|
}}
|
||||||
tickLine={false}
|
tickLine={false}
|
||||||
axisLine={false}
|
axisLine={false}
|
||||||
@@ -88,7 +90,10 @@ export default memo(function TemperatureChart({ chartData }: { chartData: ChartD
|
|||||||
content={
|
content={
|
||||||
<ChartTooltipContent
|
<ChartTooltipContent
|
||||||
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
|
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
|
||||||
contentFormatter={(item) => decimalString(item.value) + " °C"}
|
contentFormatter={(item) => {
|
||||||
|
const { value, unit } = formatTemperature(item.value, userSettings.unitTemp)
|
||||||
|
return decimalString(value) + " " + unit
|
||||||
|
}}
|
||||||
filter={filter}
|
filter={filter}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import {
|
import {
|
||||||
|
AlertOctagonIcon,
|
||||||
BookIcon,
|
BookIcon,
|
||||||
DatabaseBackupIcon,
|
DatabaseBackupIcon,
|
||||||
FingerprintIcon,
|
FingerprintIcon,
|
||||||
@@ -69,7 +70,7 @@ export default memo(function CommandPalette({ open, setOpen }: { open: boolean;
|
|||||||
setOpen(false)
|
setOpen(false)
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Server className="me-2 h-4 w-4" />
|
<Server className="me-2 size-4" />
|
||||||
<span>{system.name}</span>
|
<span>{system.name}</span>
|
||||||
<CommandShortcut>{getHostDisplayValue(system)}</CommandShortcut>
|
<CommandShortcut>{getHostDisplayValue(system)}</CommandShortcut>
|
||||||
</CommandItem>
|
</CommandItem>
|
||||||
@@ -86,7 +87,7 @@ export default memo(function CommandPalette({ open, setOpen }: { open: boolean;
|
|||||||
setOpen(false)
|
setOpen(false)
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<LayoutDashboard className="me-2 h-4 w-4" />
|
<LayoutDashboard className="me-2 size-4" />
|
||||||
<span>
|
<span>
|
||||||
<Trans>Dashboard</Trans>
|
<Trans>Dashboard</Trans>
|
||||||
</span>
|
</span>
|
||||||
@@ -100,7 +101,7 @@ export default memo(function CommandPalette({ open, setOpen }: { open: boolean;
|
|||||||
setOpen(false)
|
setOpen(false)
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<SettingsIcon className="me-2 h-4 w-4" />
|
<SettingsIcon className="me-2 size-4" />
|
||||||
<span>
|
<span>
|
||||||
<Trans>Settings</Trans>
|
<Trans>Settings</Trans>
|
||||||
</span>
|
</span>
|
||||||
@@ -113,7 +114,7 @@ export default memo(function CommandPalette({ open, setOpen }: { open: boolean;
|
|||||||
setOpen(false)
|
setOpen(false)
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<MailIcon className="me-2 h-4 w-4" />
|
<MailIcon className="me-2 size-4" />
|
||||||
<span>
|
<span>
|
||||||
<Trans>Notifications</Trans>
|
<Trans>Notifications</Trans>
|
||||||
</span>
|
</span>
|
||||||
@@ -125,19 +126,31 @@ export default memo(function CommandPalette({ open, setOpen }: { open: boolean;
|
|||||||
setOpen(false)
|
setOpen(false)
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<FingerprintIcon className="me-2 h-4 w-4" />
|
<FingerprintIcon className="me-2 size-4" />
|
||||||
<span>
|
<span>
|
||||||
<Trans>Tokens & Fingerprints</Trans>
|
<Trans>Tokens & Fingerprints</Trans>
|
||||||
</span>
|
</span>
|
||||||
{SettingsShortcut}
|
{SettingsShortcut}
|
||||||
</CommandItem>
|
</CommandItem>
|
||||||
|
<CommandItem
|
||||||
|
onSelect={() => {
|
||||||
|
navigate(getPagePath($router, "settings", { name: "alert-history" }))
|
||||||
|
setOpen(false)
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<AlertOctagonIcon className="me-2 size-4" />
|
||||||
|
<span>
|
||||||
|
<Trans>Alert History</Trans>
|
||||||
|
</span>
|
||||||
|
{SettingsShortcut}
|
||||||
|
</CommandItem>
|
||||||
<CommandItem
|
<CommandItem
|
||||||
keywords={["help", "oauth", "oidc"]}
|
keywords={["help", "oauth", "oidc"]}
|
||||||
onSelect={() => {
|
onSelect={() => {
|
||||||
window.location.href = "https://beszel.dev/guide/what-is-beszel"
|
window.location.href = "https://beszel.dev/guide/what-is-beszel"
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<BookIcon className="me-2 h-4 w-4" />
|
<BookIcon className="me-2 size-4" />
|
||||||
<span>
|
<span>
|
||||||
<Trans>Documentation</Trans>
|
<Trans>Documentation</Trans>
|
||||||
</span>
|
</span>
|
||||||
@@ -155,7 +168,7 @@ export default memo(function CommandPalette({ open, setOpen }: { open: boolean;
|
|||||||
window.open(prependBasePath("/_/"), "_blank")
|
window.open(prependBasePath("/_/"), "_blank")
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<UsersIcon className="me-2 h-4 w-4" />
|
<UsersIcon className="me-2 size-4" />
|
||||||
<span>
|
<span>
|
||||||
<Trans>Users</Trans>
|
<Trans>Users</Trans>
|
||||||
</span>
|
</span>
|
||||||
@@ -167,7 +180,7 @@ export default memo(function CommandPalette({ open, setOpen }: { open: boolean;
|
|||||||
window.open(prependBasePath("/_/#/logs"), "_blank")
|
window.open(prependBasePath("/_/#/logs"), "_blank")
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<LogsIcon className="me-2 h-4 w-4" />
|
<LogsIcon className="me-2 size-4" />
|
||||||
<span>
|
<span>
|
||||||
<Trans>Logs</Trans>
|
<Trans>Logs</Trans>
|
||||||
</span>
|
</span>
|
||||||
@@ -179,7 +192,7 @@ export default memo(function CommandPalette({ open, setOpen }: { open: boolean;
|
|||||||
window.open(prependBasePath("/_/#/settings/backups"), "_blank")
|
window.open(prependBasePath("/_/#/settings/backups"), "_blank")
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<DatabaseBackupIcon className="me-2 h-4 w-4" />
|
<DatabaseBackupIcon className="me-2 size-4" />
|
||||||
<span>
|
<span>
|
||||||
<Trans>Backups</Trans>
|
<Trans>Backups</Trans>
|
||||||
</span>
|
</span>
|
||||||
@@ -192,7 +205,7 @@ export default memo(function CommandPalette({ open, setOpen }: { open: boolean;
|
|||||||
window.open(prependBasePath("/_/#/settings/mail"), "_blank")
|
window.open(prependBasePath("/_/#/settings/mail"), "_blank")
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<MailIcon className="me-2 h-4 w-4" />
|
<MailIcon className="me-2 size-4" />
|
||||||
<span>
|
<span>
|
||||||
<Trans>SMTP settings</Trans>
|
<Trans>SMTP settings</Trans>
|
||||||
</span>
|
</span>
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ import { DropdownMenuContent, DropdownMenuItem } from "./ui/dropdown-menu"
|
|||||||
import { copyToClipboard, getHubURL } from "@/lib/utils"
|
import { copyToClipboard, getHubURL } from "@/lib/utils"
|
||||||
import { i18n } from "@lingui/core"
|
import { i18n } from "@lingui/core"
|
||||||
|
|
||||||
const isBeta = BESZEL.HUB_VERSION.includes("beta")
|
// const isbeta = beszel.hub_version.includes("beta")
|
||||||
const imageTag = isBeta ? ":edge" : ""
|
// const imagetag = isbeta ? ":edge" : ""
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the URL of the script to install the agent.
|
* Get the URL of the script to install the agent.
|
||||||
@@ -12,18 +12,20 @@ const imageTag = isBeta ? ":edge" : ""
|
|||||||
* @returns The URL for the script.
|
* @returns The URL for the script.
|
||||||
*/
|
*/
|
||||||
const getScriptUrl = (path: string = "") => {
|
const getScriptUrl = (path: string = "") => {
|
||||||
const url = new URL("https://get.beszel.dev")
|
return `https://get.beszel.dev${path}`
|
||||||
url.pathname = path
|
// no beta for now
|
||||||
if (isBeta) {
|
// const url = new URL("https://get.beszel.dev")
|
||||||
url.searchParams.set("beta", "1")
|
// url.pathname = path
|
||||||
}
|
// if (isBeta) {
|
||||||
return url.toString()
|
// url.searchParams.set("beta", "1")
|
||||||
|
// }
|
||||||
|
// return url.toString()
|
||||||
}
|
}
|
||||||
|
|
||||||
export function copyDockerCompose(port = "45876", publicKey: string, token: string) {
|
export function copyDockerCompose(port = "45876", publicKey: string, token: string) {
|
||||||
copyToClipboard(`services:
|
copyToClipboard(`services:
|
||||||
beszel-agent:
|
beszel-agent:
|
||||||
image: henrygd/beszel-agent${imageTag}
|
image: henrygd/beszel-agent
|
||||||
container_name: beszel-agent
|
container_name: beszel-agent
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
network_mode: host
|
network_mode: host
|
||||||
@@ -41,7 +43,7 @@ export function copyDockerCompose(port = "45876", publicKey: string, token: stri
|
|||||||
|
|
||||||
export function copyDockerRun(port = "45876", publicKey: string, token: string) {
|
export function copyDockerRun(port = "45876", publicKey: string, token: string) {
|
||||||
copyToClipboard(
|
copyToClipboard(
|
||||||
`docker run -d --name beszel-agent --network host --restart unless-stopped -v /var/run/docker.sock:/var/run/docker.sock:ro -v ./beszel_agent_data:/var/lib/beszel-agent -e KEY="${publicKey}" -e LISTEN=${port} -e TOKEN="${token}" -e HUB_URL="${getHubURL()}" henrygd/beszel-agent${imageTag}`
|
`docker run -d --name beszel-agent --network host --restart unless-stopped -v /var/run/docker.sock:/var/run/docker.sock:ro -v ./beszel_agent_data:/var/lib/beszel-agent -e KEY="${publicKey}" -e LISTEN=${port} -e TOKEN="${token}" -e HUB_URL="${getHubURL()}" henrygd/beszel-agent`
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { t } from "@lingui/core/macro";
|
import { t } from "@lingui/core/macro"
|
||||||
import { Trans } from "@lingui/react/macro";
|
import { Trans } from "@lingui/react/macro"
|
||||||
import { cn } from "@/lib/utils"
|
import { cn } from "@/lib/utils"
|
||||||
import { buttonVariants } from "@/components/ui/button"
|
import { buttonVariants } from "@/components/ui/button"
|
||||||
import { Input } from "@/components/ui/input"
|
import { Input } from "@/components/ui/input"
|
||||||
@@ -43,6 +43,14 @@ const showLoginFaliedToast = () => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const getAuthProviderIcon = (provider: AuthProviderInfo) => {
|
||||||
|
let { name } = provider
|
||||||
|
if (name.startsWith("oidc")) {
|
||||||
|
name = "oidc"
|
||||||
|
}
|
||||||
|
return prependBasePath(`/_/images/oauth2/${name}.svg`)
|
||||||
|
}
|
||||||
|
|
||||||
export function UserAuthForm({
|
export function UserAuthForm({
|
||||||
className,
|
className,
|
||||||
isFirstRun,
|
isFirstRun,
|
||||||
@@ -242,7 +250,7 @@ export function UserAuthForm({
|
|||||||
</form>
|
</form>
|
||||||
{(isFirstRun || oauthEnabled) && (
|
{(isFirstRun || oauthEnabled) && (
|
||||||
// only show 'continue with' during onboarding or if we have auth providers
|
// only show 'continue with' during onboarding or if we have auth providers
|
||||||
(<div className="relative">
|
<div className="relative">
|
||||||
<div className="absolute inset-0 flex items-center">
|
<div className="absolute inset-0 flex items-center">
|
||||||
<span className="w-full border-t" />
|
<span className="w-full border-t" />
|
||||||
</div>
|
</div>
|
||||||
@@ -251,7 +259,7 @@ export function UserAuthForm({
|
|||||||
<Trans>Or continue with</Trans>
|
<Trans>Or continue with</Trans>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>)
|
</div>
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
@@ -273,7 +281,7 @@ export function UserAuthForm({
|
|||||||
) : (
|
) : (
|
||||||
<img
|
<img
|
||||||
className="me-2 h-4 w-4 dark:brightness-0 dark:invert"
|
className="me-2 h-4 w-4 dark:brightness-0 dark:invert"
|
||||||
src={prependBasePath(`/_/images/oauth2/${provider.name}.svg`)}
|
src={getAuthProviderIcon(provider)}
|
||||||
alt=""
|
alt=""
|
||||||
// onError={(e) => {
|
// onError={(e) => {
|
||||||
// e.currentTarget.src = "/static/lock.svg"
|
// e.currentTarget.src = "/static/lock.svg"
|
||||||
@@ -287,7 +295,7 @@ export function UserAuthForm({
|
|||||||
)}
|
)}
|
||||||
{!oauthEnabled && isFirstRun && (
|
{!oauthEnabled && isFirstRun && (
|
||||||
// only show GitHub button / dialog during onboarding
|
// only show GitHub button / dialog during onboarding
|
||||||
(<Dialog>
|
<Dialog>
|
||||||
<DialogTrigger asChild>
|
<DialogTrigger asChild>
|
||||||
<button type="button" className={cn(buttonVariants({ variant: "outline" }))}>
|
<button type="button" className={cn(buttonVariants({ variant: "outline" }))}>
|
||||||
<img className="me-2 h-4 w-4 dark:invert" src={prependBasePath("/_/images/oauth2/github.svg")} alt="" />
|
<img className="me-2 h-4 w-4 dark:invert" src={prependBasePath("/_/images/oauth2/github.svg")} alt="" />
|
||||||
@@ -318,7 +326,7 @@ export function UserAuthForm({
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</DialogContent>
|
</DialogContent>
|
||||||
</Dialog>)
|
</Dialog>
|
||||||
)}
|
)}
|
||||||
{passwordEnabled && !isFirstRun && (
|
{passwordEnabled && !isFirstRun && (
|
||||||
<Link
|
<Link
|
||||||
@@ -329,5 +337,5 @@ export function UserAuthForm({
|
|||||||
</Link>
|
</Link>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,9 @@ export const Home = memo(() => {
|
|||||||
const systems = useStore($systems)
|
const systems = useStore($systems)
|
||||||
const { t } = useLingui()
|
const { t } = useLingui()
|
||||||
|
|
||||||
let alertsKey = ""
|
/* key to prevent re-rendering of active alerts */
|
||||||
|
const alertsKey: string[] = []
|
||||||
|
|
||||||
const activeAlerts = useMemo(() => {
|
const activeAlerts = useMemo(() => {
|
||||||
const activeAlerts = alerts.filter((alert) => {
|
const activeAlerts = alerts.filter((alert) => {
|
||||||
const active = alert.triggered && alert.name in alertInfo
|
const active = alert.triggered && alert.name in alertInfo
|
||||||
@@ -26,7 +28,7 @@ export const Home = memo(() => {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
alert.sysname = systems.find((system) => system.id === alert.system)?.name
|
alert.sysname = systems.find((system) => system.id === alert.system)?.name
|
||||||
alertsKey += alert.id
|
alertsKey.push(alert.id)
|
||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
return activeAlerts
|
return activeAlerts
|
||||||
@@ -81,7 +83,7 @@ export const Home = memo(() => {
|
|||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
),
|
),
|
||||||
[alertsKey]
|
[alertsKey.join("")]
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -110,10 +112,14 @@ const ActiveAlerts = memo(({ activeAlerts }: { activeAlerts: AlertRecord[] }) =>
|
|||||||
{alert.sysname} {info.name().toLowerCase().replace("cpu", "CPU")}
|
{alert.sysname} {info.name().toLowerCase().replace("cpu", "CPU")}
|
||||||
</AlertTitle>
|
</AlertTitle>
|
||||||
<AlertDescription>
|
<AlertDescription>
|
||||||
|
{alert.name === "Status" ? (
|
||||||
|
<Trans>Connection is down</Trans>
|
||||||
|
) : (
|
||||||
<Trans>
|
<Trans>
|
||||||
Exceeds {alert.value}
|
Exceeds {alert.value}
|
||||||
{info.unit} in last <Plural value={alert.min} one="# minute" other="# minutes" />
|
{info.unit} in last <Plural value={alert.min} one="# minute" other="# minutes" />
|
||||||
</Trans>
|
</Trans>
|
||||||
|
)}
|
||||||
</AlertDescription>
|
</AlertDescription>
|
||||||
<Link
|
<Link
|
||||||
href={getPagePath($router, "system", { name: alert.sysname! })}
|
href={getPagePath($router, "system", { name: alert.sysname! })}
|
||||||
|
|||||||
@@ -0,0 +1,385 @@
|
|||||||
|
import { pb } from "@/lib/stores"
|
||||||
|
import { alertInfo, cn, formatDuration, formatShortDate } from "@/lib/utils"
|
||||||
|
import { AlertsHistoryRecord } from "@/types"
|
||||||
|
import {
|
||||||
|
getCoreRowModel,
|
||||||
|
getPaginationRowModel,
|
||||||
|
getSortedRowModel,
|
||||||
|
getFilteredRowModel,
|
||||||
|
useReactTable,
|
||||||
|
flexRender,
|
||||||
|
ColumnFiltersState,
|
||||||
|
SortingState,
|
||||||
|
VisibilityState,
|
||||||
|
} from "@tanstack/react-table"
|
||||||
|
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
|
||||||
|
import { Button, buttonVariants } from "@/components/ui/button"
|
||||||
|
import { Input } from "@/components/ui/input"
|
||||||
|
import { alertsHistoryColumns } from "../../alerts-history-columns"
|
||||||
|
import { Checkbox } from "@/components/ui/checkbox"
|
||||||
|
import { memo, useEffect, useState } from "react"
|
||||||
|
import { Label } from "@/components/ui/label"
|
||||||
|
import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from "@/components/ui/select"
|
||||||
|
import {
|
||||||
|
ChevronLeftIcon,
|
||||||
|
ChevronRightIcon,
|
||||||
|
ChevronsLeftIcon,
|
||||||
|
ChevronsRightIcon,
|
||||||
|
DownloadIcon,
|
||||||
|
Trash2Icon,
|
||||||
|
} from "lucide-react"
|
||||||
|
import { Trans } from "@lingui/react/macro"
|
||||||
|
import { t } from "@lingui/core/macro"
|
||||||
|
import { useToast } from "@/components/ui/use-toast"
|
||||||
|
import {
|
||||||
|
AlertDialog,
|
||||||
|
AlertDialogAction,
|
||||||
|
AlertDialogCancel,
|
||||||
|
AlertDialogContent,
|
||||||
|
AlertDialogDescription,
|
||||||
|
AlertDialogFooter,
|
||||||
|
AlertDialogHeader,
|
||||||
|
AlertDialogTitle,
|
||||||
|
AlertDialogTrigger,
|
||||||
|
} from "@/components/ui/alert-dialog"
|
||||||
|
|
||||||
|
const SectionIntro = memo(() => {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<h3 className="text-xl font-medium mb-2">
|
||||||
|
<Trans>Alert History</Trans>
|
||||||
|
</h3>
|
||||||
|
<p className="text-sm text-muted-foreground leading-relaxed">
|
||||||
|
<Trans>View your 200 most recent alerts.</Trans>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
export default function AlertsHistoryDataTable() {
|
||||||
|
const [data, setData] = useState<AlertsHistoryRecord[]>([])
|
||||||
|
const [sorting, setSorting] = useState<SortingState>([])
|
||||||
|
const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([])
|
||||||
|
const [columnVisibility, setColumnVisibility] = useState<VisibilityState>({})
|
||||||
|
const [rowSelection, setRowSelection] = useState({})
|
||||||
|
const [globalFilter, setGlobalFilter] = useState("")
|
||||||
|
const { toast } = useToast()
|
||||||
|
const [deleteOpen, setDeleteDialogOpen] = useState(false)
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
let unsubscribe: (() => void) | undefined
|
||||||
|
const pbOptions = {
|
||||||
|
expand: "system",
|
||||||
|
fields: "id,name,value,state,created,resolved,expand.system.name",
|
||||||
|
}
|
||||||
|
// Initial load
|
||||||
|
pb.collection<AlertsHistoryRecord>("alerts_history")
|
||||||
|
.getList(0, 200, {
|
||||||
|
...pbOptions,
|
||||||
|
sort: "-created",
|
||||||
|
})
|
||||||
|
.then(({ items }) => setData(items))
|
||||||
|
|
||||||
|
// Subscribe to changes
|
||||||
|
;(async () => {
|
||||||
|
unsubscribe = await pb.collection("alerts_history").subscribe(
|
||||||
|
"*",
|
||||||
|
(e) => {
|
||||||
|
if (e.action === "create") {
|
||||||
|
setData((current) => [e.record as AlertsHistoryRecord, ...current])
|
||||||
|
}
|
||||||
|
if (e.action === "update") {
|
||||||
|
setData((current) => current.map((r) => (r.id === e.record.id ? (e.record as AlertsHistoryRecord) : r)))
|
||||||
|
}
|
||||||
|
if (e.action === "delete") {
|
||||||
|
setData((current) => current.filter((r) => r.id !== e.record.id))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
pbOptions
|
||||||
|
)
|
||||||
|
})()
|
||||||
|
// Unsubscribe on unmount
|
||||||
|
return () => unsubscribe?.()
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
const table = useReactTable({
|
||||||
|
data,
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
id: "select",
|
||||||
|
header: ({ table }) => (
|
||||||
|
<Checkbox
|
||||||
|
className="ms-2"
|
||||||
|
checked={table.getIsAllPageRowsSelected() || (table.getIsSomePageRowsSelected() && "indeterminate")}
|
||||||
|
onCheckedChange={(value) => table.toggleAllPageRowsSelected(!!value)}
|
||||||
|
aria-label="Select all"
|
||||||
|
/>
|
||||||
|
),
|
||||||
|
cell: ({ row }) => (
|
||||||
|
<Checkbox
|
||||||
|
checked={row.getIsSelected()}
|
||||||
|
onCheckedChange={(value) => row.toggleSelected(!!value)}
|
||||||
|
aria-label="Select row"
|
||||||
|
/>
|
||||||
|
),
|
||||||
|
enableSorting: false,
|
||||||
|
enableHiding: false,
|
||||||
|
},
|
||||||
|
...alertsHistoryColumns,
|
||||||
|
],
|
||||||
|
getCoreRowModel: getCoreRowModel(),
|
||||||
|
getPaginationRowModel: getPaginationRowModel(),
|
||||||
|
getSortedRowModel: getSortedRowModel(),
|
||||||
|
getFilteredRowModel: getFilteredRowModel(),
|
||||||
|
onSortingChange: setSorting,
|
||||||
|
onColumnFiltersChange: setColumnFilters,
|
||||||
|
onColumnVisibilityChange: setColumnVisibility,
|
||||||
|
onRowSelectionChange: setRowSelection,
|
||||||
|
state: {
|
||||||
|
sorting,
|
||||||
|
columnFilters,
|
||||||
|
columnVisibility,
|
||||||
|
rowSelection,
|
||||||
|
globalFilter,
|
||||||
|
},
|
||||||
|
onGlobalFilterChange: setGlobalFilter,
|
||||||
|
globalFilterFn: (row, _columnId, filterValue) => {
|
||||||
|
const system = row.original.expand?.system?.name ?? ""
|
||||||
|
const name = row.getValue("name") ?? ""
|
||||||
|
const created = row.getValue("created") ?? ""
|
||||||
|
const search = String(filterValue).toLowerCase()
|
||||||
|
return (
|
||||||
|
system.toLowerCase().includes(search) ||
|
||||||
|
(name as string).toLowerCase().includes(search) ||
|
||||||
|
(created as string).toLowerCase().includes(search)
|
||||||
|
)
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
// Bulk delete handler
|
||||||
|
const handleBulkDelete = async () => {
|
||||||
|
setDeleteDialogOpen(false)
|
||||||
|
const selectedIds = table.getSelectedRowModel().rows.map((row) => row.original.id)
|
||||||
|
try {
|
||||||
|
let batch = pb.createBatch()
|
||||||
|
let inBatch = 0
|
||||||
|
for (const id of selectedIds) {
|
||||||
|
batch.collection("alerts_history").delete(id)
|
||||||
|
inBatch++
|
||||||
|
if (inBatch > 20) {
|
||||||
|
await batch.send()
|
||||||
|
batch = pb.createBatch()
|
||||||
|
inBatch = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
inBatch && (await batch.send())
|
||||||
|
table.resetRowSelection()
|
||||||
|
} catch (e) {
|
||||||
|
toast({
|
||||||
|
variant: "destructive",
|
||||||
|
title: t`Error`,
|
||||||
|
description: `Failed to delete records.`,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Export to CSV handler
|
||||||
|
const handleExportCSV = () => {
|
||||||
|
const selectedRows = table.getSelectedRowModel().rows
|
||||||
|
if (!selectedRows.length) return
|
||||||
|
const cells: Record<string, (record: AlertsHistoryRecord) => string> = {
|
||||||
|
system: (record) => record.expand?.system?.name || record.system,
|
||||||
|
name: (record) => alertInfo[record.name]?.name() || record.name,
|
||||||
|
value: (record) => record.value + (alertInfo[record.name]?.unit ?? ""),
|
||||||
|
state: (record) => (record.resolved ? t`Resolved` : t`Active`),
|
||||||
|
created: (record) => formatShortDate(record.created),
|
||||||
|
resolved: (record) => (record.resolved ? formatShortDate(record.resolved) : ""),
|
||||||
|
duration: (record) => (record.resolved ? formatDuration(record.created, record.resolved) : ""),
|
||||||
|
}
|
||||||
|
const csvRows = [Object.keys(cells).join(",")]
|
||||||
|
for (const row of selectedRows) {
|
||||||
|
const r = row.original
|
||||||
|
csvRows.push(
|
||||||
|
Object.values(cells)
|
||||||
|
.map((val) => val(r))
|
||||||
|
.join(",")
|
||||||
|
)
|
||||||
|
}
|
||||||
|
const blob = new Blob([csvRows.join("\n")], { type: "text/csv" })
|
||||||
|
const url = URL.createObjectURL(blob)
|
||||||
|
const a = document.createElement("a")
|
||||||
|
a.href = url
|
||||||
|
a.download = "alerts_history.csv"
|
||||||
|
a.click()
|
||||||
|
URL.revokeObjectURL(url)
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="@container w-full">
|
||||||
|
<div className="@3xl:flex items-end mb-4 gap-4">
|
||||||
|
<SectionIntro />
|
||||||
|
<div className="flex items-center gap-2 ms-auto mt-3 @3xl:mt-0">
|
||||||
|
{table.getFilteredSelectedRowModel().rows.length > 0 && (
|
||||||
|
<div className="fixed bottom-0 left-0 w-full p-4 grid grid-cols-2 items-center gap-4 z-50 backdrop-blur-md shrink-0 @lg:static @lg:p-0 @lg:w-auto @lg:gap-3">
|
||||||
|
<AlertDialog open={deleteOpen} onOpenChange={(open) => setDeleteDialogOpen(open)}>
|
||||||
|
<AlertDialogTrigger asChild>
|
||||||
|
<Button variant="destructive" className="h-9 shrink-0">
|
||||||
|
<Trash2Icon className="size-4 shrink-0" />
|
||||||
|
<span className="ms-1">
|
||||||
|
<Trans>Delete</Trans>
|
||||||
|
</span>
|
||||||
|
</Button>
|
||||||
|
</AlertDialogTrigger>
|
||||||
|
<AlertDialogContent>
|
||||||
|
<AlertDialogHeader>
|
||||||
|
<AlertDialogTitle>
|
||||||
|
<Trans>Are you sure?</Trans>
|
||||||
|
</AlertDialogTitle>
|
||||||
|
<AlertDialogDescription>
|
||||||
|
<Trans>This will permanently delete all selected records from the database.</Trans>
|
||||||
|
</AlertDialogDescription>
|
||||||
|
</AlertDialogHeader>
|
||||||
|
<AlertDialogFooter>
|
||||||
|
<AlertDialogCancel>
|
||||||
|
<Trans>Cancel</Trans>
|
||||||
|
</AlertDialogCancel>
|
||||||
|
<AlertDialogAction
|
||||||
|
className={cn(buttonVariants({ variant: "destructive" }))}
|
||||||
|
onClick={handleBulkDelete}
|
||||||
|
>
|
||||||
|
<Trans>Continue</Trans>
|
||||||
|
</AlertDialogAction>
|
||||||
|
</AlertDialogFooter>
|
||||||
|
</AlertDialogContent>
|
||||||
|
</AlertDialog>
|
||||||
|
<Button variant="outline" className="h-10" onClick={handleExportCSV}>
|
||||||
|
<DownloadIcon className="size-4" />
|
||||||
|
<span className="ms-1">
|
||||||
|
<Trans>Export</Trans>
|
||||||
|
</span>
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
<Input
|
||||||
|
placeholder={t`Filter...`}
|
||||||
|
value={globalFilter}
|
||||||
|
onChange={(e) => setGlobalFilter(e.target.value)}
|
||||||
|
className="px-4 w-full max-w-full @3xl:w-64"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="rounded-md border overflow-x-auto whitespace-nowrap">
|
||||||
|
<Table>
|
||||||
|
<TableHeader>
|
||||||
|
{table.getHeaderGroups().map((headerGroup) => (
|
||||||
|
<TableRow key={headerGroup.id}>
|
||||||
|
{headerGroup.headers.map((header) => (
|
||||||
|
<TableHead className="px-2" key={header.id}>
|
||||||
|
{header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())}
|
||||||
|
</TableHead>
|
||||||
|
))}
|
||||||
|
</TableRow>
|
||||||
|
))}
|
||||||
|
</TableHeader>
|
||||||
|
<TableBody>
|
||||||
|
{table.getRowModel().rows.length ? (
|
||||||
|
table.getRowModel().rows.map((row) => (
|
||||||
|
<TableRow key={row.id} data-state={row.getIsSelected() && "selected"}>
|
||||||
|
{row.getVisibleCells().map((cell) => (
|
||||||
|
<TableCell key={cell.id} className="py-3">
|
||||||
|
{flexRender(cell.column.columnDef.cell, cell.getContext())}
|
||||||
|
</TableCell>
|
||||||
|
))}
|
||||||
|
</TableRow>
|
||||||
|
))
|
||||||
|
) : (
|
||||||
|
<TableRow>
|
||||||
|
<TableCell colSpan={table.getAllColumns().length} className="h-24 text-center">
|
||||||
|
<Trans>No results.</Trans>
|
||||||
|
</TableCell>
|
||||||
|
</TableRow>
|
||||||
|
)}
|
||||||
|
</TableBody>
|
||||||
|
</Table>
|
||||||
|
</div>
|
||||||
|
<div className="flex items-center justify-between ps-1 tabular-nums">
|
||||||
|
<div className="text-muted-foreground hidden flex-1 text-sm lg:flex">
|
||||||
|
<Trans>
|
||||||
|
{table.getFilteredSelectedRowModel().rows.length} of {table.getFilteredRowModel().rows.length} row(s)
|
||||||
|
selected.
|
||||||
|
</Trans>
|
||||||
|
</div>
|
||||||
|
<div className="flex w-full items-center gap-8 lg:w-fit my-3">
|
||||||
|
<div className="hidden items-center gap-2 lg:flex">
|
||||||
|
<Label htmlFor="rows-per-page" className="text-sm font-medium">
|
||||||
|
<Trans>Rows per page</Trans>
|
||||||
|
</Label>
|
||||||
|
<Select
|
||||||
|
value={`${table.getState().pagination.pageSize}`}
|
||||||
|
onValueChange={(value) => {
|
||||||
|
table.setPageSize(Number(value))
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<SelectTrigger className="w-[4.8em]" id="rows-per-page">
|
||||||
|
<SelectValue placeholder={table.getState().pagination.pageSize} />
|
||||||
|
</SelectTrigger>
|
||||||
|
<SelectContent side="top">
|
||||||
|
{[10, 20, 50, 100, 200].map((pageSize) => (
|
||||||
|
<SelectItem key={pageSize} value={`${pageSize}`}>
|
||||||
|
{pageSize}
|
||||||
|
</SelectItem>
|
||||||
|
))}
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
|
</div>
|
||||||
|
<div className="flex w-fit items-center justify-center text-sm font-medium">
|
||||||
|
<Trans>
|
||||||
|
Page {table.getState().pagination.pageIndex + 1} of {table.getPageCount()}
|
||||||
|
</Trans>
|
||||||
|
</div>
|
||||||
|
<div className="ms-auto flex items-center gap-2 lg:ms-0">
|
||||||
|
<Button
|
||||||
|
variant="outline"
|
||||||
|
className="hidden size-9 p-0 lg:flex"
|
||||||
|
onClick={() => table.setPageIndex(0)}
|
||||||
|
disabled={!table.getCanPreviousPage()}
|
||||||
|
>
|
||||||
|
<span className="sr-only">Go to first page</span>
|
||||||
|
<ChevronsLeftIcon className="size-5" />
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
variant="outline"
|
||||||
|
className="size-9"
|
||||||
|
size="icon"
|
||||||
|
onClick={() => table.previousPage()}
|
||||||
|
disabled={!table.getCanPreviousPage()}
|
||||||
|
>
|
||||||
|
<span className="sr-only">Go to previous page</span>
|
||||||
|
<ChevronLeftIcon className="size-5" />
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
variant="outline"
|
||||||
|
className="size-9"
|
||||||
|
size="icon"
|
||||||
|
onClick={() => table.nextPage()}
|
||||||
|
disabled={!table.getCanNextPage()}
|
||||||
|
>
|
||||||
|
<span className="sr-only">Go to next page</span>
|
||||||
|
<ChevronRightIcon className="size-5" />
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
variant="outline"
|
||||||
|
className="hidden size-9 lg:flex"
|
||||||
|
size="icon"
|
||||||
|
onClick={() => table.setPageIndex(table.getPageCount() - 1)}
|
||||||
|
disabled={!table.getCanNextPage()}
|
||||||
|
>
|
||||||
|
<span className="sr-only">Go to last page</span>
|
||||||
|
<ChevronsRightIcon className="size-5" />
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -11,7 +11,8 @@ import { useState } from "react"
|
|||||||
import languages from "@/lib/languages"
|
import languages from "@/lib/languages"
|
||||||
import { dynamicActivate } from "@/lib/i18n"
|
import { dynamicActivate } from "@/lib/i18n"
|
||||||
import { useLingui } from "@lingui/react/macro"
|
import { useLingui } from "@lingui/react/macro"
|
||||||
// import { setLang } from "@/lib/i18n"
|
import { Input } from "@/components/ui/input"
|
||||||
|
import { Unit } from "@/lib/enums"
|
||||||
|
|
||||||
export default function SettingsProfilePage({ userSettings }: { userSettings: UserSettings }) {
|
export default function SettingsProfilePage({ userSettings }: { userSettings: UserSettings }) {
|
||||||
const [isLoading, setIsLoading] = useState(false)
|
const [isLoading, setIsLoading] = useState(false)
|
||||||
@@ -101,6 +102,126 @@ export default function SettingsProfilePage({ userSettings }: { userSettings: Us
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<Separator />
|
<Separator />
|
||||||
|
<div className="space-y-2">
|
||||||
|
<div className="mb-4">
|
||||||
|
<h3 className="mb-1 text-lg font-medium">
|
||||||
|
<Trans comment="Temperature / network units">Unit preferences</Trans>
|
||||||
|
</h3>
|
||||||
|
<p className="text-sm text-muted-foreground leading-relaxed">
|
||||||
|
<Trans>Change display units for metrics.</Trans>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div className="grid sm:grid-cols-3 gap-4">
|
||||||
|
<div className="space-y-2">
|
||||||
|
<Label className="block" htmlFor="unitTemp">
|
||||||
|
<Trans>Temperature unit</Trans>
|
||||||
|
</Label>
|
||||||
|
<Select
|
||||||
|
name="unitTemp"
|
||||||
|
key={userSettings.unitTemp}
|
||||||
|
defaultValue={userSettings.unitTemp?.toString() || String(Unit.Celsius)}
|
||||||
|
>
|
||||||
|
<SelectTrigger id="unitTemp">
|
||||||
|
<SelectValue />
|
||||||
|
</SelectTrigger>
|
||||||
|
<SelectContent>
|
||||||
|
<SelectItem value={String(Unit.Celsius)}>
|
||||||
|
<Trans>Celsius (°C)</Trans>
|
||||||
|
</SelectItem>
|
||||||
|
<SelectItem value={String(Unit.Fahrenheit)}>
|
||||||
|
<Trans>Fahrenheit (°F)</Trans>
|
||||||
|
</SelectItem>
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
|
</div>
|
||||||
|
<div className="space-y-2">
|
||||||
|
<Label className="block" htmlFor="unitNet">
|
||||||
|
<Trans comment="Context: Bytes or bits">Network unit</Trans>
|
||||||
|
</Label>
|
||||||
|
<Select
|
||||||
|
name="unitNet"
|
||||||
|
key={userSettings.unitNet}
|
||||||
|
defaultValue={userSettings.unitNet?.toString() ?? String(Unit.Bytes)}
|
||||||
|
>
|
||||||
|
<SelectTrigger id="unitNet">
|
||||||
|
<SelectValue />
|
||||||
|
</SelectTrigger>
|
||||||
|
<SelectContent>
|
||||||
|
<SelectItem value={String(Unit.Bytes)}>
|
||||||
|
<Trans>Bytes (KB/s, MB/s, GB/s)</Trans>
|
||||||
|
</SelectItem>
|
||||||
|
<SelectItem value={String(Unit.Bits)}>
|
||||||
|
<Trans>Bits (Kbps, Mbps, Gbps)</Trans>
|
||||||
|
</SelectItem>
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
|
</div>
|
||||||
|
<div className="space-y-2">
|
||||||
|
<Label className="block" htmlFor="unitDisk">
|
||||||
|
<Trans>Disk unit</Trans>
|
||||||
|
</Label>
|
||||||
|
<Select
|
||||||
|
name="unitDisk"
|
||||||
|
key={userSettings.unitDisk}
|
||||||
|
defaultValue={userSettings.unitDisk?.toString() ?? String(Unit.Bytes)}
|
||||||
|
>
|
||||||
|
<SelectTrigger id="unitDisk">
|
||||||
|
<SelectValue />
|
||||||
|
</SelectTrigger>
|
||||||
|
<SelectContent>
|
||||||
|
<SelectItem value={String(Unit.Bytes)}>
|
||||||
|
<Trans>Bytes (KB/s, MB/s, GB/s)</Trans>
|
||||||
|
</SelectItem>
|
||||||
|
<SelectItem value={String(Unit.Bits)}>
|
||||||
|
<Trans>Bits (Kbps, Mbps, Gbps)</Trans>
|
||||||
|
</SelectItem>
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<Separator />
|
||||||
|
<div className="space-y-2">
|
||||||
|
<div className="mb-4">
|
||||||
|
<h3 className="mb-1 text-lg font-medium">
|
||||||
|
<Trans>Warning thresholds</Trans>
|
||||||
|
</h3>
|
||||||
|
<p className="text-sm text-muted-foreground leading-relaxed">
|
||||||
|
<Trans>Set percentage thresholds for meter colors.</Trans>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div className="grid grid-cols-2 lg:grid-cols-3 gap-4 items-end">
|
||||||
|
<div className="space-y-1">
|
||||||
|
<Label htmlFor="colorWarn">
|
||||||
|
<Trans>Warning (%)</Trans>
|
||||||
|
</Label>
|
||||||
|
<Input
|
||||||
|
id="colorWarn"
|
||||||
|
name="colorWarn"
|
||||||
|
type="number"
|
||||||
|
min={1}
|
||||||
|
max={100}
|
||||||
|
className="min-w-24"
|
||||||
|
defaultValue={userSettings.colorWarn ?? 65}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="space-y-1">
|
||||||
|
<Label htmlFor="colorCrit">
|
||||||
|
<Trans>Critical (%)</Trans>
|
||||||
|
</Label>
|
||||||
|
<Input
|
||||||
|
id="colorCrit"
|
||||||
|
name="colorCrit"
|
||||||
|
type="number"
|
||||||
|
min={1}
|
||||||
|
max={100}
|
||||||
|
className="min-w-24"
|
||||||
|
defaultValue={userSettings.colorCrit ?? 90}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<Separator />
|
||||||
<Button type="submit" className="flex items-center gap-1.5 disabled:opacity-100" disabled={isLoading}>
|
<Button type="submit" className="flex items-center gap-1.5 disabled:opacity-100" disabled={isLoading}>
|
||||||
{isLoading ? <LoaderCircleIcon className="h-4 w-4 animate-spin" /> : <SaveIcon className="h-4 w-4" />}
|
{isLoading ? <LoaderCircleIcon className="h-4 w-4 animate-spin" /> : <SaveIcon className="h-4 w-4" />}
|
||||||
<Trans>Save Settings</Trans>
|
<Trans>Save Settings</Trans>
|
||||||
|
|||||||
@@ -7,15 +7,16 @@ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/com
|
|||||||
import { useStore } from "@nanostores/react"
|
import { useStore } from "@nanostores/react"
|
||||||
import { $router } from "@/components/router.tsx"
|
import { $router } from "@/components/router.tsx"
|
||||||
import { getPagePath, redirectPage } from "@nanostores/router"
|
import { getPagePath, redirectPage } from "@nanostores/router"
|
||||||
import { BellIcon, FileSlidersIcon, FingerprintIcon, SettingsIcon } from "lucide-react"
|
import { BellIcon, FileSlidersIcon, FingerprintIcon, SettingsIcon, AlertOctagonIcon } from "lucide-react"
|
||||||
import { $userSettings, pb } from "@/lib/stores.ts"
|
import { $userSettings, pb } from "@/lib/stores.ts"
|
||||||
import { toast } from "@/components/ui/use-toast.ts"
|
import { toast } from "@/components/ui/use-toast.ts"
|
||||||
import { UserSettings } from "@/types.js"
|
import { UserSettings } from "@/types"
|
||||||
import General from "./general.tsx"
|
import General from "./general.tsx"
|
||||||
import Notifications from "./notifications.tsx"
|
import Notifications from "./notifications.tsx"
|
||||||
import ConfigYaml from "./config-yaml.tsx"
|
import ConfigYaml from "./config-yaml.tsx"
|
||||||
import { useLingui } from "@lingui/react/macro"
|
import { useLingui } from "@lingui/react/macro"
|
||||||
import Fingerprints from "./tokens-fingerprints.tsx"
|
import Fingerprints from "./tokens-fingerprints.tsx"
|
||||||
|
import AlertsHistoryDataTable from "./alerts-history-data-table"
|
||||||
|
|
||||||
export async function saveSettings(newSettings: Partial<UserSettings>) {
|
export async function saveSettings(newSettings: Partial<UserSettings>) {
|
||||||
try {
|
try {
|
||||||
@@ -63,7 +64,12 @@ export default function SettingsLayout() {
|
|||||||
title: t`Tokens & Fingerprints`,
|
title: t`Tokens & Fingerprints`,
|
||||||
href: getPagePath($router, "settings", { name: "tokens" }),
|
href: getPagePath($router, "settings", { name: "tokens" }),
|
||||||
icon: FingerprintIcon,
|
icon: FingerprintIcon,
|
||||||
// admin: true,
|
noReadOnly: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: t`Alert History`,
|
||||||
|
href: getPagePath($router, "settings", { name: "alert-history" }),
|
||||||
|
icon: AlertOctagonIcon,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: t`YAML Config`,
|
title: t`YAML Config`,
|
||||||
@@ -95,8 +101,8 @@ export default function SettingsLayout() {
|
|||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardContent className="p-0">
|
<CardContent className="p-0">
|
||||||
<Separator className="hidden md:block my-5" />
|
<Separator className="hidden md:block my-5" />
|
||||||
<div className="flex flex-col gap-3.5 md:flex-row md:gap-5 lg:gap-10">
|
<div className="flex flex-col gap-3.5 md:flex-row md:gap-5 lg:gap-12">
|
||||||
<aside className="md:max-w-44 min-w-40">
|
<aside className="md:max-w-52 min-w-40">
|
||||||
<SidebarNav items={sidebarNavItems} />
|
<SidebarNav items={sidebarNavItems} />
|
||||||
</aside>
|
</aside>
|
||||||
<div className="flex-1 min-w-0">
|
<div className="flex-1 min-w-0">
|
||||||
@@ -121,5 +127,7 @@ function SettingsContent({ name }: { name: string }) {
|
|||||||
return <ConfigYaml />
|
return <ConfigYaml />
|
||||||
case "tokens":
|
case "tokens":
|
||||||
return <Fingerprints />
|
return <Fingerprints />
|
||||||
|
case "alert-history":
|
||||||
|
return <AlertsHistoryDataTable />
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import React from "react"
|
import React from "react"
|
||||||
import { cn, isAdmin } from "@/lib/utils"
|
import { cn, isAdmin, isReadOnlyUser } from "@/lib/utils"
|
||||||
import { buttonVariants } from "../../ui/button"
|
import { buttonVariants } from "../../ui/button"
|
||||||
import { $router, Link, navigate } from "../../router"
|
import { $router, Link, navigate } from "../../router"
|
||||||
import { useStore } from "@nanostores/react"
|
import { useStore } from "@nanostores/react"
|
||||||
@@ -12,6 +12,7 @@ interface SidebarNavProps extends React.HTMLAttributes<HTMLElement> {
|
|||||||
title: string
|
title: string
|
||||||
icon?: React.FC<React.SVGProps<SVGSVGElement>>
|
icon?: React.FC<React.SVGProps<SVGSVGElement>>
|
||||||
admin?: boolean
|
admin?: boolean
|
||||||
|
noReadOnly?: boolean
|
||||||
}[]
|
}[]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -32,7 +33,7 @@ export function SidebarNav({ className, items, ...props }: SidebarNavProps) {
|
|||||||
return (
|
return (
|
||||||
<SelectItem key={item.href} value={item.href}>
|
<SelectItem key={item.href} value={item.href}>
|
||||||
<span className="flex items-center gap-2 truncate">
|
<span className="flex items-center gap-2 truncate">
|
||||||
{item.icon && <item.icon className="h-4 w-4" />}
|
{item.icon && <item.icon className="size-4" />}
|
||||||
<span className="truncate">{item.title}</span>
|
<span className="truncate">{item.title}</span>
|
||||||
</span>
|
</span>
|
||||||
</SelectItem>
|
</SelectItem>
|
||||||
@@ -44,9 +45,9 @@ export function SidebarNav({ className, items, ...props }: SidebarNavProps) {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Desktop View */}
|
{/* Desktop View */}
|
||||||
<nav className={cn("hidden md:grid gap-1", className)} {...props}>
|
<nav className={cn("hidden md:grid gap-1 sticky top-6", className)} {...props}>
|
||||||
{items.map((item) => {
|
{items.map((item) => {
|
||||||
if (item.admin && !isAdmin()) {
|
if ((item.admin && !isAdmin()) || (item.noReadOnly && isReadOnlyUser())) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
@@ -59,7 +60,7 @@ export function SidebarNav({ className, items, ...props }: SidebarNavProps) {
|
|||||||
page?.path === item.href ? "bg-muted hover:bg-muted" : "hover:bg-muted/50"
|
page?.path === item.href ? "bg-muted hover:bg-muted" : "hover:bg-muted/50"
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
{item.icon && <item.icon className="h-4 w-4 shrink-0" />}
|
{item.icon && <item.icon className="size-4 shrink-0" />}
|
||||||
<span className="truncate">{item.title}</span>
|
<span className="truncate">{item.title}</span>
|
||||||
</Link>
|
</Link>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Trans } from "@lingui/react/macro"
|
import { Trans, useLingui } from "@lingui/react/macro"
|
||||||
import { t } from "@lingui/core/macro"
|
import { t } from "@lingui/core/macro"
|
||||||
import { $publicKey, pb } from "@/lib/stores"
|
import { $publicKey, pb } from "@/lib/stores"
|
||||||
import { memo, useEffect, useMemo, useState } from "react"
|
import { memo, useEffect, useMemo, useState } from "react"
|
||||||
@@ -34,21 +34,31 @@ import {
|
|||||||
InstallDropdown,
|
InstallDropdown,
|
||||||
} from "@/components/install-dropdowns"
|
} from "@/components/install-dropdowns"
|
||||||
import { AppleIcon, DockerIcon, TuxIcon, WindowsIcon } from "@/components/ui/icons"
|
import { AppleIcon, DockerIcon, TuxIcon, WindowsIcon } from "@/components/ui/icons"
|
||||||
|
import { redirectPage } from "@nanostores/router"
|
||||||
|
import { $router } from "@/components/router"
|
||||||
|
|
||||||
const pbFingerprintOptions = {
|
const pbFingerprintOptions = {
|
||||||
expand: "system",
|
expand: "system",
|
||||||
fields: "id,fingerprint,token,system,expand.system.name",
|
fields: "id,fingerprint,token,system,expand.system.name",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function sortFingerprints(fingerprints: FingerprintRecord[]) {
|
||||||
|
return fingerprints.sort((a, b) => a.expand.system.name.localeCompare(b.expand.system.name))
|
||||||
|
}
|
||||||
|
|
||||||
const SettingsFingerprintsPage = memo(() => {
|
const SettingsFingerprintsPage = memo(() => {
|
||||||
|
if (isReadOnlyUser()) {
|
||||||
|
redirectPage($router, "settings", { name: "general" })
|
||||||
|
}
|
||||||
const [fingerprints, setFingerprints] = useState<FingerprintRecord[]>([])
|
const [fingerprints, setFingerprints] = useState<FingerprintRecord[]>([])
|
||||||
|
|
||||||
// Get fingerprint records on mount
|
// Get fingerprint records on mount
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
pb.collection("fingerprints")
|
pb.collection("fingerprints")
|
||||||
.getFullList(pbFingerprintOptions)
|
.getFullList<FingerprintRecord>(pbFingerprintOptions)
|
||||||
// @ts-ignore
|
.then((prints) => {
|
||||||
.then(setFingerprints)
|
setFingerprints(sortFingerprints(prints))
|
||||||
|
})
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
// Subscribe to fingerprint updates
|
// Subscribe to fingerprint updates
|
||||||
@@ -61,7 +71,7 @@ const SettingsFingerprintsPage = memo(() => {
|
|||||||
(res) => {
|
(res) => {
|
||||||
setFingerprints((currentFingerprints) => {
|
setFingerprints((currentFingerprints) => {
|
||||||
if (res.action === "create") {
|
if (res.action === "create") {
|
||||||
return [...currentFingerprints, res.record as FingerprintRecord]
|
return sortFingerprints([...currentFingerprints, res.record as FingerprintRecord])
|
||||||
}
|
}
|
||||||
if (res.action === "update") {
|
if (res.action === "update") {
|
||||||
return currentFingerprints.map((fingerprint) => {
|
return currentFingerprints.map((fingerprint) => {
|
||||||
@@ -154,7 +164,7 @@ const SectionUniversalToken = memo(() => {
|
|||||||
or on hub restart.
|
or on hub restart.
|
||||||
</Trans>
|
</Trans>
|
||||||
</p>
|
</p>
|
||||||
<div className="min-h-16 overflow-auto max-w-full inline-flex items-center gap-5 mt-3 border py-2 pl-5 pr-4 rounded-md">
|
<div className="min-h-16 overflow-auto max-w-full inline-flex items-center gap-5 mt-3 border py-2 ps-5 pe-4 rounded-md">
|
||||||
{!isLoading && (
|
{!isLoading && (
|
||||||
<>
|
<>
|
||||||
<Switch
|
<Switch
|
||||||
@@ -180,32 +190,33 @@ const SectionUniversalToken = memo(() => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
const ActionsButtonUniversalToken = memo(({ token, checked }: { token: string; checked: boolean }) => {
|
const ActionsButtonUniversalToken = memo(({ token, checked }: { token: string; checked: boolean }) => {
|
||||||
|
const { t } = useLingui()
|
||||||
const publicKey = $publicKey.get()
|
const publicKey = $publicKey.get()
|
||||||
const port = "45876"
|
const port = "45876"
|
||||||
|
|
||||||
const dropdownItems: DropdownItem[] = [
|
const dropdownItems: DropdownItem[] = [
|
||||||
{
|
{
|
||||||
text: "Copy Docker Compose",
|
text: t({ message: "Copy docker compose", context: "Button to copy docker compose file content" }),
|
||||||
onClick: () => copyDockerCompose(port, publicKey, token),
|
onClick: () => copyDockerCompose(port, publicKey, token),
|
||||||
icons: [DockerIcon],
|
icons: [DockerIcon],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: "Copy Docker Run",
|
text: t({ message: "Copy docker run", context: "Button to copy docker run command" }),
|
||||||
onClick: () => copyDockerRun(port, publicKey, token),
|
onClick: () => copyDockerRun(port, publicKey, token),
|
||||||
icons: [DockerIcon],
|
icons: [DockerIcon],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: "Copy Linux Command",
|
text: t`Copy Linux command`,
|
||||||
onClick: () => copyLinuxCommand(port, publicKey, token),
|
onClick: () => copyLinuxCommand(port, publicKey, token),
|
||||||
icons: [TuxIcon],
|
icons: [TuxIcon],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: "Copy Brew Command",
|
text: t({ message: "Homebrew command", context: "Button to copy install command" }),
|
||||||
onClick: () => copyLinuxCommand(port, publicKey, token, true),
|
onClick: () => copyLinuxCommand(port, publicKey, token, true),
|
||||||
icons: [TuxIcon, AppleIcon],
|
icons: [TuxIcon, AppleIcon],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: "Copy Windows Command",
|
text: t({ message: "Windows command", context: "Button to copy install command" }),
|
||||||
onClick: () => copyWindowsCommand(port, publicKey, token),
|
onClick: () => copyWindowsCommand(port, publicKey, token),
|
||||||
icons: [WindowsIcon],
|
icons: [WindowsIcon],
|
||||||
},
|
},
|
||||||
@@ -233,26 +244,28 @@ const ActionsButtonUniversalToken = memo(({ token, checked }: { token: string; c
|
|||||||
})
|
})
|
||||||
|
|
||||||
const SectionTable = memo(({ fingerprints = [] }: { fingerprints: FingerprintRecord[] }) => {
|
const SectionTable = memo(({ fingerprints = [] }: { fingerprints: FingerprintRecord[] }) => {
|
||||||
|
const { t } = useLingui()
|
||||||
const isReadOnly = isReadOnlyUser()
|
const isReadOnly = isReadOnlyUser()
|
||||||
|
|
||||||
const headerCols = useMemo(
|
const headerCols = useMemo(
|
||||||
() => [
|
() => [
|
||||||
{
|
{
|
||||||
label: "System",
|
label: t`System`,
|
||||||
Icon: ServerIcon,
|
Icon: ServerIcon,
|
||||||
w: "11em",
|
w: "11em",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Token",
|
label: t`Token`,
|
||||||
Icon: KeyIcon,
|
Icon: KeyIcon,
|
||||||
w: "20em",
|
w: "20em",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Fingerprint",
|
label: t`Fingerprint`,
|
||||||
Icon: FingerprintIcon,
|
Icon: FingerprintIcon,
|
||||||
w: "20em",
|
w: "20em",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
[]
|
[t]
|
||||||
)
|
)
|
||||||
return (
|
return (
|
||||||
<div className="rounded-md border overflow-hidden w-full mt-4">
|
<div className="rounded-md border overflow-hidden w-full mt-4">
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import {
|
|||||||
$temperatureFilter,
|
$temperatureFilter,
|
||||||
} from "@/lib/stores"
|
} from "@/lib/stores"
|
||||||
import { ChartData, ChartTimes, ContainerStatsRecord, GPUData, SystemRecord, SystemStatsRecord } from "@/types"
|
import { ChartData, ChartTimes, ContainerStatsRecord, GPUData, SystemRecord, SystemStatsRecord } from "@/types"
|
||||||
import { ChartType, Os } from "@/lib/enums"
|
import { ChartType, Unit, Os } from "@/lib/enums"
|
||||||
import React, { lazy, memo, useCallback, useEffect, useMemo, useRef, useState } from "react"
|
import React, { lazy, memo, useCallback, useEffect, useMemo, useRef, useState } from "react"
|
||||||
import { Card, CardHeader, CardTitle, CardDescription } from "../ui/card"
|
import { Card, CardHeader, CardTitle, CardDescription } from "../ui/card"
|
||||||
import { useStore } from "@nanostores/react"
|
import { useStore } from "@nanostores/react"
|
||||||
@@ -21,10 +21,12 @@ import ChartTimeSelect from "../charts/chart-time-select"
|
|||||||
import {
|
import {
|
||||||
chartTimeData,
|
chartTimeData,
|
||||||
cn,
|
cn,
|
||||||
|
decimalString,
|
||||||
|
formatBytes,
|
||||||
getHostDisplayValue,
|
getHostDisplayValue,
|
||||||
getPbTimestamp,
|
getPbTimestamp,
|
||||||
getSizeAndUnit,
|
|
||||||
listen,
|
listen,
|
||||||
|
parseSemVer,
|
||||||
toFixedFloat,
|
toFixedFloat,
|
||||||
useLocalStorage,
|
useLocalStorage,
|
||||||
} from "@/lib/utils"
|
} from "@/lib/utils"
|
||||||
@@ -47,6 +49,7 @@ const DiskChart = lazy(() => import("../charts/disk-chart"))
|
|||||||
const SwapChart = lazy(() => import("../charts/swap-chart"))
|
const SwapChart = lazy(() => import("../charts/swap-chart"))
|
||||||
const TemperatureChart = lazy(() => import("../charts/temperature-chart"))
|
const TemperatureChart = lazy(() => import("../charts/temperature-chart"))
|
||||||
const GpuPowerChart = lazy(() => import("../charts/gpu-power-chart"))
|
const GpuPowerChart = lazy(() => import("../charts/gpu-power-chart"))
|
||||||
|
const LoadAverageChart = lazy(() => import("../charts/load-average-chart"))
|
||||||
|
|
||||||
const cache = new Map<string, any>()
|
const cache = new Map<string, any>()
|
||||||
|
|
||||||
@@ -131,6 +134,7 @@ export default function SystemDetail({ name }: { name: string }) {
|
|||||||
const [bottomSpacing, setBottomSpacing] = useState(0)
|
const [bottomSpacing, setBottomSpacing] = useState(0)
|
||||||
const [chartLoading, setChartLoading] = useState(true)
|
const [chartLoading, setChartLoading] = useState(true)
|
||||||
const isLongerChart = chartTime !== "1h"
|
const isLongerChart = chartTime !== "1h"
|
||||||
|
const userSettings = $userSettings.get()
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
document.title = `${name} / Beszel`
|
document.title = `${name} / Beszel`
|
||||||
@@ -188,6 +192,7 @@ export default function SystemDetail({ name }: { name: string }) {
|
|||||||
chartTime,
|
chartTime,
|
||||||
orientation: direction === "rtl" ? "right" : "left",
|
orientation: direction === "rtl" ? "right" : "left",
|
||||||
...getTimeData(chartTime, lastCreated),
|
...getTimeData(chartTime, lastCreated),
|
||||||
|
agentVersion: parseSemVer(system?.info?.v),
|
||||||
}
|
}
|
||||||
}, [systemStats, containerData, direction])
|
}, [systemStats, containerData, direction])
|
||||||
|
|
||||||
@@ -368,6 +373,7 @@ export default function SystemDetail({ name }: { name: string }) {
|
|||||||
|
|
||||||
// select field for switching between avg and max values
|
// select field for switching between avg and max values
|
||||||
const maxValSelect = isLongerChart ? <SelectAvgMax max={maxValues} /> : null
|
const maxValSelect = isLongerChart ? <SelectAvgMax max={maxValues} /> : null
|
||||||
|
const showMax = chartTime !== "1h" && maxValues
|
||||||
|
|
||||||
// if no data, show empty message
|
// if no data, show empty message
|
||||||
const dataEmpty = !chartLoading && chartData.systemStats.length === 0
|
const dataEmpty = !chartLoading && chartData.systemStats.length === 0
|
||||||
@@ -472,7 +478,20 @@ export default function SystemDetail({ name }: { name: string }) {
|
|||||||
description={t`Average system-wide CPU utilization`}
|
description={t`Average system-wide CPU utilization`}
|
||||||
cornerEl={maxValSelect}
|
cornerEl={maxValSelect}
|
||||||
>
|
>
|
||||||
<AreaChartDefault chartData={chartData} chartName="CPU Usage" maxToggled={maxValues} unit="%" />
|
<AreaChartDefault
|
||||||
|
chartData={chartData}
|
||||||
|
maxToggled={maxValues}
|
||||||
|
dataPoints={[
|
||||||
|
{
|
||||||
|
label: t`CPU Usage`,
|
||||||
|
dataKey: ({ stats }) => (showMax ? stats?.cpum : stats?.cpu),
|
||||||
|
color: "1",
|
||||||
|
opacity: 0.4,
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
tickFormatter={(val) => toFixedFloat(val, 2) + "%"}
|
||||||
|
contentFormatter={({ value }) => decimalString(value) + "%"}
|
||||||
|
/>
|
||||||
</ChartCard>
|
</ChartCard>
|
||||||
|
|
||||||
{containerFilterBar && (
|
{containerFilterBar && (
|
||||||
@@ -519,7 +538,32 @@ export default function SystemDetail({ name }: { name: string }) {
|
|||||||
description={t`Throughput of root filesystem`}
|
description={t`Throughput of root filesystem`}
|
||||||
cornerEl={maxValSelect}
|
cornerEl={maxValSelect}
|
||||||
>
|
>
|
||||||
<AreaChartDefault chartData={chartData} chartName="dio" maxToggled={maxValues} />
|
<AreaChartDefault
|
||||||
|
chartData={chartData}
|
||||||
|
maxToggled={maxValues}
|
||||||
|
dataPoints={[
|
||||||
|
{
|
||||||
|
label: t({ message: "Write", comment: "Disk write" }),
|
||||||
|
dataKey: ({ stats }) => (showMax ? stats?.dwm : stats?.dw),
|
||||||
|
color: "3",
|
||||||
|
opacity: 0.3,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t({ message: "Read", comment: "Disk read" }),
|
||||||
|
dataKey: ({ stats }) => (showMax ? stats?.drm : stats?.dr),
|
||||||
|
color: "1",
|
||||||
|
opacity: 0.3,
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
tickFormatter={(val) => {
|
||||||
|
const { value, unit } = formatBytes(val, true, userSettings.unitDisk, true)
|
||||||
|
return toFixedFloat(value, value >= 10 ? 0 : 1) + " " + unit
|
||||||
|
}}
|
||||||
|
contentFormatter={({ value }) => {
|
||||||
|
const { value: convertedValue, unit } = formatBytes(value, true, userSettings.unitDisk, true)
|
||||||
|
return decimalString(convertedValue, convertedValue >= 100 ? 1 : 2) + " " + unit
|
||||||
|
}}
|
||||||
|
/>
|
||||||
</ChartCard>
|
</ChartCard>
|
||||||
|
|
||||||
<ChartCard
|
<ChartCard
|
||||||
@@ -529,7 +573,43 @@ export default function SystemDetail({ name }: { name: string }) {
|
|||||||
cornerEl={maxValSelect}
|
cornerEl={maxValSelect}
|
||||||
description={t`Network traffic of public interfaces`}
|
description={t`Network traffic of public interfaces`}
|
||||||
>
|
>
|
||||||
<AreaChartDefault chartData={chartData} chartName="bw" maxToggled={maxValues} />
|
<AreaChartDefault
|
||||||
|
chartData={chartData}
|
||||||
|
maxToggled={maxValues}
|
||||||
|
dataPoints={[
|
||||||
|
{
|
||||||
|
label: t`Sent`,
|
||||||
|
// use bytes if available, otherwise multiply old MB (can remove in future)
|
||||||
|
dataKey(data) {
|
||||||
|
if (showMax) {
|
||||||
|
return data?.stats?.bm?.[0] ?? (data?.stats?.nsm ?? 0) * 1024 * 1024
|
||||||
|
}
|
||||||
|
return data?.stats?.b?.[0] ?? data?.stats?.ns * 1024 * 1024
|
||||||
|
},
|
||||||
|
color: "5",
|
||||||
|
opacity: 0.2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t`Received`,
|
||||||
|
dataKey(data) {
|
||||||
|
if (showMax) {
|
||||||
|
return data?.stats?.bm?.[1] ?? (data?.stats?.nrm ?? 0) * 1024 * 1024
|
||||||
|
}
|
||||||
|
return data?.stats?.b?.[1] ?? data?.stats?.nr * 1024 * 1024
|
||||||
|
},
|
||||||
|
color: "2",
|
||||||
|
opacity: 0.2,
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
tickFormatter={(val) => {
|
||||||
|
let { value, unit } = formatBytes(val, true, userSettings.unitNet, false)
|
||||||
|
return toFixedFloat(value, value >= 10 ? 0 : 1) + " " + unit
|
||||||
|
}}
|
||||||
|
contentFormatter={(data) => {
|
||||||
|
const { value, unit } = formatBytes(data.value, true, userSettings.unitNet, false)
|
||||||
|
return decimalString(value, value >= 100 ? 1 : 2) + " " + unit
|
||||||
|
}}
|
||||||
|
/>
|
||||||
</ChartCard>
|
</ChartCard>
|
||||||
|
|
||||||
{containerFilterBar && containerData.length > 0 && (
|
{containerFilterBar && containerData.length > 0 && (
|
||||||
@@ -563,6 +643,18 @@ export default function SystemDetail({ name }: { name: string }) {
|
|||||||
</ChartCard>
|
</ChartCard>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{/* Load Average chart */}
|
||||||
|
{chartData.agentVersion?.minor >= 12 && (
|
||||||
|
<ChartCard
|
||||||
|
empty={dataEmpty}
|
||||||
|
grid={grid}
|
||||||
|
title={t`Load Average`}
|
||||||
|
description={t`System load averages over time`}
|
||||||
|
>
|
||||||
|
<LoadAverageChart chartData={chartData} />
|
||||||
|
</ChartCard>
|
||||||
|
)}
|
||||||
|
|
||||||
{/* Temperature chart */}
|
{/* Temperature chart */}
|
||||||
{systemStats.at(-1)?.stats.t && (
|
{systemStats.at(-1)?.stats.t && (
|
||||||
<ChartCard
|
<ChartCard
|
||||||
@@ -594,10 +686,6 @@ export default function SystemDetail({ name }: { name: string }) {
|
|||||||
<div className="grid xl:grid-cols-2 gap-4">
|
<div className="grid xl:grid-cols-2 gap-4">
|
||||||
{Object.keys(systemStats.at(-1)?.stats.g ?? {}).map((id) => {
|
{Object.keys(systemStats.at(-1)?.stats.g ?? {}).map((id) => {
|
||||||
const gpu = systemStats.at(-1)?.stats.g?.[id] as GPUData
|
const gpu = systemStats.at(-1)?.stats.g?.[id] as GPUData
|
||||||
const sizeFormatter = (value: number, decimals?: number) => {
|
|
||||||
const { v, u } = getSizeAndUnit(value, false)
|
|
||||||
return toFixedFloat(v, decimals || 1) + u
|
|
||||||
}
|
|
||||||
return (
|
return (
|
||||||
<div key={id} className="contents">
|
<div key={id} className="contents">
|
||||||
<ChartCard
|
<ChartCard
|
||||||
@@ -606,7 +694,19 @@ export default function SystemDetail({ name }: { name: string }) {
|
|||||||
title={`${gpu.n} ${t`Usage`}`}
|
title={`${gpu.n} ${t`Usage`}`}
|
||||||
description={t`Average utilization of ${gpu.n}`}
|
description={t`Average utilization of ${gpu.n}`}
|
||||||
>
|
>
|
||||||
<AreaChartDefault chartData={chartData} chartName={`g.${id}.u`} unit="%" />
|
<AreaChartDefault
|
||||||
|
chartData={chartData}
|
||||||
|
dataPoints={[
|
||||||
|
{
|
||||||
|
label: t`Usage`,
|
||||||
|
dataKey: ({ stats }) => stats?.g?.[id]?.u ?? 0,
|
||||||
|
color: "1",
|
||||||
|
opacity: 0.35,
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
tickFormatter={(val) => toFixedFloat(val, 2) + "%"}
|
||||||
|
contentFormatter={({ value }) => decimalString(value) + "%"}
|
||||||
|
/>
|
||||||
</ChartCard>
|
</ChartCard>
|
||||||
<ChartCard
|
<ChartCard
|
||||||
empty={dataEmpty}
|
empty={dataEmpty}
|
||||||
@@ -616,10 +716,23 @@ export default function SystemDetail({ name }: { name: string }) {
|
|||||||
>
|
>
|
||||||
<AreaChartDefault
|
<AreaChartDefault
|
||||||
chartData={chartData}
|
chartData={chartData}
|
||||||
chartName={`g.${id}.mu`}
|
dataPoints={[
|
||||||
|
{
|
||||||
|
label: t`Usage`,
|
||||||
|
dataKey: ({ stats }) => stats?.g?.[id]?.mu ?? 0,
|
||||||
|
color: "2",
|
||||||
|
opacity: 0.25,
|
||||||
|
},
|
||||||
|
]}
|
||||||
max={gpu.mt}
|
max={gpu.mt}
|
||||||
tickFormatter={sizeFormatter}
|
tickFormatter={(val) => {
|
||||||
contentFormatter={(value) => sizeFormatter(value, 2)}
|
const { value, unit } = formatBytes(val, false, Unit.Bytes, true)
|
||||||
|
return toFixedFloat(value, value >= 10 ? 0 : 1) + " " + unit
|
||||||
|
}}
|
||||||
|
contentFormatter={({ value }) => {
|
||||||
|
const { value: convertedValue, unit } = formatBytes(value, false, Unit.Bytes, true)
|
||||||
|
return decimalString(convertedValue) + " " + unit
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</ChartCard>
|
</ChartCard>
|
||||||
</div>
|
</div>
|
||||||
@@ -653,7 +766,32 @@ export default function SystemDetail({ name }: { name: string }) {
|
|||||||
description={t`Throughput of ${extraFsName}`}
|
description={t`Throughput of ${extraFsName}`}
|
||||||
cornerEl={maxValSelect}
|
cornerEl={maxValSelect}
|
||||||
>
|
>
|
||||||
<AreaChartDefault chartData={chartData} chartName={`efs.${extraFsName}`} maxToggled={maxValues} />
|
<AreaChartDefault
|
||||||
|
chartData={chartData}
|
||||||
|
dataPoints={[
|
||||||
|
{
|
||||||
|
label: t`Write`,
|
||||||
|
dataKey: ({ stats }) => stats?.efs?.[extraFsName]?.[showMax ? "wm" : "w"] ?? 0,
|
||||||
|
color: "3",
|
||||||
|
opacity: 0.3,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t`Read`,
|
||||||
|
dataKey: ({ stats }) => stats?.efs?.[extraFsName]?.[showMax ? "rm" : "r"] ?? 0,
|
||||||
|
color: "1",
|
||||||
|
opacity: 0.3,
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
maxToggled={maxValues}
|
||||||
|
tickFormatter={(val) => {
|
||||||
|
const { value, unit } = formatBytes(val, true, userSettings.unitDisk, true)
|
||||||
|
return toFixedFloat(value, value >= 10 ? 0 : 1) + " " + unit
|
||||||
|
}}
|
||||||
|
contentFormatter={({ value }) => {
|
||||||
|
const { value: convertedValue, unit } = formatBytes(value, true, userSettings.unitDisk, true)
|
||||||
|
return decimalString(convertedValue, convertedValue >= 100 ? 1 : 2) + " " + unit
|
||||||
|
}}
|
||||||
|
/>
|
||||||
</ChartCard>
|
</ChartCard>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -0,0 +1,425 @@
|
|||||||
|
import { SystemRecord } from "@/types"
|
||||||
|
import { CellContext, ColumnDef, HeaderContext } from "@tanstack/react-table"
|
||||||
|
import { ClassValue } from "clsx"
|
||||||
|
import {
|
||||||
|
ArrowUpDownIcon,
|
||||||
|
CopyIcon,
|
||||||
|
CpuIcon,
|
||||||
|
HardDriveIcon,
|
||||||
|
MemoryStickIcon,
|
||||||
|
MoreHorizontalIcon,
|
||||||
|
PauseCircleIcon,
|
||||||
|
PenBoxIcon,
|
||||||
|
PlayCircleIcon,
|
||||||
|
ServerIcon,
|
||||||
|
Trash2Icon,
|
||||||
|
WifiIcon,
|
||||||
|
} from "lucide-react"
|
||||||
|
import { Button } from "../ui/button"
|
||||||
|
import {
|
||||||
|
cn,
|
||||||
|
copyToClipboard,
|
||||||
|
decimalString,
|
||||||
|
formatBytes,
|
||||||
|
formatTemperature,
|
||||||
|
getMeterState,
|
||||||
|
isReadOnlyUser,
|
||||||
|
parseSemVer,
|
||||||
|
} from "@/lib/utils"
|
||||||
|
import { EthernetIcon, GpuIcon, HourglassIcon, ThermometerIcon } from "../ui/icons"
|
||||||
|
import { useStore } from "@nanostores/react"
|
||||||
|
import { $userSettings, pb } from "@/lib/stores"
|
||||||
|
import { Trans, useLingui } from "@lingui/react/macro"
|
||||||
|
import { useMemo, useRef, useState } from "react"
|
||||||
|
import { memo } from "react"
|
||||||
|
import {
|
||||||
|
DropdownMenu,
|
||||||
|
DropdownMenuContent,
|
||||||
|
DropdownMenuItem,
|
||||||
|
DropdownMenuSeparator,
|
||||||
|
DropdownMenuTrigger,
|
||||||
|
} from "../ui/dropdown-menu"
|
||||||
|
import AlertButton from "../alerts/alert-button"
|
||||||
|
import { Dialog } from "../ui/dialog"
|
||||||
|
import { SystemDialog } from "../add-system"
|
||||||
|
import { AlertDialog } from "../ui/alert-dialog"
|
||||||
|
import {
|
||||||
|
AlertDialogAction,
|
||||||
|
AlertDialogCancel,
|
||||||
|
AlertDialogContent,
|
||||||
|
AlertDialogDescription,
|
||||||
|
AlertDialogFooter,
|
||||||
|
AlertDialogHeader,
|
||||||
|
AlertDialogTitle,
|
||||||
|
} from "../ui/alert-dialog"
|
||||||
|
import { buttonVariants } from "../ui/button"
|
||||||
|
import { t } from "@lingui/core/macro"
|
||||||
|
import { MeterState } from "@/lib/enums"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param viewMode - "table" or "grid"
|
||||||
|
* @returns - Column definitions for the systems table
|
||||||
|
*/
|
||||||
|
export default function SystemsTableColumns(viewMode: "table" | "grid"): ColumnDef<SystemRecord>[] {
|
||||||
|
const statusTranslations = {
|
||||||
|
up: () => t`Up`.toLowerCase(),
|
||||||
|
down: () => t`Down`.toLowerCase(),
|
||||||
|
paused: () => t`Paused`.toLowerCase(),
|
||||||
|
}
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
size: 200,
|
||||||
|
minSize: 0,
|
||||||
|
accessorKey: "name",
|
||||||
|
id: "system",
|
||||||
|
name: () => t`System`,
|
||||||
|
filterFn: (row, _, filterVal) => {
|
||||||
|
const filterLower = filterVal.toLowerCase()
|
||||||
|
const { name, status } = row.original
|
||||||
|
// Check if the filter matches the name or status for this row
|
||||||
|
if (
|
||||||
|
name.toLowerCase().includes(filterLower) ||
|
||||||
|
statusTranslations[status as keyof typeof statusTranslations]?.().includes(filterLower)
|
||||||
|
) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
},
|
||||||
|
enableHiding: false,
|
||||||
|
invertSorting: false,
|
||||||
|
Icon: ServerIcon,
|
||||||
|
cell: (info) => (
|
||||||
|
<span className="flex gap-2 items-center font-medium text-sm text-nowrap md:ps-1 md:pe-5">
|
||||||
|
<IndicatorDot system={info.row.original} />
|
||||||
|
{info.getValue() as string}
|
||||||
|
</span>
|
||||||
|
),
|
||||||
|
header: sortableHeader,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorFn: ({ info }) => info.cpu,
|
||||||
|
id: "cpu",
|
||||||
|
name: () => t`CPU`,
|
||||||
|
cell: TableCellWithMeter,
|
||||||
|
Icon: CpuIcon,
|
||||||
|
header: sortableHeader,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// accessorKey: "info.mp",
|
||||||
|
accessorFn: ({ info }) => info.mp,
|
||||||
|
id: "memory",
|
||||||
|
name: () => t`Memory`,
|
||||||
|
cell: TableCellWithMeter,
|
||||||
|
Icon: MemoryStickIcon,
|
||||||
|
header: sortableHeader,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorFn: ({ info }) => info.dp,
|
||||||
|
id: "disk",
|
||||||
|
name: () => t`Disk`,
|
||||||
|
cell: TableCellWithMeter,
|
||||||
|
Icon: HardDriveIcon,
|
||||||
|
header: sortableHeader,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorFn: ({ info }) => info.g,
|
||||||
|
id: "gpu",
|
||||||
|
name: () => "GPU",
|
||||||
|
cell: TableCellWithMeter,
|
||||||
|
Icon: GpuIcon,
|
||||||
|
header: sortableHeader,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "loadAverage",
|
||||||
|
accessorFn: ({ info }) => {
|
||||||
|
const sum = info.la?.reduce((acc, curr) => acc + curr, 0)
|
||||||
|
// TODO: remove this in future release in favor of la array
|
||||||
|
if (!sum) {
|
||||||
|
return (info.l1 ?? 0) + (info.l5 ?? 0) + (info.l15 ?? 0)
|
||||||
|
}
|
||||||
|
return sum
|
||||||
|
},
|
||||||
|
name: () => t({ message: "Load Avg", comment: "Short label for load average" }),
|
||||||
|
size: 0,
|
||||||
|
Icon: HourglassIcon,
|
||||||
|
header: sortableHeader,
|
||||||
|
cell(info: CellContext<SystemRecord, unknown>) {
|
||||||
|
const { info: sysInfo, status } = info.row.original
|
||||||
|
// agent version
|
||||||
|
const { minor, patch } = parseSemVer(sysInfo.v)
|
||||||
|
let loadAverages = sysInfo.la
|
||||||
|
|
||||||
|
// use legacy load averages if agent version is less than 12.1.0
|
||||||
|
if (!loadAverages || (minor === 12 && patch < 1)) {
|
||||||
|
loadAverages = [sysInfo.l1 ?? 0, sysInfo.l5 ?? 0, sysInfo.l15 ?? 0]
|
||||||
|
}
|
||||||
|
|
||||||
|
const max = Math.max(...loadAverages)
|
||||||
|
if (max === 0 && (status === "paused" || minor < 12)) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
const normalizedLoad = max / (sysInfo.t ?? 1)
|
||||||
|
const threshold = getMeterState(normalizedLoad * 100)
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="flex items-center gap-[.35em] w-full tabular-nums tracking-tight">
|
||||||
|
<span
|
||||||
|
className={cn("inline-block size-2 rounded-full me-0.5", {
|
||||||
|
"bg-green-500": threshold === MeterState.Good,
|
||||||
|
"bg-yellow-500": threshold === MeterState.Warn,
|
||||||
|
"bg-red-600": threshold === MeterState.Crit,
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
{loadAverages?.map((la, i) => (
|
||||||
|
<span key={i}>{decimalString(la, la >= 10 ? 1 : 2)}</span>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorFn: ({ info }) => info.bb || (info.b || 0) * 1024 * 1024,
|
||||||
|
id: "net",
|
||||||
|
name: () => t`Net`,
|
||||||
|
size: 0,
|
||||||
|
Icon: EthernetIcon,
|
||||||
|
header: sortableHeader,
|
||||||
|
cell(info) {
|
||||||
|
const sys = info.row.original
|
||||||
|
if (sys.status === "paused") {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
const userSettings = useStore($userSettings)
|
||||||
|
const { value, unit } = formatBytes(info.getValue() as number, true, userSettings.unitNet, false)
|
||||||
|
return (
|
||||||
|
<span className="tabular-nums whitespace-nowrap">
|
||||||
|
{decimalString(value, value >= 100 ? 1 : 2)} {unit}
|
||||||
|
</span>
|
||||||
|
)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorFn: ({ info }) => info.dt,
|
||||||
|
id: "temp",
|
||||||
|
name: () => t({ message: "Temp", comment: "Temperature label in systems table" }),
|
||||||
|
size: 50,
|
||||||
|
hideSort: true,
|
||||||
|
Icon: ThermometerIcon,
|
||||||
|
header: sortableHeader,
|
||||||
|
cell(info) {
|
||||||
|
const val = info.getValue() as number
|
||||||
|
if (!val) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
const userSettings = useStore($userSettings)
|
||||||
|
const { value, unit } = formatTemperature(val, userSettings.unitTemp)
|
||||||
|
return (
|
||||||
|
<span className={cn("tabular-nums whitespace-nowrap", viewMode === "table" && "ps-0.5")}>
|
||||||
|
{decimalString(value, value >= 100 ? 1 : 2)} {unit}
|
||||||
|
</span>
|
||||||
|
)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorFn: ({ info }) => info.v,
|
||||||
|
id: "agent",
|
||||||
|
name: () => t`Agent`,
|
||||||
|
// invertSorting: true,
|
||||||
|
size: 50,
|
||||||
|
Icon: WifiIcon,
|
||||||
|
hideSort: true,
|
||||||
|
header: sortableHeader,
|
||||||
|
cell(info) {
|
||||||
|
const version = info.getValue() as string
|
||||||
|
if (!version) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
const system = info.row.original
|
||||||
|
return (
|
||||||
|
<span className={cn("flex gap-2 items-center md:pe-5 tabular-nums", viewMode === "table" && "ps-0.5")}>
|
||||||
|
<IndicatorDot
|
||||||
|
system={system}
|
||||||
|
className={
|
||||||
|
(system.status !== "up" && "bg-primary/30") ||
|
||||||
|
(version === globalThis.BESZEL.HUB_VERSION && "bg-green-500") ||
|
||||||
|
"bg-yellow-500"
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
<span className="truncate max-w-14">{info.getValue() as string}</span>
|
||||||
|
</span>
|
||||||
|
)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "actions",
|
||||||
|
// @ts-ignore
|
||||||
|
name: () => t({ message: "Actions", comment: "Table column" }),
|
||||||
|
size: 50,
|
||||||
|
cell: ({ row }) => (
|
||||||
|
<div className="flex justify-end items-center gap-1 -ms-3">
|
||||||
|
<AlertButton system={row.original} />
|
||||||
|
<ActionsButton system={row.original} />
|
||||||
|
</div>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
] as ColumnDef<SystemRecord>[]
|
||||||
|
}
|
||||||
|
|
||||||
|
function sortableHeader(context: HeaderContext<SystemRecord, unknown>) {
|
||||||
|
const { column } = context
|
||||||
|
// @ts-ignore
|
||||||
|
const { Icon, hideSort, name }: { Icon: React.ElementType; name: () => string; hideSort: boolean } = column.columnDef
|
||||||
|
return (
|
||||||
|
<Button
|
||||||
|
variant="ghost"
|
||||||
|
className="h-9 px-3 flex"
|
||||||
|
onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}
|
||||||
|
>
|
||||||
|
{Icon && <Icon className="me-2 size-4" />}
|
||||||
|
{name()}
|
||||||
|
{hideSort || <ArrowUpDownIcon className="ms-2 size-4" />}
|
||||||
|
</Button>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function TableCellWithMeter(info: CellContext<SystemRecord, unknown>) {
|
||||||
|
const val = Number(info.getValue()) || 0
|
||||||
|
const threshold = getMeterState(val)
|
||||||
|
return (
|
||||||
|
<div className="flex gap-2 items-center tabular-nums tracking-tight">
|
||||||
|
<span className="min-w-8">{decimalString(val, val >= 10 ? 1 : 2)}%</span>
|
||||||
|
<span className="grow min-w-8 block bg-muted h-[1em] relative rounded-sm overflow-hidden">
|
||||||
|
<span
|
||||||
|
className={cn(
|
||||||
|
"absolute inset-0 w-full h-full origin-left",
|
||||||
|
(info.row.original.status !== "up" && "bg-primary/30") ||
|
||||||
|
(threshold === MeterState.Good && "bg-green-500") ||
|
||||||
|
(threshold === MeterState.Warn && "bg-yellow-500") ||
|
||||||
|
"bg-red-600"
|
||||||
|
)}
|
||||||
|
style={{
|
||||||
|
transform: `scalex(${val / 100})`,
|
||||||
|
}}
|
||||||
|
></span>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function IndicatorDot({ system, className }: { system: SystemRecord; className?: ClassValue }) {
|
||||||
|
className ||= {
|
||||||
|
"bg-green-500": system.status === "up",
|
||||||
|
"bg-red-500": system.status === "down",
|
||||||
|
"bg-primary/40": system.status === "paused",
|
||||||
|
"bg-yellow-500": system.status === "pending",
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<span
|
||||||
|
className={cn("flex-shrink-0 size-2 rounded-full", className)}
|
||||||
|
// style={{ marginBottom: "-1px" }}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const ActionsButton = memo(({ system }: { system: SystemRecord }) => {
|
||||||
|
const [deleteOpen, setDeleteOpen] = useState(false)
|
||||||
|
const [editOpen, setEditOpen] = useState(false)
|
||||||
|
let editOpened = useRef(false)
|
||||||
|
const { t } = useLingui()
|
||||||
|
const { id, status, host, name } = system
|
||||||
|
|
||||||
|
return useMemo(() => {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<DropdownMenu>
|
||||||
|
<DropdownMenuTrigger asChild>
|
||||||
|
<Button variant="ghost" size={"icon"} data-nolink>
|
||||||
|
<span className="sr-only">
|
||||||
|
<Trans>Open menu</Trans>
|
||||||
|
</span>
|
||||||
|
<MoreHorizontalIcon className="w-5" />
|
||||||
|
</Button>
|
||||||
|
</DropdownMenuTrigger>
|
||||||
|
<DropdownMenuContent align="end">
|
||||||
|
{!isReadOnlyUser() && (
|
||||||
|
<DropdownMenuItem
|
||||||
|
onSelect={() => {
|
||||||
|
editOpened.current = true
|
||||||
|
setEditOpen(true)
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<PenBoxIcon className="me-2.5 size-4" />
|
||||||
|
<Trans>Edit</Trans>
|
||||||
|
</DropdownMenuItem>
|
||||||
|
)}
|
||||||
|
<DropdownMenuItem
|
||||||
|
className={cn(isReadOnlyUser() && "hidden")}
|
||||||
|
onClick={() => {
|
||||||
|
pb.collection("systems").update(id, {
|
||||||
|
status: status === "paused" ? "pending" : "paused",
|
||||||
|
})
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{status === "paused" ? (
|
||||||
|
<>
|
||||||
|
<PlayCircleIcon className="me-2.5 size-4" />
|
||||||
|
<Trans>Resume</Trans>
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
<PauseCircleIcon className="me-2.5 size-4" />
|
||||||
|
<Trans>Pause</Trans>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</DropdownMenuItem>
|
||||||
|
<DropdownMenuItem onClick={() => copyToClipboard(name)}>
|
||||||
|
<CopyIcon className="me-2.5 size-4" />
|
||||||
|
<Trans>Copy name</Trans>
|
||||||
|
</DropdownMenuItem>
|
||||||
|
<DropdownMenuItem onClick={() => copyToClipboard(host)}>
|
||||||
|
<CopyIcon className="me-2.5 size-4" />
|
||||||
|
<Trans>Copy host</Trans>
|
||||||
|
</DropdownMenuItem>
|
||||||
|
<DropdownMenuSeparator className={cn(isReadOnlyUser() && "hidden")} />
|
||||||
|
<DropdownMenuItem className={cn(isReadOnlyUser() && "hidden")} onSelect={() => setDeleteOpen(true)}>
|
||||||
|
<Trash2Icon className="me-2.5 size-4" />
|
||||||
|
<Trans>Delete</Trans>
|
||||||
|
</DropdownMenuItem>
|
||||||
|
</DropdownMenuContent>
|
||||||
|
</DropdownMenu>
|
||||||
|
{/* edit dialog */}
|
||||||
|
<Dialog open={editOpen} onOpenChange={setEditOpen}>
|
||||||
|
{editOpened.current && <SystemDialog system={system} setOpen={setEditOpen} />}
|
||||||
|
</Dialog>
|
||||||
|
{/* deletion dialog */}
|
||||||
|
<AlertDialog open={deleteOpen} onOpenChange={(open) => setDeleteOpen(open)}>
|
||||||
|
<AlertDialogContent>
|
||||||
|
<AlertDialogHeader>
|
||||||
|
<AlertDialogTitle>
|
||||||
|
<Trans>Are you sure you want to delete {name}?</Trans>
|
||||||
|
</AlertDialogTitle>
|
||||||
|
<AlertDialogDescription>
|
||||||
|
<Trans>
|
||||||
|
This action cannot be undone. This will permanently delete all current records for {name} from the
|
||||||
|
database.
|
||||||
|
</Trans>
|
||||||
|
</AlertDialogDescription>
|
||||||
|
</AlertDialogHeader>
|
||||||
|
<AlertDialogFooter>
|
||||||
|
<AlertDialogCancel>
|
||||||
|
<Trans>Cancel</Trans>
|
||||||
|
</AlertDialogCancel>
|
||||||
|
<AlertDialogAction
|
||||||
|
className={cn(buttonVariants({ variant: "destructive" }))}
|
||||||
|
onClick={() => pb.collection("systems").delete(id)}
|
||||||
|
>
|
||||||
|
<Trans>Continue</Trans>
|
||||||
|
</AlertDialogAction>
|
||||||
|
</AlertDialogFooter>
|
||||||
|
</AlertDialogContent>
|
||||||
|
</AlertDialog>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}, [id, status, host, name, t, deleteOpen, editOpen])
|
||||||
|
})
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
import {
|
import {
|
||||||
CellContext,
|
|
||||||
ColumnDef,
|
ColumnDef,
|
||||||
ColumnFiltersState,
|
ColumnFiltersState,
|
||||||
getFilteredRowModel,
|
getFilteredRowModel,
|
||||||
@@ -9,14 +8,13 @@ import {
|
|||||||
VisibilityState,
|
VisibilityState,
|
||||||
getCoreRowModel,
|
getCoreRowModel,
|
||||||
useReactTable,
|
useReactTable,
|
||||||
HeaderContext,
|
|
||||||
Row,
|
Row,
|
||||||
Table as TableType,
|
Table as TableType,
|
||||||
} from "@tanstack/react-table"
|
} from "@tanstack/react-table"
|
||||||
|
|
||||||
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
|
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
|
||||||
|
|
||||||
import { Button, buttonVariants } from "@/components/ui/button"
|
import { Button } from "@/components/ui/button"
|
||||||
|
|
||||||
import {
|
import {
|
||||||
DropdownMenu,
|
DropdownMenu,
|
||||||
@@ -29,96 +27,30 @@ import {
|
|||||||
DropdownMenuSeparator,
|
DropdownMenuSeparator,
|
||||||
DropdownMenuTrigger,
|
DropdownMenuTrigger,
|
||||||
} from "@/components/ui/dropdown-menu"
|
} from "@/components/ui/dropdown-menu"
|
||||||
|
|
||||||
import {
|
|
||||||
AlertDialog,
|
|
||||||
AlertDialogAction,
|
|
||||||
AlertDialogCancel,
|
|
||||||
AlertDialogContent,
|
|
||||||
AlertDialogDescription,
|
|
||||||
AlertDialogFooter,
|
|
||||||
AlertDialogHeader,
|
|
||||||
AlertDialogTitle,
|
|
||||||
} from "@/components/ui/alert-dialog"
|
|
||||||
|
|
||||||
import { SystemRecord } from "@/types"
|
import { SystemRecord } from "@/types"
|
||||||
import {
|
import {
|
||||||
MoreHorizontalIcon,
|
|
||||||
ArrowUpDownIcon,
|
ArrowUpDownIcon,
|
||||||
MemoryStickIcon,
|
|
||||||
CopyIcon,
|
|
||||||
PauseCircleIcon,
|
|
||||||
PlayCircleIcon,
|
|
||||||
Trash2Icon,
|
|
||||||
WifiIcon,
|
|
||||||
HardDriveIcon,
|
|
||||||
ServerIcon,
|
|
||||||
CpuIcon,
|
|
||||||
LayoutGridIcon,
|
LayoutGridIcon,
|
||||||
LayoutListIcon,
|
LayoutListIcon,
|
||||||
ArrowDownIcon,
|
ArrowDownIcon,
|
||||||
ArrowUpIcon,
|
ArrowUpIcon,
|
||||||
Settings2Icon,
|
Settings2Icon,
|
||||||
EyeIcon,
|
EyeIcon,
|
||||||
PenBoxIcon,
|
|
||||||
} from "lucide-react"
|
} from "lucide-react"
|
||||||
import { memo, useEffect, useMemo, useRef, useState } from "react"
|
import { memo, useEffect, useMemo, useState } from "react"
|
||||||
import { $systems, pb } from "@/lib/stores"
|
import { $systems } from "@/lib/stores"
|
||||||
import { useStore } from "@nanostores/react"
|
import { useStore } from "@nanostores/react"
|
||||||
import { cn, copyToClipboard, decimalString, isReadOnlyUser, useLocalStorage } from "@/lib/utils"
|
import { cn, useLocalStorage } from "@/lib/utils"
|
||||||
import AlertsButton from "../alerts/alert-button"
|
|
||||||
import { $router, Link, navigate } from "../router"
|
import { $router, Link, navigate } from "../router"
|
||||||
import { EthernetIcon, GpuIcon, ThermometerIcon } from "../ui/icons"
|
|
||||||
import { useLingui, Trans } from "@lingui/react/macro"
|
import { useLingui, Trans } from "@lingui/react/macro"
|
||||||
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../ui/card"
|
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../ui/card"
|
||||||
import { Input } from "../ui/input"
|
import { Input } from "../ui/input"
|
||||||
import { ClassValue } from "clsx"
|
|
||||||
import { getPagePath } from "@nanostores/router"
|
import { getPagePath } from "@nanostores/router"
|
||||||
import { SystemDialog } from "../add-system"
|
import SystemsTableColumns, { ActionsButton, IndicatorDot } from "./systems-table-columns"
|
||||||
import { Dialog } from "../ui/dialog"
|
import AlertButton from "../alerts/alert-button"
|
||||||
|
|
||||||
type ViewMode = "table" | "grid"
|
type ViewMode = "table" | "grid"
|
||||||
|
|
||||||
function CellFormatter(info: CellContext<SystemRecord, unknown>) {
|
|
||||||
const val = (info.getValue() as number) || 0
|
|
||||||
return (
|
|
||||||
<div className="flex gap-2 items-center tabular-nums tracking-tight">
|
|
||||||
<span className="min-w-[3.3em]">{decimalString(val, 1)}%</span>
|
|
||||||
<span className="grow min-w-10 block bg-muted h-[1em] relative rounded-sm overflow-hidden">
|
|
||||||
<span
|
|
||||||
className={cn(
|
|
||||||
"absolute inset-0 w-full h-full origin-left",
|
|
||||||
(info.row.original.status !== "up" && "bg-primary/30") ||
|
|
||||||
(val < 65 && "bg-green-500") ||
|
|
||||||
(val < 90 && "bg-yellow-500") ||
|
|
||||||
"bg-red-600"
|
|
||||||
)}
|
|
||||||
style={{
|
|
||||||
transform: `scalex(${val / 100})`,
|
|
||||||
}}
|
|
||||||
></span>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
function sortableHeader(context: HeaderContext<SystemRecord, unknown>) {
|
|
||||||
const { column } = context
|
|
||||||
// @ts-ignore
|
|
||||||
const { Icon, hideSort, name }: { Icon: React.ElementType; name: () => string; hideSort: boolean } = column.columnDef
|
|
||||||
return (
|
|
||||||
<Button
|
|
||||||
variant="ghost"
|
|
||||||
className="h-9 px-3 flex"
|
|
||||||
onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}
|
|
||||||
>
|
|
||||||
{Icon && <Icon className="me-2 size-4" />}
|
|
||||||
{name()}
|
|
||||||
{hideSort || <ArrowUpDownIcon className="ms-2 size-4" />}
|
|
||||||
</Button>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
export default function SystemsTable() {
|
export default function SystemsTable() {
|
||||||
const data = useStore($systems)
|
const data = useStore($systems)
|
||||||
const { i18n, t } = useLingui()
|
const { i18n, t } = useLingui()
|
||||||
@@ -136,182 +68,7 @@ export default function SystemsTable() {
|
|||||||
}
|
}
|
||||||
}, [filter])
|
}, [filter])
|
||||||
|
|
||||||
const columnDefs = useMemo(() => {
|
const columnDefs = useMemo(() => SystemsTableColumns(viewMode), [])
|
||||||
const statusTranslations = {
|
|
||||||
up: () => t`Up`.toLowerCase(),
|
|
||||||
down: () => t`Down`.toLowerCase(),
|
|
||||||
paused: () => t`Paused`.toLowerCase(),
|
|
||||||
}
|
|
||||||
return [
|
|
||||||
{
|
|
||||||
// size: 200,
|
|
||||||
size: 200,
|
|
||||||
minSize: 0,
|
|
||||||
accessorKey: "name",
|
|
||||||
id: "system",
|
|
||||||
name: () => t`System`,
|
|
||||||
filterFn: (row, _, filterVal) => {
|
|
||||||
const filterLower = filterVal.toLowerCase()
|
|
||||||
const { name, status } = row.original
|
|
||||||
// Check if the filter matches the name or status for this row
|
|
||||||
if (
|
|
||||||
name.toLowerCase().includes(filterLower) ||
|
|
||||||
statusTranslations[status as keyof typeof statusTranslations]?.().includes(filterLower)
|
|
||||||
) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
},
|
|
||||||
enableHiding: false,
|
|
||||||
Icon: ServerIcon,
|
|
||||||
cell: (info) => (
|
|
||||||
<span className="flex gap-0.5 items-center text-base md:pe-5">
|
|
||||||
<IndicatorDot system={info.row.original} />
|
|
||||||
<Button
|
|
||||||
data-nolink
|
|
||||||
variant={"ghost"}
|
|
||||||
className="text-primary/90 h-7 px-1.5 gap-1.5"
|
|
||||||
onClick={() => copyToClipboard(info.getValue() as string)}
|
|
||||||
>
|
|
||||||
{info.getValue() as string}
|
|
||||||
<CopyIcon className="h-2.5 w-2.5" />
|
|
||||||
</Button>
|
|
||||||
</span>
|
|
||||||
),
|
|
||||||
header: sortableHeader,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
accessorKey: "info.cpu",
|
|
||||||
id: "cpu",
|
|
||||||
name: () => t`CPU`,
|
|
||||||
invertSorting: true,
|
|
||||||
cell: CellFormatter,
|
|
||||||
Icon: CpuIcon,
|
|
||||||
header: sortableHeader,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
accessorKey: "info.mp",
|
|
||||||
id: "memory",
|
|
||||||
name: () => t`Memory`,
|
|
||||||
invertSorting: true,
|
|
||||||
cell: CellFormatter,
|
|
||||||
Icon: MemoryStickIcon,
|
|
||||||
header: sortableHeader,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
accessorKey: "info.dp",
|
|
||||||
id: "disk",
|
|
||||||
name: () => t`Disk`,
|
|
||||||
invertSorting: true,
|
|
||||||
cell: CellFormatter,
|
|
||||||
Icon: HardDriveIcon,
|
|
||||||
header: sortableHeader,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
accessorFn: (originalRow) => originalRow.info.g,
|
|
||||||
id: "gpu",
|
|
||||||
name: () => "GPU",
|
|
||||||
invertSorting: true,
|
|
||||||
sortUndefined: -1,
|
|
||||||
cell: CellFormatter,
|
|
||||||
Icon: GpuIcon,
|
|
||||||
header: sortableHeader,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
accessorFn: (originalRow) => originalRow.info.b || 0,
|
|
||||||
id: "net",
|
|
||||||
name: () => t`Net`,
|
|
||||||
invertSorting: true,
|
|
||||||
size: 50,
|
|
||||||
Icon: EthernetIcon,
|
|
||||||
header: sortableHeader,
|
|
||||||
cell(info) {
|
|
||||||
const val = info.getValue() as number
|
|
||||||
return (
|
|
||||||
<span
|
|
||||||
className={cn("tabular-nums whitespace-nowrap", {
|
|
||||||
"ps-1": viewMode === "table",
|
|
||||||
})}
|
|
||||||
>
|
|
||||||
{decimalString(val, val >= 100 ? 1 : 2)} MB/s
|
|
||||||
</span>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
accessorFn: (originalRow) => originalRow.info.dt,
|
|
||||||
id: "temp",
|
|
||||||
name: () => t({ message: "Temp", comment: "Temperature label in systems table" }),
|
|
||||||
invertSorting: true,
|
|
||||||
sortUndefined: -1,
|
|
||||||
size: 50,
|
|
||||||
hideSort: true,
|
|
||||||
Icon: ThermometerIcon,
|
|
||||||
header: sortableHeader,
|
|
||||||
cell(info) {
|
|
||||||
const val = info.getValue() as number
|
|
||||||
if (!val) {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
return (
|
|
||||||
<span
|
|
||||||
className={cn("tabular-nums whitespace-nowrap", {
|
|
||||||
"ps-1.5": viewMode === "table",
|
|
||||||
})}
|
|
||||||
>
|
|
||||||
{decimalString(val)} °C
|
|
||||||
</span>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
accessorKey: "info.v",
|
|
||||||
id: "agent",
|
|
||||||
name: () => t`Agent`,
|
|
||||||
invertSorting: true,
|
|
||||||
size: 50,
|
|
||||||
Icon: WifiIcon,
|
|
||||||
hideSort: true,
|
|
||||||
header: sortableHeader,
|
|
||||||
cell(info) {
|
|
||||||
const version = info.getValue() as string
|
|
||||||
if (!version) {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
const system = info.row.original
|
|
||||||
return (
|
|
||||||
<span
|
|
||||||
className={cn("flex gap-2 items-center md:pe-5 tabular-nums", {
|
|
||||||
"ps-1": viewMode === "table",
|
|
||||||
})}
|
|
||||||
>
|
|
||||||
<IndicatorDot
|
|
||||||
system={system}
|
|
||||||
className={
|
|
||||||
(system.status !== "up" && "bg-primary/30") ||
|
|
||||||
(version === globalThis.BESZEL.HUB_VERSION && "bg-green-500") ||
|
|
||||||
"bg-yellow-500"
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
<span className="truncate max-w-14">{info.getValue() as string}</span>
|
|
||||||
</span>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: "actions",
|
|
||||||
// @ts-ignore
|
|
||||||
name: () => t({ message: "Actions", comment: "Table column" }),
|
|
||||||
size: 50,
|
|
||||||
cell: ({ row }) => (
|
|
||||||
<div className="flex justify-end items-center gap-1">
|
|
||||||
<AlertsButton system={row.original} />
|
|
||||||
<ActionsButton system={row.original} />
|
|
||||||
</div>
|
|
||||||
),
|
|
||||||
},
|
|
||||||
] as ColumnDef<SystemRecord>[]
|
|
||||||
}, [])
|
|
||||||
|
|
||||||
const table = useReactTable({
|
const table = useReactTable({
|
||||||
data,
|
data,
|
||||||
@@ -328,6 +85,9 @@ export default function SystemsTable() {
|
|||||||
columnVisibility,
|
columnVisibility,
|
||||||
},
|
},
|
||||||
defaultColumn: {
|
defaultColumn: {
|
||||||
|
// sortDescFirst: true,
|
||||||
|
invertSorting: true,
|
||||||
|
sortUndefined: "last",
|
||||||
minSize: 0,
|
minSize: 0,
|
||||||
size: 900,
|
size: 900,
|
||||||
maxSize: 900,
|
maxSize: 900,
|
||||||
@@ -511,7 +271,7 @@ function SystemsTableHead({ table, colLength }: { table: TableType<SystemRecord>
|
|||||||
<TableRow key={headerGroup.id}>
|
<TableRow key={headerGroup.id}>
|
||||||
{headerGroup.headers.map((header) => {
|
{headerGroup.headers.map((header) => {
|
||||||
return (
|
return (
|
||||||
<TableHead className="px-2" key={header.id}>
|
<TableHead className="px-1.5" key={header.id}>
|
||||||
{flexRender(header.column.columnDef.header, header.getContext())}
|
{flexRender(header.column.columnDef.header, header.getContext())}
|
||||||
</TableHead>
|
</TableHead>
|
||||||
)
|
)
|
||||||
@@ -586,7 +346,7 @@ const SystemCard = memo(
|
|||||||
</CardTitle>
|
</CardTitle>
|
||||||
{table.getColumn("actions")?.getIsVisible() && (
|
{table.getColumn("actions")?.getIsVisible() && (
|
||||||
<div className="flex gap-1 flex-shrink-0 relative z-10">
|
<div className="flex gap-1 flex-shrink-0 relative z-10">
|
||||||
<AlertsButton system={system} />
|
<AlertButton system={system} />
|
||||||
<ActionsButton system={system} />
|
<ActionsButton system={system} />
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
@@ -621,116 +381,3 @@ const SystemCard = memo(
|
|||||||
}, [system, colLength, t])
|
}, [system, colLength, t])
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
const ActionsButton = memo(({ system }: { system: SystemRecord }) => {
|
|
||||||
const [deleteOpen, setDeleteOpen] = useState(false)
|
|
||||||
const [editOpen, setEditOpen] = useState(false)
|
|
||||||
let editOpened = useRef(false)
|
|
||||||
const { t } = useLingui()
|
|
||||||
const { id, status, host, name } = system
|
|
||||||
|
|
||||||
return useMemo(() => {
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<DropdownMenu>
|
|
||||||
<DropdownMenuTrigger asChild>
|
|
||||||
<Button variant="ghost" size={"icon"} data-nolink>
|
|
||||||
<span className="sr-only">
|
|
||||||
<Trans>Open menu</Trans>
|
|
||||||
</span>
|
|
||||||
<MoreHorizontalIcon className="w-5" />
|
|
||||||
</Button>
|
|
||||||
</DropdownMenuTrigger>
|
|
||||||
<DropdownMenuContent align="end">
|
|
||||||
{!isReadOnlyUser() && (
|
|
||||||
<DropdownMenuItem
|
|
||||||
onSelect={() => {
|
|
||||||
editOpened.current = true
|
|
||||||
setEditOpen(true)
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<PenBoxIcon className="me-2.5 size-4" />
|
|
||||||
<Trans>Edit</Trans>
|
|
||||||
</DropdownMenuItem>
|
|
||||||
)}
|
|
||||||
<DropdownMenuItem
|
|
||||||
className={cn(isReadOnlyUser() && "hidden")}
|
|
||||||
onClick={() => {
|
|
||||||
pb.collection("systems").update(id, {
|
|
||||||
status: status === "paused" ? "pending" : "paused",
|
|
||||||
})
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{status === "paused" ? (
|
|
||||||
<>
|
|
||||||
<PlayCircleIcon className="me-2.5 size-4" />
|
|
||||||
<Trans>Resume</Trans>
|
|
||||||
</>
|
|
||||||
) : (
|
|
||||||
<>
|
|
||||||
<PauseCircleIcon className="me-2.5 size-4" />
|
|
||||||
<Trans>Pause</Trans>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</DropdownMenuItem>
|
|
||||||
<DropdownMenuItem onClick={() => copyToClipboard(host)}>
|
|
||||||
<CopyIcon className="me-2.5 size-4" />
|
|
||||||
<Trans>Copy host</Trans>
|
|
||||||
</DropdownMenuItem>
|
|
||||||
<DropdownMenuSeparator className={cn(isReadOnlyUser() && "hidden")} />
|
|
||||||
<DropdownMenuItem className={cn(isReadOnlyUser() && "hidden")} onSelect={() => setDeleteOpen(true)}>
|
|
||||||
<Trash2Icon className="me-2.5 size-4" />
|
|
||||||
<Trans>Delete</Trans>
|
|
||||||
</DropdownMenuItem>
|
|
||||||
</DropdownMenuContent>
|
|
||||||
</DropdownMenu>
|
|
||||||
{/* edit dialog */}
|
|
||||||
<Dialog open={editOpen} onOpenChange={setEditOpen}>
|
|
||||||
{editOpened.current && <SystemDialog system={system} setOpen={setEditOpen} />}
|
|
||||||
</Dialog>
|
|
||||||
{/* deletion dialog */}
|
|
||||||
<AlertDialog open={deleteOpen} onOpenChange={(open) => setDeleteOpen(open)}>
|
|
||||||
<AlertDialogContent>
|
|
||||||
<AlertDialogHeader>
|
|
||||||
<AlertDialogTitle>
|
|
||||||
<Trans>Are you sure you want to delete {name}?</Trans>
|
|
||||||
</AlertDialogTitle>
|
|
||||||
<AlertDialogDescription>
|
|
||||||
<Trans>
|
|
||||||
This action cannot be undone. This will permanently delete all current records for {name} from the
|
|
||||||
database.
|
|
||||||
</Trans>
|
|
||||||
</AlertDialogDescription>
|
|
||||||
</AlertDialogHeader>
|
|
||||||
<AlertDialogFooter>
|
|
||||||
<AlertDialogCancel>
|
|
||||||
<Trans>Cancel</Trans>
|
|
||||||
</AlertDialogCancel>
|
|
||||||
<AlertDialogAction
|
|
||||||
className={cn(buttonVariants({ variant: "destructive" }))}
|
|
||||||
onClick={() => pb.collection("systems").delete(id)}
|
|
||||||
>
|
|
||||||
<Trans>Continue</Trans>
|
|
||||||
</AlertDialogAction>
|
|
||||||
</AlertDialogFooter>
|
|
||||||
</AlertDialogContent>
|
|
||||||
</AlertDialog>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
}, [id, status, host, name, t, deleteOpen, editOpen])
|
|
||||||
})
|
|
||||||
|
|
||||||
function IndicatorDot({ system, className }: { system: SystemRecord; className?: ClassValue }) {
|
|
||||||
className ||= {
|
|
||||||
"bg-green-500": system.status === "up",
|
|
||||||
"bg-red-500": system.status === "down",
|
|
||||||
"bg-primary/40": system.status === "paused",
|
|
||||||
"bg-yellow-500": system.status === "pending",
|
|
||||||
}
|
|
||||||
return (
|
|
||||||
<span
|
|
||||||
className={cn("flex-shrink-0 size-2 rounded-full", className)}
|
|
||||||
// style={{ marginBottom: "-1px" }}
|
|
||||||
/>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
"use client"
|
||||||
|
|
||||||
import * as React from "react"
|
import * as React from "react"
|
||||||
import * as CheckboxPrimitive from "@radix-ui/react-checkbox"
|
import * as CheckboxPrimitive from "@radix-ui/react-checkbox"
|
||||||
import { Check } from "lucide-react"
|
import { Check } from "lucide-react"
|
||||||
@@ -11,13 +13,14 @@ const Checkbox = React.forwardRef<
|
|||||||
<CheckboxPrimitive.Root
|
<CheckboxPrimitive.Root
|
||||||
ref={ref}
|
ref={ref}
|
||||||
className={cn(
|
className={cn(
|
||||||
"peer h-4 w-4 shrink-0 rounded-[.3em] border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",
|
"peer size-4 flex items-center justify-center shrink-0 rounded-[.3em] border border-input ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",
|
||||||
|
|
||||||
className
|
className
|
||||||
)}
|
)}
|
||||||
{...props}
|
{...props}
|
||||||
>
|
>
|
||||||
<CheckboxPrimitive.Indicator className={cn("flex items-center justify-center text-current")}>
|
<CheckboxPrimitive.Indicator className={cn("flex items-center justify-center text-current")}>
|
||||||
<Check className="h-4 w-4" />
|
<Check className="size-4" />
|
||||||
</CheckboxPrimitive.Indicator>
|
</CheckboxPrimitive.Indicator>
|
||||||
</CheckboxPrimitive.Root>
|
</CheckboxPrimitive.Root>
|
||||||
))
|
))
|
||||||
|
|||||||
49
beszel/site/src/components/ui/collapsible.tsx
Normal file
49
beszel/site/src/components/ui/collapsible.tsx
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
import * as React from "react"
|
||||||
|
import { ChevronDownIcon, HourglassIcon } from "lucide-react"
|
||||||
|
import { cn } from "@/lib/utils"
|
||||||
|
import { Button } from "./button"
|
||||||
|
|
||||||
|
interface CollapsibleProps {
|
||||||
|
title: string
|
||||||
|
children: React.ReactNode
|
||||||
|
description?: React.ReactNode
|
||||||
|
defaultOpen?: boolean
|
||||||
|
className?: string
|
||||||
|
icon?: React.ReactNode
|
||||||
|
}
|
||||||
|
|
||||||
|
export function Collapsible({ title, children, description, defaultOpen = false, className, icon }: CollapsibleProps) {
|
||||||
|
const [isOpen, setIsOpen] = React.useState(defaultOpen)
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={cn("border rounded-lg", className)}>
|
||||||
|
<Button
|
||||||
|
variant="ghost"
|
||||||
|
className="w-full justify-between p-4 font-semibold"
|
||||||
|
onClick={() => setIsOpen(!isOpen)}
|
||||||
|
>
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
{icon}
|
||||||
|
{title}
|
||||||
|
</div>
|
||||||
|
<ChevronDownIcon
|
||||||
|
className={cn("h-4 w-4 transition-transform duration-200", {
|
||||||
|
"rotate-180": isOpen,
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
</Button>
|
||||||
|
{description && (
|
||||||
|
<div className="px-4 pb-2 text-sm text-muted-foreground">
|
||||||
|
{description}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{isOpen && (
|
||||||
|
<div className="px-4 pb-4">
|
||||||
|
<div className="grid gap-3">
|
||||||
|
{children}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -121,3 +121,12 @@ export function GpuIcon(props: SVGProps<SVGSVGElement>) {
|
|||||||
</svg>
|
</svg>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Remix icons (Apache 2.0) https://github.com/Remix-Design/RemixIcon/blob/master/License
|
||||||
|
export function HourglassIcon(props: SVGProps<SVGSVGElement>) {
|
||||||
|
return (
|
||||||
|
<svg viewBox="0 0 24 24" {...props} fill="currentColor">
|
||||||
|
<path d="M4 2h16v4.5L13.5 12l6.5 5.5V22H4v-4.5l6.5-5.5L4 6.5zm12.3 5L18 5.5V4H6v1.5L7.7 7zM12 13.3l-6 5.2V20h1l5-3 5 3h1v-1.5z" />
|
||||||
|
</svg>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ const TableRow = React.forwardRef<HTMLTableRowElement, React.HTMLAttributes<HTML
|
|||||||
<tr
|
<tr
|
||||||
ref={ref}
|
ref={ref}
|
||||||
className={cn(
|
className={cn(
|
||||||
"border-b border-border/60 hover:bg-muted/40 dark:hover:bg-muted/20 data-[state=selected]:bg-muted",
|
"border-b border-border/60 hover:bg-muted/40 dark:hover:bg-muted/20 data-[state=selected]:!bg-muted",
|
||||||
className
|
className
|
||||||
)}
|
)}
|
||||||
{...props}
|
{...props}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
/** Operating system */
|
||||||
export enum Os {
|
export enum Os {
|
||||||
Linux = 0,
|
Linux = 0,
|
||||||
Darwin,
|
Darwin,
|
||||||
@@ -5,9 +6,25 @@ export enum Os {
|
|||||||
FreeBSD,
|
FreeBSD,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Type of chart */
|
||||||
export enum ChartType {
|
export enum ChartType {
|
||||||
Memory,
|
Memory,
|
||||||
Disk,
|
Disk,
|
||||||
Network,
|
Network,
|
||||||
CPU,
|
CPU,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Unit of measurement */
|
||||||
|
export enum Unit {
|
||||||
|
Bytes,
|
||||||
|
Bits,
|
||||||
|
Celsius,
|
||||||
|
Fahrenheit,
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Meter state for color */
|
||||||
|
export enum MeterState {
|
||||||
|
Good,
|
||||||
|
Warn,
|
||||||
|
Crit,
|
||||||
|
}
|
||||||
|
|||||||
@@ -24,6 +24,17 @@ export const $chartTime = atom("1h") as PreinitializedWritableAtom<ChartTimes>
|
|||||||
/** Whether to display average or max chart values */
|
/** Whether to display average or max chart values */
|
||||||
export const $maxValues = atom(false)
|
export const $maxValues = atom(false)
|
||||||
|
|
||||||
|
// export const UserSettingsSchema = v.object({
|
||||||
|
// chartTime: v.picklist(["1h", "12h", "24h", "1w", "30d"]),
|
||||||
|
// emails: v.optional(v.array(v.pipe(v.string(), v.email())), [pb?.authStore?.record?.email ?? ""]),
|
||||||
|
// webhooks: v.optional(v.array(v.string())),
|
||||||
|
// colorWarn: v.optional(v.pipe(v.number(), v.minValue(1), v.maxValue(100))),
|
||||||
|
// colorDanger: v.optional(v.pipe(v.number(), v.minValue(1), v.maxValue(100))),
|
||||||
|
// unitTemp: v.optional(v.enum(Unit)),
|
||||||
|
// unitNet: v.optional(v.enum(Unit)),
|
||||||
|
// unitDisk: v.optional(v.enum(Unit)),
|
||||||
|
// })
|
||||||
|
|
||||||
/** User settings */
|
/** User settings */
|
||||||
export const $userSettings = map<UserSettings>({
|
export const $userSettings = map<UserSettings>({
|
||||||
chartTime: "1h",
|
chartTime: "1h",
|
||||||
|
|||||||
@@ -3,14 +3,24 @@ import { toast } from "@/components/ui/use-toast"
|
|||||||
import { type ClassValue, clsx } from "clsx"
|
import { type ClassValue, clsx } from "clsx"
|
||||||
import { twMerge } from "tailwind-merge"
|
import { twMerge } from "tailwind-merge"
|
||||||
import { $alerts, $copyContent, $systems, $userSettings, pb } from "./stores"
|
import { $alerts, $copyContent, $systems, $userSettings, pb } from "./stores"
|
||||||
import { AlertInfo, AlertRecord, ChartTimeData, ChartTimes, FingerprintRecord, SystemRecord } from "@/types"
|
import {
|
||||||
|
AlertInfo,
|
||||||
|
AlertRecord,
|
||||||
|
ChartTimeData,
|
||||||
|
ChartTimes,
|
||||||
|
FingerprintRecord,
|
||||||
|
SemVer,
|
||||||
|
SystemRecord,
|
||||||
|
UserSettings,
|
||||||
|
} from "@/types"
|
||||||
import { RecordModel, RecordSubscription } from "pocketbase"
|
import { RecordModel, RecordSubscription } from "pocketbase"
|
||||||
import { WritableAtom } from "nanostores"
|
import { WritableAtom } from "nanostores"
|
||||||
import { timeDay, timeHour } from "d3-time"
|
import { timeDay, timeHour } from "d3-time"
|
||||||
import { useEffect, useState } from "react"
|
import { useEffect, useState } from "react"
|
||||||
import { CpuIcon, HardDriveIcon, MemoryStickIcon, ServerIcon } from "lucide-react"
|
import { CpuIcon, HardDriveIcon, MemoryStickIcon, ServerIcon } from "lucide-react"
|
||||||
import { EthernetIcon, ThermometerIcon } from "@/components/ui/icons"
|
import { EthernetIcon, HourglassIcon, ThermometerIcon } from "@/components/ui/icons"
|
||||||
import { prependBasePath } from "@/components/router"
|
import { prependBasePath } from "@/components/router"
|
||||||
|
import { MeterState, Unit } from "./enums"
|
||||||
|
|
||||||
export function cn(...inputs: ClassValue[]) {
|
export function cn(...inputs: ClassValue[]) {
|
||||||
return twMerge(clsx(inputs))
|
return twMerge(clsx(inputs))
|
||||||
@@ -73,7 +83,10 @@ export const updateSystemList = (() => {
|
|||||||
|
|
||||||
/** Logs the user out by clearing the auth store and unsubscribing from realtime updates. */
|
/** Logs the user out by clearing the auth store and unsubscribing from realtime updates. */
|
||||||
export async function logOut() {
|
export async function logOut() {
|
||||||
sessionStorage.setItem("lo", "t")
|
$systems.set([])
|
||||||
|
$alerts.set([])
|
||||||
|
$userSettings.set({} as UserSettings)
|
||||||
|
sessionStorage.setItem("lo", "t") // prevent auto login on logout
|
||||||
pb.authStore.clear()
|
pb.authStore.clear()
|
||||||
pb.realtime.unsubscribe()
|
pb.realtime.unsubscribe()
|
||||||
}
|
}
|
||||||
@@ -225,17 +238,17 @@ export function useYAxisWidth() {
|
|||||||
return { yAxisWidth, updateYAxisWidth }
|
return { yAxisWidth, updateYAxisWidth }
|
||||||
}
|
}
|
||||||
|
|
||||||
export function toFixedWithoutTrailingZeros(num: number, digits: number) {
|
/** Format number to x decimal places, without trailing zeros */
|
||||||
return parseFloat(num.toFixed(digits)).toString()
|
|
||||||
}
|
|
||||||
|
|
||||||
export function toFixedFloat(num: number, digits: number) {
|
export function toFixedFloat(num: number, digits: number) {
|
||||||
return parseFloat(num.toFixed(digits))
|
return parseFloat((digits === 0 ? Math.ceil(num) : num).toFixed(digits))
|
||||||
}
|
}
|
||||||
|
|
||||||
let decimalFormatters: Map<number, Intl.NumberFormat> = new Map()
|
let decimalFormatters: Map<number, Intl.NumberFormat> = new Map()
|
||||||
/** Format number to x decimal places */
|
/** Format number to x decimal places, maintaining trailing zeros */
|
||||||
export function decimalString(num: number, digits = 2) {
|
export function decimalString(num: number, digits = 2) {
|
||||||
|
if (digits === 0) {
|
||||||
|
return Math.ceil(num).toString()
|
||||||
|
}
|
||||||
let formatter = decimalFormatters.get(digits)
|
let formatter = decimalFormatters.get(digits)
|
||||||
if (!formatter) {
|
if (!formatter) {
|
||||||
formatter = new Intl.NumberFormat(undefined, {
|
formatter = new Intl.NumberFormat(undefined, {
|
||||||
@@ -266,42 +279,96 @@ export function useLocalStorage<T>(key: string, defaultValue: T) {
|
|||||||
return [value, setValue]
|
return [value, setValue]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Format temperature to user's preferred unit */
|
||||||
|
export function formatTemperature(celsius: number, unit?: Unit): { value: number; unit: string } {
|
||||||
|
if (!unit) {
|
||||||
|
unit = $userSettings.get().unitTemp || Unit.Celsius
|
||||||
|
}
|
||||||
|
// need loose equality check due to form data being strings
|
||||||
|
if (unit == Unit.Fahrenheit) {
|
||||||
|
return {
|
||||||
|
value: celsius * 1.8 + 32,
|
||||||
|
unit: "°F",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
value: celsius,
|
||||||
|
unit: "°C",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Format bytes to user's preferred unit */
|
||||||
|
export function formatBytes(
|
||||||
|
size: number,
|
||||||
|
perSecond = false,
|
||||||
|
unit = Unit.Bytes,
|
||||||
|
isMegabytes = false
|
||||||
|
): { value: number; unit: string } {
|
||||||
|
// Convert MB to bytes if isMegabytes is true
|
||||||
|
if (isMegabytes) size *= 1024 * 1024
|
||||||
|
|
||||||
|
// need loose equality check due to form data being strings
|
||||||
|
if (unit == Unit.Bits) {
|
||||||
|
const bits = size * 8
|
||||||
|
const suffix = perSecond ? "ps" : ""
|
||||||
|
if (bits < 1000) return { value: bits, unit: `b${suffix}` }
|
||||||
|
if (bits < 1_000_000) return { value: bits / 1_000, unit: `Kb${suffix}` }
|
||||||
|
if (bits < 1_000_000_000)
|
||||||
|
return {
|
||||||
|
value: bits / 1_000_000,
|
||||||
|
unit: `Mb${suffix}`,
|
||||||
|
}
|
||||||
|
if (bits < 1_000_000_000_000)
|
||||||
|
return {
|
||||||
|
value: bits / 1_000_000_000,
|
||||||
|
unit: `Gb${suffix}`,
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
value: bits / 1_000_000_000_000,
|
||||||
|
unit: `Tb${suffix}`,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// bytes
|
||||||
|
const suffix = perSecond ? "/s" : ""
|
||||||
|
if (size < 100) return { value: size, unit: `B${suffix}` }
|
||||||
|
if (size < 1000 * 1024) return { value: size / 1024, unit: `KB${suffix}` }
|
||||||
|
if (size < 1000 * 1024 ** 2)
|
||||||
|
return {
|
||||||
|
value: size / 1024 ** 2,
|
||||||
|
unit: `MB${suffix}`,
|
||||||
|
}
|
||||||
|
if (size < 1000 * 1024 ** 3)
|
||||||
|
return {
|
||||||
|
value: size / 1024 ** 3,
|
||||||
|
unit: `GB${suffix}`,
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
value: size / 1024 ** 4,
|
||||||
|
unit: `TB${suffix}`,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Fetch or create user settings in database */
|
||||||
export async function updateUserSettings() {
|
export async function updateUserSettings() {
|
||||||
try {
|
try {
|
||||||
const req = await pb.collection("user_settings").getFirstListItem("", { fields: "settings" })
|
const req = await pb.collection("user_settings").getFirstListItem("", { fields: "settings" })
|
||||||
$userSettings.set(req.settings)
|
$userSettings.set(req.settings)
|
||||||
return
|
return
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log("get settings", e)
|
console.error("get settings", e)
|
||||||
}
|
}
|
||||||
// create user settings if error fetching existing
|
// create user settings if error fetching existing
|
||||||
try {
|
try {
|
||||||
const createdSettings = await pb.collection("user_settings").create({ user: pb.authStore.record!.id })
|
const createdSettings = await pb.collection("user_settings").create({ user: pb.authStore.record!.id })
|
||||||
$userSettings.set(createdSettings.settings)
|
$userSettings.set(createdSettings.settings)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log("create settings", e)
|
console.error("create settings", e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the value and unit of size (TB, GB, or MB) for a given size
|
|
||||||
* @param n size in gigabytes or megabytes
|
|
||||||
* @param isGigabytes boolean indicating if n represents gigabytes (true) or megabytes (false)
|
|
||||||
* @returns an object containing the value and unit of size
|
|
||||||
*/
|
|
||||||
export const getSizeAndUnit = (n: number, isGigabytes = true) => {
|
|
||||||
const sizeInGB = isGigabytes ? n : n / 1_000
|
|
||||||
|
|
||||||
if (sizeInGB >= 1_000) {
|
|
||||||
return { v: sizeInGB / 1_000, u: " TB" }
|
|
||||||
} else if (sizeInGB >= 1) {
|
|
||||||
return { v: sizeInGB, u: " GB" }
|
|
||||||
}
|
|
||||||
return { v: isGigabytes ? sizeInGB * 1_000 : n, u: " MB" }
|
|
||||||
}
|
|
||||||
|
|
||||||
export const chartMargin = { top: 12 }
|
export const chartMargin = { top: 12 }
|
||||||
|
|
||||||
|
/** Alert info for each alert type */
|
||||||
export const alertInfo: Record<string, AlertInfo> = {
|
export const alertInfo: Record<string, AlertInfo> = {
|
||||||
Status: {
|
Status: {
|
||||||
name: () => t`Status`,
|
name: () => t`Status`,
|
||||||
@@ -342,6 +409,36 @@ export const alertInfo: Record<string, AlertInfo> = {
|
|||||||
icon: ThermometerIcon,
|
icon: ThermometerIcon,
|
||||||
desc: () => t`Triggers when any sensor exceeds a threshold`,
|
desc: () => t`Triggers when any sensor exceeds a threshold`,
|
||||||
},
|
},
|
||||||
|
LoadAvg1: {
|
||||||
|
name: () => t`Load Average 1m`,
|
||||||
|
unit: "",
|
||||||
|
icon: HourglassIcon,
|
||||||
|
max: 100,
|
||||||
|
min: 0.1,
|
||||||
|
start: 10,
|
||||||
|
step: 0.1,
|
||||||
|
desc: () => t`Triggers when 1 minute load average exceeds a threshold`,
|
||||||
|
},
|
||||||
|
LoadAvg5: {
|
||||||
|
name: () => t`Load Average 5m`,
|
||||||
|
unit: "",
|
||||||
|
icon: HourglassIcon,
|
||||||
|
max: 100,
|
||||||
|
min: 0.1,
|
||||||
|
start: 10,
|
||||||
|
step: 0.1,
|
||||||
|
desc: () => t`Triggers when 5 minute load average exceeds a threshold`,
|
||||||
|
},
|
||||||
|
LoadAvg15: {
|
||||||
|
name: () => t`Load Average 15m`,
|
||||||
|
unit: "",
|
||||||
|
icon: HourglassIcon,
|
||||||
|
min: 0.1,
|
||||||
|
max: 100,
|
||||||
|
start: 10,
|
||||||
|
step: 0.1,
|
||||||
|
desc: () => t`Triggers when 15 minute load average exceeds a threshold`,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -360,3 +457,59 @@ export const getHubURL = () => BESZEL?.HUB_URL || window.location.origin
|
|||||||
|
|
||||||
/** Map of system IDs to their corresponding tokens (used to avoid fetching in add-system dialog) */
|
/** Map of system IDs to their corresponding tokens (used to avoid fetching in add-system dialog) */
|
||||||
export const tokenMap = new Map<SystemRecord["id"], FingerprintRecord["token"]>()
|
export const tokenMap = new Map<SystemRecord["id"], FingerprintRecord["token"]>()
|
||||||
|
|
||||||
|
/** Calculate duration between two dates and format as human-readable string */
|
||||||
|
export function formatDuration(
|
||||||
|
createdDate: string | null | undefined,
|
||||||
|
resolvedDate: string | null | undefined
|
||||||
|
): string {
|
||||||
|
const created = createdDate ? new Date(createdDate) : null
|
||||||
|
const resolved = resolvedDate ? new Date(resolvedDate) : null
|
||||||
|
|
||||||
|
if (!created || !resolved) return ""
|
||||||
|
|
||||||
|
const diffMs = resolved.getTime() - created.getTime()
|
||||||
|
if (diffMs < 0) return ""
|
||||||
|
|
||||||
|
const totalSeconds = Math.floor(diffMs / 1000)
|
||||||
|
let hours = Math.floor(totalSeconds / 3600)
|
||||||
|
let minutes = Math.floor((totalSeconds % 3600) / 60)
|
||||||
|
let seconds = totalSeconds % 60
|
||||||
|
|
||||||
|
// if seconds are close to 60, round up to next minute
|
||||||
|
// if minutes are close to 60, round up to next hour
|
||||||
|
if (seconds >= 58) {
|
||||||
|
minutes += 1
|
||||||
|
seconds = 0
|
||||||
|
}
|
||||||
|
if (minutes >= 60) {
|
||||||
|
hours += 1
|
||||||
|
minutes = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// For durations over 1 hour, omit seconds for cleaner display
|
||||||
|
if (hours > 0) {
|
||||||
|
return [hours ? `${hours}h` : null, minutes ? `${minutes}m` : null].filter(Boolean).join(" ")
|
||||||
|
}
|
||||||
|
|
||||||
|
return [hours ? `${hours}h` : null, minutes ? `${minutes}m` : null, seconds ? `${seconds}s` : null]
|
||||||
|
.filter(Boolean)
|
||||||
|
.join(" ")
|
||||||
|
}
|
||||||
|
|
||||||
|
export const parseSemVer = (semVer = ""): SemVer => {
|
||||||
|
// if (semVer.startsWith("v")) {
|
||||||
|
// semVer = semVer.slice(1)
|
||||||
|
// }
|
||||||
|
if (semVer.includes("-")) {
|
||||||
|
semVer = semVer.slice(0, semVer.indexOf("-"))
|
||||||
|
}
|
||||||
|
const parts = semVer.split(".").map(Number)
|
||||||
|
return { major: parts?.[0] ?? 0, minor: parts?.[1] ?? 0, patch: parts?.[2] ?? 0 }
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Get meter state from 0-100 value. Used for color coding meters. */
|
||||||
|
export function getMeterState(value: number): MeterState {
|
||||||
|
const { colorWarn = 65, colorCrit = 90 } = $userSettings.get()
|
||||||
|
return value >= colorCrit ? MeterState.Crit : value >= colorWarn ? MeterState.Warn : MeterState.Good
|
||||||
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ msgstr ""
|
|||||||
"Language: ar\n"
|
"Language: ar\n"
|
||||||
"Project-Id-Version: beszel\n"
|
"Project-Id-Version: beszel\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2025-03-06 07:27\n"
|
"PO-Revision-Date: 2025-07-25 22:44\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: Arabic\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"
|
"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"
|
||||||
@@ -23,6 +23,12 @@ msgstr ""
|
|||||||
msgid "{0, plural, one {# day} other {# days}}"
|
msgid "{0, plural, one {# day} other {# days}}"
|
||||||
msgstr "{0, plural, one {# يوم} other {# أيام}}"
|
msgstr "{0, plural, one {# يوم} other {# أيام}}"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
|
||||||
|
#. placeholder {1}: table.getFilteredRowModel().rows.length
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "{0} of {1} row(s) selected."
|
||||||
|
msgstr "تم تحديد {0} من {1} صف"
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "{hours, plural, one {# hour} other {# hours}}"
|
msgid "{hours, plural, one {# hour} other {# hours}}"
|
||||||
msgstr "{hours, plural, one {# ساعة} other {# ساعات}}"
|
msgstr "{hours, plural, one {# ساعة} other {# ساعات}}"
|
||||||
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# ساعة} other {# ساعات}}"
|
|||||||
msgid "1 hour"
|
msgid "1 hour"
|
||||||
msgstr "1 ساعة"
|
msgstr "1 ساعة"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "1 min"
|
||||||
|
msgstr "دقيقة واحدة"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "1 week"
|
msgid "1 week"
|
||||||
msgstr "1 أسبوع"
|
msgstr "1 أسبوع"
|
||||||
@@ -39,6 +50,11 @@ msgstr "1 أسبوع"
|
|||||||
msgid "12 hours"
|
msgid "12 hours"
|
||||||
msgstr "12 ساعة"
|
msgstr "12 ساعة"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "15 min"
|
||||||
|
msgstr "15 دقيقة"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "24 hours"
|
msgid "24 hours"
|
||||||
msgstr "24 ساعة"
|
msgstr "24 ساعة"
|
||||||
@@ -47,12 +63,22 @@ msgstr "24 ساعة"
|
|||||||
msgid "30 days"
|
msgid "30 days"
|
||||||
msgstr "30 يومًا"
|
msgstr "30 يومًا"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "5 min"
|
||||||
|
msgstr "5 دقائق"
|
||||||
|
|
||||||
#. Table column
|
#. Table column
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "إجراءات"
|
msgstr "إجراءات"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Active"
|
||||||
|
msgstr "نشط"
|
||||||
|
|
||||||
#: src/components/routes/home.tsx
|
#: src/components/routes/home.tsx
|
||||||
msgid "Active Alerts"
|
msgid "Active Alerts"
|
||||||
msgstr "التنبيهات النشطة"
|
msgstr "التنبيهات النشطة"
|
||||||
@@ -71,7 +97,7 @@ msgstr "إضافة نظام"
|
|||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
msgid "Add URL"
|
msgid "Add URL"
|
||||||
msgstr "إضافة عنوان URL"
|
msgstr "إضافة رابط"
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Adjust display options for charts."
|
msgid "Adjust display options for charts."
|
||||||
@@ -86,6 +112,12 @@ msgstr "مسؤول"
|
|||||||
msgid "Agent"
|
msgid "Agent"
|
||||||
msgstr "وكيل"
|
msgstr "وكيل"
|
||||||
|
|
||||||
|
#: src/components/command-palette.tsx
|
||||||
|
#: src/components/routes/settings/layout.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Alert History"
|
||||||
|
msgstr "سجل التنبيهات"
|
||||||
|
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
msgid "Alerts"
|
msgid "Alerts"
|
||||||
@@ -100,6 +132,10 @@ msgstr "جميع الأنظمة"
|
|||||||
msgid "Are you sure you want to delete {name}?"
|
msgid "Are you sure you want to delete {name}?"
|
||||||
msgstr "هل أنت متأكد أنك تريد حذف {name}؟"
|
msgstr "هل أنت متأكد أنك تريد حذف {name}؟"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Are you sure?"
|
||||||
|
msgstr "هل أنت متأكد؟"
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Automatic copy requires a secure context."
|
msgid "Automatic copy requires a secure context."
|
||||||
msgstr "النسخ التلقائي يتطلب سياقًا آمنًا."
|
msgstr "النسخ التلقائي يتطلب سياقًا آمنًا."
|
||||||
@@ -119,7 +155,7 @@ msgstr "المتوسط يتجاوز <0>{value}{0}</0>"
|
|||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Average power consumption of GPUs"
|
msgid "Average power consumption of GPUs"
|
||||||
msgstr "متوسط استهلاك طاقة GPUs"
|
msgstr "متوسط استهلاك طاقة وحدة معالجة الرسوميات"
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Average system-wide CPU utilization"
|
msgid "Average system-wide CPU utilization"
|
||||||
@@ -142,7 +178,7 @@ msgstr "عرض النطاق الترددي"
|
|||||||
|
|
||||||
#: src/components/login/auth-form.tsx
|
#: src/components/login/auth-form.tsx
|
||||||
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
|
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
|
||||||
msgstr "يدعم Beszel OpenID Connect والعديد من مزودي المصادقة OAuth2."
|
msgstr "يدعم بيزيل بروتوكول OpenID Connect والعديد من مزوّدي المصادقة عبر بروتوكول OAuth2."
|
||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
|
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
|
||||||
@@ -152,11 +188,22 @@ msgstr "يستخدم بيزيل <0>Shoutrrr</0> للتكامل مع خدمات
|
|||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
msgstr "ثنائي"
|
msgstr "ثنائي"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bits (Kbps, Mbps, Gbps)"
|
||||||
|
msgstr "بت (كيلوبت/ثانية، ميجابت/ثانية، جيجابت/ثانية)"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bytes (KB/s, MB/s, GB/s)"
|
||||||
|
msgstr "بايت (كيلوبايت/ثانية، ميجابايت/ثانية، جيجابايت/ثانية)"
|
||||||
|
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
msgid "Cache / Buffers"
|
msgid "Cache / Buffers"
|
||||||
msgstr "ذاكرة التخزين المؤقت / المخازن المؤقتة"
|
msgstr "ذاكرة التخزين المؤقت / المخازن المؤقتة"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "إلغاء"
|
msgstr "إلغاء"
|
||||||
|
|
||||||
@@ -164,6 +211,14 @@ msgstr "إلغاء"
|
|||||||
msgid "Caution - potential data loss"
|
msgid "Caution - potential data loss"
|
||||||
msgstr "تحذير - فقدان محتمل للبيانات"
|
msgstr "تحذير - فقدان محتمل للبيانات"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Celsius (°C)"
|
||||||
|
msgstr "درجة مئوية (°م)"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Change display units for metrics."
|
||||||
|
msgstr "تغيير وحدات عرض المقاييس."
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Change general application options."
|
msgid "Change general application options."
|
||||||
msgstr "تغيير خيارات التطبيق العامة."
|
msgstr "تغيير خيارات التطبيق العامة."
|
||||||
@@ -195,14 +250,19 @@ msgstr "تعليمات سطر الأوامر"
|
|||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
msgid "Configure how you receive alert notifications."
|
msgid "Configure how you receive alert notifications."
|
||||||
msgstr "قم بتكوين كيفية تلقي إشعارات التنبيه."
|
msgstr "هيئ التنبيهات الواردة"
|
||||||
|
|
||||||
#: src/components/login/auth-form.tsx
|
#: src/components/login/auth-form.tsx
|
||||||
#: src/components/login/auth-form.tsx
|
#: src/components/login/auth-form.tsx
|
||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr "تأكيد كلمة المرور"
|
msgstr "تأكيد كلمة المرور"
|
||||||
|
|
||||||
|
#: src/components/routes/home.tsx
|
||||||
|
msgid "Connection is down"
|
||||||
|
msgstr "الاتصال مقطوع"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Continue"
|
msgid "Continue"
|
||||||
msgstr "متابعة"
|
msgstr "متابعة"
|
||||||
|
|
||||||
@@ -211,14 +271,16 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "تم النسخ إلى الحافظة"
|
msgstr "تم النسخ إلى الحافظة"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "نسخ docker compose"
|
msgstr "نسخ أمر تركيب الدوكر"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "نسخ docker run"
|
msgstr "نسخ أمر تشغيل الدوكر"
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Environment variables"
|
msgctxt "Environment variables"
|
||||||
@@ -230,9 +292,14 @@ msgid "Copy host"
|
|||||||
msgstr "نسخ المضيف"
|
msgstr "نسخ المضيف"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "نسخ أمر لينكس"
|
msgstr "نسخ أمر لينكس"
|
||||||
|
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Copy name"
|
||||||
|
msgstr "نسخ الاسم"
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Copy text"
|
msgid "Copy text"
|
||||||
msgstr "نسخ النص"
|
msgstr "نسخ النص"
|
||||||
@@ -255,7 +322,7 @@ msgstr "المعالج"
|
|||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "CPU Usage"
|
msgid "CPU Usage"
|
||||||
msgstr "استخدام وحدة المعالجة المركزية"
|
msgstr "استخدام وحدة المعالجة المركزية"
|
||||||
|
|
||||||
@@ -263,6 +330,11 @@ msgstr "استخدام وحدة المعالجة المركزية"
|
|||||||
msgid "Create account"
|
msgid "Create account"
|
||||||
msgstr "إنشاء حساب"
|
msgstr "إنشاء حساب"
|
||||||
|
|
||||||
|
#. Context: date created
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Created"
|
||||||
|
msgstr "أنشئت"
|
||||||
|
|
||||||
#. Dark theme
|
#. Dark theme
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
@@ -278,6 +350,7 @@ msgid "Default time period"
|
|||||||
msgstr "الفترة الزمنية الافتراضية"
|
msgstr "الفترة الزمنية الافتراضية"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "حذف"
|
msgstr "حذف"
|
||||||
|
|
||||||
@@ -293,6 +366,10 @@ msgstr "القرص"
|
|||||||
msgid "Disk I/O"
|
msgid "Disk I/O"
|
||||||
msgstr "إدخال/إخراج القرص"
|
msgstr "إدخال/إخراج القرص"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Disk unit"
|
||||||
|
msgstr "وحدة القرص"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/disk-chart.tsx
|
#: src/components/charts/disk-chart.tsx
|
||||||
@@ -305,15 +382,15 @@ msgstr "استخدام القرص لـ {extraFsName}"
|
|||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Docker CPU Usage"
|
msgid "Docker CPU Usage"
|
||||||
msgstr "استخدام المعالج لـ Docker"
|
msgstr "استخدام المعالج للدوكر"
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Docker Memory Usage"
|
msgid "Docker Memory Usage"
|
||||||
msgstr "استخدام الذاكرة لـ Docker"
|
msgstr "استخدام الذاكرة للدوكر"
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Docker Network I/O"
|
msgid "Docker Network I/O"
|
||||||
msgstr "إدخال/إخراج الشبكة لـ Docker"
|
msgstr "إدخال/إخراج الشبكة للدوكر"
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "Documentation"
|
msgid "Documentation"
|
||||||
@@ -321,11 +398,16 @@ msgstr "التوثيق"
|
|||||||
|
|
||||||
#. Context: System is down
|
#. Context: System is down
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Down"
|
msgid "Down"
|
||||||
msgstr "معطل"
|
msgstr "معطل"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Duration"
|
||||||
|
msgstr "المدة"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
@@ -351,6 +433,7 @@ msgstr "أدخل عنوان البريد الإشباكي..."
|
|||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
#: src/components/login/auth-form.tsx
|
#: src/components/login/auth-form.tsx
|
||||||
msgid "Error"
|
msgid "Error"
|
||||||
msgstr "خطأ"
|
msgstr "خطأ"
|
||||||
@@ -366,6 +449,10 @@ msgstr "يتجاوز {0}{1} في آخر {2, plural, one {# دقيقة} other {#
|
|||||||
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
||||||
msgstr "سيتم حذف الأنظمة الحالية غير المعرفة في <0>config.yml</0>. يرجى عمل نسخ احتياطية بانتظام."
|
msgstr "سيتم حذف الأنظمة الحالية غير المعرفة في <0>config.yml</0>. يرجى عمل نسخ احتياطية بانتظام."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Export"
|
||||||
|
msgstr "تصدير"
|
||||||
|
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
msgid "Export configuration"
|
msgid "Export configuration"
|
||||||
msgstr "تصدير التكوين"
|
msgstr "تصدير التكوين"
|
||||||
@@ -374,6 +461,10 @@ msgstr "تصدير التكوين"
|
|||||||
msgid "Export your current systems configuration."
|
msgid "Export your current systems configuration."
|
||||||
msgstr "تصدير تكوين الأنظمة الحالية الخاصة بك."
|
msgstr "تصدير تكوين الأنظمة الحالية الخاصة بك."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Fahrenheit (°F)"
|
||||||
|
msgstr "فهرنهايت (°ف)"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Failed to authenticate"
|
msgid "Failed to authenticate"
|
||||||
msgstr "فشل في المصادقة"
|
msgstr "فشل في المصادقة"
|
||||||
@@ -393,9 +484,14 @@ msgstr "فشل في تحديث التنبيه"
|
|||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "تصفية..."
|
msgstr "تصفية..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr "البصمة"
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "لمدة <0>{min}</0> {min, plural, one {دقيقة} other {دقائق}}"
|
msgstr "لمدة <0>{min}</0> {min, plural, one {دقيقة} other {دقائق}}"
|
||||||
@@ -412,13 +508,14 @@ msgstr "عام"
|
|||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "GPU Power Draw"
|
msgid "GPU Power Draw"
|
||||||
msgstr "استهلاك طاقة GPU"
|
msgstr "استهلاك طاقة وحدة معالجة الرسوميات"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Grid"
|
msgid "Grid"
|
||||||
msgstr "شبكة"
|
msgstr "شبكة"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "أمر Homebrew"
|
msgstr "أمر Homebrew"
|
||||||
@@ -453,6 +550,27 @@ msgstr "التخطيط"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "فاتح"
|
msgstr "فاتح"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "Load Average"
|
||||||
|
msgstr "متوسط التحميل"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr "متوسط التحميل 15 دقيقة"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 1m"
|
||||||
|
msgstr "متوسط التحميل 1 دقيقة"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr "متوسط التحميل 5 دقائق"
|
||||||
|
|
||||||
|
#. Short label for load average
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Load Avg"
|
||||||
|
msgstr "متوسط التحميل"
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "تسجيل الخروج"
|
msgstr "تسجيل الخروج"
|
||||||
@@ -486,7 +604,7 @@ msgstr "تعليمات الإعداد اليدوي"
|
|||||||
#. Chart select field. Please try to keep this short.
|
#. Chart select field. Please try to keep this short.
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Max 1 min"
|
msgid "Max 1 min"
|
||||||
msgstr "1 دقيقة كحد"
|
msgstr "الحد الأقصى دقيقة"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Memory"
|
msgid "Memory"
|
||||||
@@ -499,8 +617,9 @@ msgstr "استخدام الذاكرة"
|
|||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Memory usage of docker containers"
|
msgid "Memory usage of docker containers"
|
||||||
msgstr "استخدام الذاكرة لحاويات Docker"
|
msgstr "استخدام الذاكرة لحاويات دوكر"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "الاسم"
|
msgstr "الاسم"
|
||||||
@@ -511,16 +630,25 @@ msgstr "الشبكة"
|
|||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Network traffic of docker containers"
|
msgid "Network traffic of docker containers"
|
||||||
msgstr "حركة مرور الشبكة لحاويات Docker"
|
msgstr "حركة مرور الشبكة لحاويات الدوكر"
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Network traffic of public interfaces"
|
msgid "Network traffic of public interfaces"
|
||||||
msgstr "حركة مرور الشبكة للواجهات العامة"
|
msgstr "حركة مرور الشبكة للواجهات العامة"
|
||||||
|
|
||||||
|
#. Context: Bytes or bits
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Network unit"
|
||||||
|
msgstr "وحدة الشبكة"
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "No results found."
|
msgid "No results found."
|
||||||
msgstr "لم يتم العثور على نتائج."
|
msgstr "لم يتم العثور على نتائج."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "No results."
|
||||||
|
msgstr "لا توجد نتائج."
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "No systems found."
|
msgid "No systems found."
|
||||||
@@ -558,6 +686,12 @@ msgstr "الكتابة فوق التنبيهات الحالية"
|
|||||||
msgid "Page"
|
msgid "Page"
|
||||||
msgstr "صفحة"
|
msgstr "صفحة"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getState().pagination.pageIndex + 1
|
||||||
|
#. placeholder {1}: table.getPageCount()
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Page {0} of {1}"
|
||||||
|
msgstr "صفحة {0} من {1}"
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "Pages / Settings"
|
msgid "Pages / Settings"
|
||||||
msgstr "الصفحات / الإعدادات"
|
msgstr "الصفحات / الإعدادات"
|
||||||
@@ -585,7 +719,7 @@ msgstr "إيقاف مؤقت"
|
|||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Paused"
|
msgid "Paused"
|
||||||
msgstr "متوقف مؤقتًا"
|
msgstr "متوقف مؤقتا"
|
||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
|
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
|
||||||
@@ -639,13 +773,12 @@ msgid "Public Key"
|
|||||||
msgstr "المفتاح العام"
|
msgstr "المفتاح العام"
|
||||||
|
|
||||||
#. Disk read
|
#. Disk read
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Read"
|
msgid "Read"
|
||||||
msgstr "قراءة"
|
msgstr "قراءة"
|
||||||
|
|
||||||
#. Network bytes received (download)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Received"
|
msgid "Received"
|
||||||
msgstr "تم الاستلام"
|
msgstr "تم الاستلام"
|
||||||
|
|
||||||
@@ -653,6 +786,12 @@ msgstr "تم الاستلام"
|
|||||||
msgid "Reset Password"
|
msgid "Reset Password"
|
||||||
msgstr "إعادة تعيين كلمة المرور"
|
msgstr "إعادة تعيين كلمة المرور"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Resolved"
|
||||||
|
msgstr "تم حلها"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Resume"
|
msgid "Resume"
|
||||||
msgstr "استئناف"
|
msgstr "استئناف"
|
||||||
@@ -661,6 +800,10 @@ msgstr "استئناف"
|
|||||||
msgid "Rotate token"
|
msgid "Rotate token"
|
||||||
msgstr "تدوير الرمز المميز"
|
msgstr "تدوير الرمز المميز"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Rows per page"
|
||||||
|
msgstr "صفوف لكل صفحة"
|
||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
||||||
msgstr "احفظ العنوان باستخدام مفتاح الإدخال أو الفاصلة. اتركه فارغًا لتعطيل إشعارات البريد الإشباكي."
|
msgstr "احفظ العنوان باستخدام مفتاح الإدخال أو الفاصلة. اتركه فارغًا لتعطيل إشعارات البريد الإشباكي."
|
||||||
@@ -686,8 +829,7 @@ msgstr "البحث عن الأنظمة أو الإعدادات..."
|
|||||||
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
||||||
msgstr "راجع <0>إعدادات الإشعارات</0> لتكوين كيفية تلقي التنبيهات."
|
msgstr "راجع <0>إعدادات الإشعارات</0> لتكوين كيفية تلقي التنبيهات."
|
||||||
|
|
||||||
#. Network bytes sent (upload)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Sent"
|
msgid "Sent"
|
||||||
msgstr "تم الإرسال"
|
msgstr "تم الإرسال"
|
||||||
|
|
||||||
@@ -718,6 +860,11 @@ msgstr "إعدادات SMTP"
|
|||||||
msgid "Sort By"
|
msgid "Sort By"
|
||||||
msgstr "الترتيب حسب"
|
msgstr "الترتيب حسب"
|
||||||
|
|
||||||
|
#. Context: alert state (active or resolved)
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "State"
|
||||||
|
msgstr "الحالة"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr "الحالة"
|
msgstr "الحالة"
|
||||||
@@ -733,10 +880,16 @@ msgstr "استخدام التبديل"
|
|||||||
#. System theme
|
#. System theme
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "النظام"
|
msgstr "النظام"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "System load averages over time"
|
||||||
|
msgstr "متوسط تحميل النظام مع مرور الوقت"
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Systems"
|
msgid "Systems"
|
||||||
msgstr "الأنظمة"
|
msgstr "الأنظمة"
|
||||||
@@ -759,6 +912,10 @@ msgstr "درجة الحرارة"
|
|||||||
msgid "Temperature"
|
msgid "Temperature"
|
||||||
msgstr "درجة الحرارة"
|
msgstr "درجة الحرارة"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Temperature unit"
|
||||||
|
msgstr "وحدة درجة الحرارة"
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Temperatures of system sensors"
|
msgid "Temperatures of system sensors"
|
||||||
msgstr "درجات حرارة مستشعرات النظام"
|
msgstr "درجات حرارة مستشعرات النظام"
|
||||||
@@ -779,6 +936,10 @@ msgstr "ثم قم بتسجيل الدخول إلى الواجهة الخلفية
|
|||||||
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
||||||
msgstr "لا يمكن التراجع عن هذا الإجراء. سيؤدي ذلك إلى حذف جميع السجلات الحالية لـ {name} من قاعدة البيانات بشكل دائم."
|
msgstr "لا يمكن التراجع عن هذا الإجراء. سيؤدي ذلك إلى حذف جميع السجلات الحالية لـ {name} من قاعدة البيانات بشكل دائم."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "This will permanently delete all selected records from the database."
|
||||||
|
msgstr "سيؤدي هذا إلى حذف جميع السجلات المحددة من قاعدة البيانات بشكل دائم."
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Throughput of {extraFsName}"
|
msgid "Throughput of {extraFsName}"
|
||||||
msgstr "معدل نقل {extraFsName}"
|
msgstr "معدل نقل {extraFsName}"
|
||||||
@@ -801,6 +962,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "تبديل السمة"
|
msgstr "تبديل السمة"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr "رمز مميز"
|
msgstr "رمز مميز"
|
||||||
|
|
||||||
@@ -818,9 +980,21 @@ msgstr "تسمح الرموز المميزة للوكلاء بالاتصال و
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr "تُستخدم الرموز المميزة والبصمات للمصادقة على اتصالات WebSocket إلى المحور."
|
msgstr "تُستخدم الرموز المميزة والبصمات للمصادقة على اتصالات WebSocket إلى المحور."
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 1 minute load average exceeds a threshold"
|
||||||
|
msgstr "يتم التفعيل عندما يتجاوز متوسط التحميل لمدة دقيقة واحدة عتبة معينة"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr "يتم التفعيل عندما يتجاوز متوسط التحميل لمدة 15 دقيقة عتبة معينة"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr "يتم التفعيل عندما يتجاوز متوسط التحميل لمدة 5 دقائق عتبة معينة"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "يتم التفعيل عندما يتجاوز أي مستشعر عتبة معينة"
|
msgstr "يتم التفعيل عندما <EFBFBD><EFBFBD>تجاوز أي مستشعر عتبة معينة"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when combined up/down exceeds a threshold"
|
msgid "Triggers when combined up/down exceeds a threshold"
|
||||||
@@ -842,6 +1016,11 @@ msgstr "يتم التفعيل عندما يتغير الحالة بين التش
|
|||||||
msgid "Triggers when usage of any disk exceeds a threshold"
|
msgid "Triggers when usage of any disk exceeds a threshold"
|
||||||
msgstr "يتم التفعيل عندما يتجاوز استخدام أي قرص عتبة معينة"
|
msgstr "يتم التفعيل عندما يتجاوز استخدام أي قرص عتبة معينة"
|
||||||
|
|
||||||
|
#. Temperature / network units
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Unit preferences"
|
||||||
|
msgstr "تفضيلات الوحدة"
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Universal token"
|
msgid "Universal token"
|
||||||
msgstr "رمز مميز عالمي"
|
msgstr "رمز مميز عالمي"
|
||||||
@@ -862,7 +1041,8 @@ msgstr "مدة التشغيل"
|
|||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
msgid "Usage"
|
msgid "Usage"
|
||||||
msgstr "الاستخدام"
|
msgstr "الاستخدام"
|
||||||
|
|
||||||
@@ -872,7 +1052,6 @@ msgstr "استخدام القسم الجذر"
|
|||||||
|
|
||||||
#: src/components/charts/swap-chart.tsx
|
#: src/components/charts/swap-chart.tsx
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Used"
|
msgid "Used"
|
||||||
msgstr "مستخدم"
|
msgstr "مستخدم"
|
||||||
|
|
||||||
@@ -881,10 +1060,18 @@ msgstr "مستخدم"
|
|||||||
msgid "Users"
|
msgid "Users"
|
||||||
msgstr "المستخدمون"
|
msgstr "المستخدمون"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Value"
|
||||||
|
msgstr "القيمة"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "View"
|
msgid "View"
|
||||||
msgstr "عرض"
|
msgstr "عرض"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "View your 200 most recent alerts."
|
||||||
|
msgstr "عرض أحدث 200 تنبيه."
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Visible Fields"
|
msgid "Visible Fields"
|
||||||
msgstr "الأعمدة الظاهرة"
|
msgstr "الأعمدة الظاهرة"
|
||||||
@@ -906,13 +1093,14 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr "عند التفعيل، يسمح هذا الرمز المميز للوكلاء بالتسجيل الذاتي دون إنشاء نظام مسبق. ينتهي بعد ساعة واحدة أو عند إعادة تشغيل المحور."
|
msgstr "عند التفعيل، يسمح هذا الرمز المميز للوكلاء بالتسجيل الذاتي دون إنشاء نظام مسبق. ينتهي بعد ساعة واحدة أو عند إعادة تشغيل المحور."
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "أمر Windows"
|
msgstr "أمر ويندوز"
|
||||||
|
|
||||||
#. Disk write
|
#. Disk write
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Write"
|
msgid "Write"
|
||||||
msgstr "كتابة"
|
msgstr "كتابة"
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ msgstr ""
|
|||||||
"Language: bg\n"
|
"Language: bg\n"
|
||||||
"Project-Id-Version: beszel\n"
|
"Project-Id-Version: beszel\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2025-03-06 07:27\n"
|
"PO-Revision-Date: 2025-07-25 22:44\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: Bulgarian\n"
|
"Language-Team: Bulgarian\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
@@ -23,6 +23,12 @@ msgstr ""
|
|||||||
msgid "{0, plural, one {# day} other {# days}}"
|
msgid "{0, plural, one {# day} other {# days}}"
|
||||||
msgstr "{0, plural, one {# ден} other {# дни}}"
|
msgstr "{0, plural, one {# ден} other {# дни}}"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
|
||||||
|
#. placeholder {1}: table.getFilteredRowModel().rows.length
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "{0} of {1} row(s) selected."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "{hours, plural, one {# hour} other {# hours}}"
|
msgid "{hours, plural, one {# hour} other {# hours}}"
|
||||||
msgstr "{hours, plural, one {# час} other {# часа}}"
|
msgstr "{hours, plural, one {# час} other {# часа}}"
|
||||||
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# час} other {# часа}}"
|
|||||||
msgid "1 hour"
|
msgid "1 hour"
|
||||||
msgstr "1 час"
|
msgstr "1 час"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "1 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "1 week"
|
msgid "1 week"
|
||||||
msgstr "1 седмица"
|
msgstr "1 седмица"
|
||||||
@@ -39,6 +50,11 @@ msgstr "1 седмица"
|
|||||||
msgid "12 hours"
|
msgid "12 hours"
|
||||||
msgstr "12 часа"
|
msgstr "12 часа"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "15 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "24 hours"
|
msgid "24 hours"
|
||||||
msgstr "24 часа"
|
msgstr "24 часа"
|
||||||
@@ -47,12 +63,22 @@ msgstr "24 часа"
|
|||||||
msgid "30 days"
|
msgid "30 days"
|
||||||
msgstr "30 дни"
|
msgstr "30 дни"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "5 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. Table column
|
#. Table column
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "Действия"
|
msgstr "Действия"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Active"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/home.tsx
|
#: src/components/routes/home.tsx
|
||||||
msgid "Active Alerts"
|
msgid "Active Alerts"
|
||||||
msgstr "Активни тревоги"
|
msgstr "Активни тревоги"
|
||||||
@@ -86,6 +112,12 @@ msgstr "Администратор"
|
|||||||
msgid "Agent"
|
msgid "Agent"
|
||||||
msgstr "Агент"
|
msgstr "Агент"
|
||||||
|
|
||||||
|
#: src/components/command-palette.tsx
|
||||||
|
#: src/components/routes/settings/layout.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Alert History"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
msgid "Alerts"
|
msgid "Alerts"
|
||||||
@@ -100,6 +132,10 @@ msgstr "Всички системи"
|
|||||||
msgid "Are you sure you want to delete {name}?"
|
msgid "Are you sure you want to delete {name}?"
|
||||||
msgstr "Сигурен ли си, че искаш да изтриеш {name}?"
|
msgstr "Сигурен ли си, че искаш да изтриеш {name}?"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Are you sure?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Automatic copy requires a secure context."
|
msgid "Automatic copy requires a secure context."
|
||||||
msgstr "Автоматичното копиране изисква защитен контескт."
|
msgstr "Автоматичното копиране изисква защитен контескт."
|
||||||
@@ -152,11 +188,22 @@ msgstr "Beszel ползва <0>Shoutrrr</0> за да се интегрира с
|
|||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
msgstr "Двоичен код"
|
msgstr "Двоичен код"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bits (Kbps, Mbps, Gbps)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bytes (KB/s, MB/s, GB/s)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
msgid "Cache / Buffers"
|
msgid "Cache / Buffers"
|
||||||
msgstr "Кеш / Буфери"
|
msgstr "Кеш / Буфери"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Откажи"
|
msgstr "Откажи"
|
||||||
|
|
||||||
@@ -164,6 +211,14 @@ msgstr "Откажи"
|
|||||||
msgid "Caution - potential data loss"
|
msgid "Caution - potential data loss"
|
||||||
msgstr "Внимание - възможност за загуба на данни"
|
msgstr "Внимание - възможност за загуба на данни"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Celsius (°C)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Change display units for metrics."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Change general application options."
|
msgid "Change general application options."
|
||||||
msgstr "Смени общите опции на приложението."
|
msgstr "Смени общите опции на приложението."
|
||||||
@@ -202,7 +257,12 @@ msgstr "Настрой как получаваш нотификации за т
|
|||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr "Потвърди парола"
|
msgstr "Потвърди парола"
|
||||||
|
|
||||||
|
#: src/components/routes/home.tsx
|
||||||
|
msgid "Connection is down"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Continue"
|
msgid "Continue"
|
||||||
msgstr "Продължи"
|
msgstr "Продължи"
|
||||||
|
|
||||||
@@ -211,11 +271,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Записано в клипборда"
|
msgstr "Записано в клипборда"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Копирай docker compose"
|
msgstr "Копирай docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Копирай docker run"
|
msgstr "Копирай docker run"
|
||||||
@@ -230,9 +292,14 @@ msgid "Copy host"
|
|||||||
msgstr "Копирай хоста"
|
msgstr "Копирай хоста"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Копирай linux командата"
|
msgstr "Копирай linux командата"
|
||||||
|
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Copy name"
|
||||||
|
msgstr "Копирай име"
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Copy text"
|
msgid "Copy text"
|
||||||
msgstr "Копирай текста"
|
msgstr "Копирай текста"
|
||||||
@@ -255,7 +322,7 @@ msgstr "Процесор"
|
|||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "CPU Usage"
|
msgid "CPU Usage"
|
||||||
msgstr "Употреба на процесор"
|
msgstr "Употреба на процесор"
|
||||||
|
|
||||||
@@ -263,6 +330,11 @@ msgstr "Употреба на процесор"
|
|||||||
msgid "Create account"
|
msgid "Create account"
|
||||||
msgstr "Създай акаунт"
|
msgstr "Създай акаунт"
|
||||||
|
|
||||||
|
#. Context: date created
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Created"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. Dark theme
|
#. Dark theme
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
@@ -278,6 +350,7 @@ msgid "Default time period"
|
|||||||
msgstr "Времеви диапазон по подразбиране"
|
msgstr "Времеви диапазон по подразбиране"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Изтрий"
|
msgstr "Изтрий"
|
||||||
|
|
||||||
@@ -293,6 +366,10 @@ msgstr "Диск"
|
|||||||
msgid "Disk I/O"
|
msgid "Disk I/O"
|
||||||
msgstr "Диск I/O"
|
msgstr "Диск I/O"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Disk unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/disk-chart.tsx
|
#: src/components/charts/disk-chart.tsx
|
||||||
@@ -321,11 +398,16 @@ msgstr "Документация"
|
|||||||
|
|
||||||
#. Context: System is down
|
#. Context: System is down
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Down"
|
msgid "Down"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Duration"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
@@ -351,6 +433,7 @@ msgstr "Въведи имейл адрес..."
|
|||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
#: src/components/login/auth-form.tsx
|
#: src/components/login/auth-form.tsx
|
||||||
msgid "Error"
|
msgid "Error"
|
||||||
msgstr "Грешка"
|
msgstr "Грешка"
|
||||||
@@ -366,6 +449,10 @@ msgstr "Надвишава {0}{1} в последните {2, plural, one {# м
|
|||||||
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
||||||
msgstr "Съществуващи системи които не са дефинирани в <0>config.yml</0> ще бъдат изтрити. Моля прави чести архиви."
|
msgstr "Съществуващи системи които не са дефинирани в <0>config.yml</0> ще бъдат изтрити. Моля прави чести архиви."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Export"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
msgid "Export configuration"
|
msgid "Export configuration"
|
||||||
msgstr "Експортирай конфигурация"
|
msgstr "Експортирай конфигурация"
|
||||||
@@ -374,6 +461,10 @@ msgstr "Експортирай конфигурация"
|
|||||||
msgid "Export your current systems configuration."
|
msgid "Export your current systems configuration."
|
||||||
msgstr "Експортирай конфигурацията на системите."
|
msgstr "Експортирай конфигурацията на системите."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Fahrenheit (°F)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Failed to authenticate"
|
msgid "Failed to authenticate"
|
||||||
msgstr "Неуспешно удостоверяване"
|
msgstr "Неуспешно удостоверяване"
|
||||||
@@ -393,9 +484,14 @@ msgstr "Неуспешно обнови тревога"
|
|||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Филтрирай..."
|
msgstr "Филтрирай..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "За <0>{min}</0> {min, plural, one {минута} other {минути}}"
|
msgstr "За <0>{min}</0> {min, plural, one {минута} other {минути}}"
|
||||||
@@ -419,6 +515,7 @@ msgid "Grid"
|
|||||||
msgstr "Мрежово"
|
msgstr "Мрежово"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Команда Homebrew"
|
msgstr "Команда Homebrew"
|
||||||
@@ -453,6 +550,27 @@ msgstr "Подреждане"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Светъл"
|
msgstr "Светъл"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "Load Average"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 1m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Short label for load average
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Load Avg"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Изход"
|
msgstr "Изход"
|
||||||
@@ -501,6 +619,7 @@ msgstr "Употреба на паметта"
|
|||||||
msgid "Memory usage of docker containers"
|
msgid "Memory usage of docker containers"
|
||||||
msgstr "Използването на памет от docker контейнерите"
|
msgstr "Използването на памет от docker контейнерите"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Име"
|
msgstr "Име"
|
||||||
@@ -517,10 +636,19 @@ msgstr "Мрежов трафик на docker контейнери"
|
|||||||
msgid "Network traffic of public interfaces"
|
msgid "Network traffic of public interfaces"
|
||||||
msgstr "Мрежов трафик на публични интерфейси"
|
msgstr "Мрежов трафик на публични интерфейси"
|
||||||
|
|
||||||
|
#. Context: Bytes or bits
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Network unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "No results found."
|
msgid "No results found."
|
||||||
msgstr "Няма намерени резултати."
|
msgstr "Няма намерени резултати."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "No results."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "No systems found."
|
msgid "No systems found."
|
||||||
@@ -558,6 +686,12 @@ msgstr "Презапиши съществуващи тревоги"
|
|||||||
msgid "Page"
|
msgid "Page"
|
||||||
msgstr "Страница"
|
msgstr "Страница"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getState().pagination.pageIndex + 1
|
||||||
|
#. placeholder {1}: table.getPageCount()
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Page {0} of {1}"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "Pages / Settings"
|
msgid "Pages / Settings"
|
||||||
msgstr "Страници / Настройки"
|
msgstr "Страници / Настройки"
|
||||||
@@ -639,13 +773,12 @@ msgid "Public Key"
|
|||||||
msgstr "Публичен ключ"
|
msgstr "Публичен ключ"
|
||||||
|
|
||||||
#. Disk read
|
#. Disk read
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Read"
|
msgid "Read"
|
||||||
msgstr "Прочети"
|
msgstr "Прочети"
|
||||||
|
|
||||||
#. Network bytes received (download)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Received"
|
msgid "Received"
|
||||||
msgstr "Получени"
|
msgstr "Получени"
|
||||||
|
|
||||||
@@ -653,6 +786,12 @@ msgstr "Получени"
|
|||||||
msgid "Reset Password"
|
msgid "Reset Password"
|
||||||
msgstr "Нулиране на парола"
|
msgstr "Нулиране на парола"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Resolved"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Resume"
|
msgid "Resume"
|
||||||
msgstr "Възобнови"
|
msgstr "Възобнови"
|
||||||
@@ -661,6 +800,10 @@ msgstr "Възобнови"
|
|||||||
msgid "Rotate token"
|
msgid "Rotate token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Rows per page"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
||||||
msgstr "Запази адреса с enter или запетая. Остави празно за да изключиш нотификациите чрез имейл."
|
msgstr "Запази адреса с enter или запетая. Остави празно за да изключиш нотификациите чрез имейл."
|
||||||
@@ -686,8 +829,7 @@ msgstr "Търси за системи или настройки..."
|
|||||||
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
||||||
msgstr "Виж <0>настройките за нотификациите</0> за да конфигурираш как получаваш тревоги."
|
msgstr "Виж <0>настройките за нотификациите</0> за да конфигурираш как получаваш тревоги."
|
||||||
|
|
||||||
#. Network bytes sent (upload)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Sent"
|
msgid "Sent"
|
||||||
msgstr "Изпратени"
|
msgstr "Изпратени"
|
||||||
|
|
||||||
@@ -718,6 +860,11 @@ msgstr "Настройки за SMTP"
|
|||||||
msgid "Sort By"
|
msgid "Sort By"
|
||||||
msgstr "Сортиране по"
|
msgstr "Сортиране по"
|
||||||
|
|
||||||
|
#. Context: alert state (active or resolved)
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "State"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr "Статус"
|
msgstr "Статус"
|
||||||
@@ -733,10 +880,16 @@ msgstr "Използване на swap"
|
|||||||
#. System theme
|
#. System theme
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Система"
|
msgstr "Система"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "System load averages over time"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Systems"
|
msgid "Systems"
|
||||||
msgstr "Системи"
|
msgstr "Системи"
|
||||||
@@ -759,6 +912,10 @@ msgstr ""
|
|||||||
msgid "Temperature"
|
msgid "Temperature"
|
||||||
msgstr "Температура"
|
msgstr "Температура"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Temperature unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Temperatures of system sensors"
|
msgid "Temperatures of system sensors"
|
||||||
msgstr "Температири на системни сензори"
|
msgstr "Температири на системни сензори"
|
||||||
@@ -779,6 +936,10 @@ msgstr "След това влез в backend-а и нулирай парола
|
|||||||
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
||||||
msgstr "Това действие не може да бъде отменено. Това ще изтрие всички записи за {name} от датабазата."
|
msgstr "Това действие не може да бъде отменено. Това ще изтрие всички записи за {name} от датабазата."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "This will permanently delete all selected records from the database."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Throughput of {extraFsName}"
|
msgid "Throughput of {extraFsName}"
|
||||||
msgstr "Пропускателна способност на {extraFsName}"
|
msgstr "Пропускателна способност на {extraFsName}"
|
||||||
@@ -801,6 +962,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Включи тема"
|
msgstr "Включи тема"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -818,6 +980,18 @@ msgstr ""
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 1 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Задейства се, когато някой даден сензор надвиши зададен праг"
|
msgstr "Задейства се, когато някой даден сензор надвиши зададен праг"
|
||||||
@@ -842,6 +1016,11 @@ msgstr "Задейства се, когато статуса превключв
|
|||||||
msgid "Triggers when usage of any disk exceeds a threshold"
|
msgid "Triggers when usage of any disk exceeds a threshold"
|
||||||
msgstr "Задейства се, когато употребата на някой диск надивши зададен праг"
|
msgstr "Задейства се, когато употребата на някой диск надивши зададен праг"
|
||||||
|
|
||||||
|
#. Temperature / network units
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Unit preferences"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Universal token"
|
msgid "Universal token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -862,7 +1041,8 @@ msgstr "Време на работа"
|
|||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
msgid "Usage"
|
msgid "Usage"
|
||||||
msgstr "Употреба"
|
msgstr "Употреба"
|
||||||
|
|
||||||
@@ -872,7 +1052,6 @@ msgstr "Употреба на root partition-а"
|
|||||||
|
|
||||||
#: src/components/charts/swap-chart.tsx
|
#: src/components/charts/swap-chart.tsx
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Used"
|
msgid "Used"
|
||||||
msgstr "Използвани"
|
msgstr "Използвани"
|
||||||
|
|
||||||
@@ -881,10 +1060,18 @@ msgstr "Използвани"
|
|||||||
msgid "Users"
|
msgid "Users"
|
||||||
msgstr "Потребители"
|
msgstr "Потребители"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Value"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "View"
|
msgid "View"
|
||||||
msgstr "Изглед"
|
msgstr "Изглед"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "View your 200 most recent alerts."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Visible Fields"
|
msgid "Visible Fields"
|
||||||
msgstr "Видими полета"
|
msgstr "Видими полета"
|
||||||
@@ -906,13 +1093,14 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Команда Windows"
|
msgstr "Команда Windows"
|
||||||
|
|
||||||
#. Disk write
|
#. Disk write
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Write"
|
msgid "Write"
|
||||||
msgstr "Запиши"
|
msgstr "Запиши"
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ msgstr ""
|
|||||||
"Language: cs\n"
|
"Language: cs\n"
|
||||||
"Project-Id-Version: beszel\n"
|
"Project-Id-Version: beszel\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2025-03-14 00:50\n"
|
"PO-Revision-Date: 2025-07-25 22:44\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: Czech\n"
|
"Language-Team: Czech\n"
|
||||||
"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n"
|
"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n"
|
||||||
@@ -23,6 +23,12 @@ msgstr ""
|
|||||||
msgid "{0, plural, one {# day} other {# days}}"
|
msgid "{0, plural, one {# day} other {# days}}"
|
||||||
msgstr "{0, plural, one {# den} few {# dny} other {# dní}}"
|
msgstr "{0, plural, one {# den} few {# dny} other {# dní}}"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
|
||||||
|
#. placeholder {1}: table.getFilteredRowModel().rows.length
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "{0} of {1} row(s) selected."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "{hours, plural, one {# hour} other {# hours}}"
|
msgid "{hours, plural, one {# hour} other {# hours}}"
|
||||||
msgstr "{hours, plural, one {# Hodina} few {# Hodiny} many {# Hodin} other {# Hodin}}"
|
msgstr "{hours, plural, one {# Hodina} few {# Hodiny} many {# Hodin} other {# Hodin}}"
|
||||||
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# Hodina} few {# Hodiny} many {# Hodin} other {# Ho
|
|||||||
msgid "1 hour"
|
msgid "1 hour"
|
||||||
msgstr "1 hodina"
|
msgstr "1 hodina"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "1 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "1 week"
|
msgid "1 week"
|
||||||
msgstr "1 týden"
|
msgstr "1 týden"
|
||||||
@@ -39,6 +50,11 @@ msgstr "1 týden"
|
|||||||
msgid "12 hours"
|
msgid "12 hours"
|
||||||
msgstr "12 hodin"
|
msgstr "12 hodin"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "15 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "24 hours"
|
msgid "24 hours"
|
||||||
msgstr "24 hodin"
|
msgstr "24 hodin"
|
||||||
@@ -47,12 +63,22 @@ msgstr "24 hodin"
|
|||||||
msgid "30 days"
|
msgid "30 days"
|
||||||
msgstr "30 dní"
|
msgstr "30 dní"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "5 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. Table column
|
#. Table column
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "Akce"
|
msgstr "Akce"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Active"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/home.tsx
|
#: src/components/routes/home.tsx
|
||||||
msgid "Active Alerts"
|
msgid "Active Alerts"
|
||||||
msgstr "Aktivní výstrahy"
|
msgstr "Aktivní výstrahy"
|
||||||
@@ -86,6 +112,12 @@ msgstr "Admin"
|
|||||||
msgid "Agent"
|
msgid "Agent"
|
||||||
msgstr "Agent"
|
msgstr "Agent"
|
||||||
|
|
||||||
|
#: src/components/command-palette.tsx
|
||||||
|
#: src/components/routes/settings/layout.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Alert History"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
msgid "Alerts"
|
msgid "Alerts"
|
||||||
@@ -100,6 +132,10 @@ msgstr "Všechny systémy"
|
|||||||
msgid "Are you sure you want to delete {name}?"
|
msgid "Are you sure you want to delete {name}?"
|
||||||
msgstr "Opravdu chcete odstranit {name}?"
|
msgstr "Opravdu chcete odstranit {name}?"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Are you sure?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Automatic copy requires a secure context."
|
msgid "Automatic copy requires a secure context."
|
||||||
msgstr "Automatická kopie vyžaduje zabezpečený kontext."
|
msgstr "Automatická kopie vyžaduje zabezpečený kontext."
|
||||||
@@ -152,11 +188,22 @@ msgstr "Beszel používá <0>Shoutrrr</0> k integraci s populárními notifikač
|
|||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
msgstr "Binary"
|
msgstr "Binary"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bits (Kbps, Mbps, Gbps)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bytes (KB/s, MB/s, GB/s)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
msgid "Cache / Buffers"
|
msgid "Cache / Buffers"
|
||||||
msgstr "Cache / vyrovnávací paměť"
|
msgstr "Cache / vyrovnávací paměť"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Zrušit"
|
msgstr "Zrušit"
|
||||||
|
|
||||||
@@ -164,6 +211,14 @@ msgstr "Zrušit"
|
|||||||
msgid "Caution - potential data loss"
|
msgid "Caution - potential data loss"
|
||||||
msgstr "Upozornění - možná ztráta dat"
|
msgstr "Upozornění - možná ztráta dat"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Celsius (°C)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Change display units for metrics."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Change general application options."
|
msgid "Change general application options."
|
||||||
msgstr "Změnit obecné nastavení aplikace."
|
msgstr "Změnit obecné nastavení aplikace."
|
||||||
@@ -202,7 +257,12 @@ msgstr "Konfigurace způsobu přijímání upozornění."
|
|||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr "Potvrdit heslo"
|
msgstr "Potvrdit heslo"
|
||||||
|
|
||||||
|
#: src/components/routes/home.tsx
|
||||||
|
msgid "Connection is down"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Continue"
|
msgid "Continue"
|
||||||
msgstr "Pokračovat"
|
msgstr "Pokračovat"
|
||||||
|
|
||||||
@@ -211,14 +271,16 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Zkopírováno do schránky"
|
msgstr "Zkopírováno do schránky"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Kopírovat docker compose"
|
msgstr "Kopírovat docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr ""
|
msgstr "Zkopírovat příkaz na spuštění dockeru"
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Environment variables"
|
msgctxt "Environment variables"
|
||||||
@@ -230,9 +292,14 @@ msgid "Copy host"
|
|||||||
msgstr "Kopírovat hostitele"
|
msgstr "Kopírovat hostitele"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Kopírovat příkaz Linux"
|
msgstr "Kopírovat příkaz Linux"
|
||||||
|
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Copy name"
|
||||||
|
msgstr "Kopírovat název"
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Copy text"
|
msgid "Copy text"
|
||||||
msgstr "Kopírovat text"
|
msgstr "Kopírovat text"
|
||||||
@@ -255,7 +322,7 @@ msgstr "Procesor"
|
|||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "CPU Usage"
|
msgid "CPU Usage"
|
||||||
msgstr "Využití procesoru"
|
msgstr "Využití procesoru"
|
||||||
|
|
||||||
@@ -263,6 +330,11 @@ msgstr "Využití procesoru"
|
|||||||
msgid "Create account"
|
msgid "Create account"
|
||||||
msgstr "Vytvořit účet"
|
msgstr "Vytvořit účet"
|
||||||
|
|
||||||
|
#. Context: date created
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Created"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. Dark theme
|
#. Dark theme
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
@@ -278,6 +350,7 @@ msgid "Default time period"
|
|||||||
msgstr "Výchozí doba"
|
msgstr "Výchozí doba"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Odstranit"
|
msgstr "Odstranit"
|
||||||
|
|
||||||
@@ -293,6 +366,10 @@ msgstr "Disk"
|
|||||||
msgid "Disk I/O"
|
msgid "Disk I/O"
|
||||||
msgstr "Disk I/O"
|
msgstr "Disk I/O"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Disk unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/disk-chart.tsx
|
#: src/components/charts/disk-chart.tsx
|
||||||
@@ -321,11 +398,16 @@ msgstr "Dokumentace"
|
|||||||
|
|
||||||
#. Context: System is down
|
#. Context: System is down
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Down"
|
msgid "Down"
|
||||||
msgstr "Nefunkční"
|
msgstr "Nefunkční"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Duration"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
@@ -351,6 +433,7 @@ msgstr "Zadejte e-mailovou adresu..."
|
|||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
#: src/components/login/auth-form.tsx
|
#: src/components/login/auth-form.tsx
|
||||||
msgid "Error"
|
msgid "Error"
|
||||||
msgstr "Chyba"
|
msgstr "Chyba"
|
||||||
@@ -366,6 +449,10 @@ msgstr "Překračuje {0}{1} za {2, plural, one {poslední # minutu} few {posledn
|
|||||||
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
||||||
msgstr "Stávající systémy, které nejsou definovány v <0>config.yml</0>, budou odstraněny. Provádějte pravidelné zálohování."
|
msgstr "Stávající systémy, které nejsou definovány v <0>config.yml</0>, budou odstraněny. Provádějte pravidelné zálohování."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Export"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
msgid "Export configuration"
|
msgid "Export configuration"
|
||||||
msgstr "Exportovat konfiguraci"
|
msgstr "Exportovat konfiguraci"
|
||||||
@@ -374,6 +461,10 @@ msgstr "Exportovat konfiguraci"
|
|||||||
msgid "Export your current systems configuration."
|
msgid "Export your current systems configuration."
|
||||||
msgstr "Exportovat aktuální konfiguraci systémů."
|
msgstr "Exportovat aktuální konfiguraci systémů."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Fahrenheit (°F)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Failed to authenticate"
|
msgid "Failed to authenticate"
|
||||||
msgstr "Ověření se nezdařilo"
|
msgstr "Ověření se nezdařilo"
|
||||||
@@ -393,9 +484,14 @@ msgstr "Nepodařilo se aktualizovat upozornění"
|
|||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Filtr..."
|
msgstr "Filtr..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "Za <0>{min}</0> {min, plural, one {minutu} few {minuty} other {minut}}"
|
msgstr "Za <0>{min}</0> {min, plural, one {minutu} few {minuty} other {minut}}"
|
||||||
@@ -419,9 +515,10 @@ msgid "Grid"
|
|||||||
msgstr "Mřížka"
|
msgstr "Mřížka"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr ""
|
msgstr "Homebrew příkaz"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Host / IP"
|
msgid "Host / IP"
|
||||||
@@ -453,6 +550,27 @@ msgstr "Rozvržení"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Světlý"
|
msgstr "Světlý"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "Load Average"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 1m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Short label for load average
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Load Avg"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Odhlásit"
|
msgstr "Odhlásit"
|
||||||
@@ -501,6 +619,7 @@ msgstr "Využití paměti"
|
|||||||
msgid "Memory usage of docker containers"
|
msgid "Memory usage of docker containers"
|
||||||
msgstr "Využití paměti docker kontejnerů"
|
msgstr "Využití paměti docker kontejnerů"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Název"
|
msgstr "Název"
|
||||||
@@ -517,10 +636,19 @@ msgstr "Síťový provoz kontejnerů docker"
|
|||||||
msgid "Network traffic of public interfaces"
|
msgid "Network traffic of public interfaces"
|
||||||
msgstr "Síťový provoz veřejných rozhraní"
|
msgstr "Síťový provoz veřejných rozhraní"
|
||||||
|
|
||||||
|
#. Context: Bytes or bits
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Network unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "No results found."
|
msgid "No results found."
|
||||||
msgstr "Nenalezeny žádné výskyty."
|
msgstr "Nenalezeny žádné výskyty."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "No results."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "No systems found."
|
msgid "No systems found."
|
||||||
@@ -558,6 +686,12 @@ msgstr "Přepsat existující upozornění"
|
|||||||
msgid "Page"
|
msgid "Page"
|
||||||
msgstr "Stránka"
|
msgstr "Stránka"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getState().pagination.pageIndex + 1
|
||||||
|
#. placeholder {1}: table.getPageCount()
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Page {0} of {1}"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "Pages / Settings"
|
msgid "Pages / Settings"
|
||||||
msgstr "Stránky / Nastavení"
|
msgstr "Stránky / Nastavení"
|
||||||
@@ -639,13 +773,12 @@ msgid "Public Key"
|
|||||||
msgstr "Veřejný klíč"
|
msgstr "Veřejný klíč"
|
||||||
|
|
||||||
#. Disk read
|
#. Disk read
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Read"
|
msgid "Read"
|
||||||
msgstr "Číst"
|
msgstr "Číst"
|
||||||
|
|
||||||
#. Network bytes received (download)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Received"
|
msgid "Received"
|
||||||
msgstr "Přijato"
|
msgstr "Přijato"
|
||||||
|
|
||||||
@@ -653,6 +786,12 @@ msgstr "Přijato"
|
|||||||
msgid "Reset Password"
|
msgid "Reset Password"
|
||||||
msgstr "Obnovit heslo"
|
msgstr "Obnovit heslo"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Resolved"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Resume"
|
msgid "Resume"
|
||||||
msgstr "Pokračovat"
|
msgstr "Pokračovat"
|
||||||
@@ -661,6 +800,10 @@ msgstr "Pokračovat"
|
|||||||
msgid "Rotate token"
|
msgid "Rotate token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Rows per page"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
||||||
msgstr "Adresu uložte pomocí klávesy enter nebo čárky. Pro deaktivaci e-mailových oznámení ponechte prázdné pole."
|
msgstr "Adresu uložte pomocí klávesy enter nebo čárky. Pro deaktivaci e-mailových oznámení ponechte prázdné pole."
|
||||||
@@ -686,8 +829,7 @@ msgstr "Hledat systémy nebo nastavení..."
|
|||||||
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
||||||
msgstr "Podívejte se na <0>nastavení upozornění</0> pro nastavení toho, jak přijímáte upozornění."
|
msgstr "Podívejte se na <0>nastavení upozornění</0> pro nastavení toho, jak přijímáte upozornění."
|
||||||
|
|
||||||
#. Network bytes sent (upload)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Sent"
|
msgid "Sent"
|
||||||
msgstr "Odeslat"
|
msgstr "Odeslat"
|
||||||
|
|
||||||
@@ -718,6 +860,11 @@ msgstr "Nastavení SMTP"
|
|||||||
msgid "Sort By"
|
msgid "Sort By"
|
||||||
msgstr "Seřadit podle"
|
msgstr "Seřadit podle"
|
||||||
|
|
||||||
|
#. Context: alert state (active or resolved)
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "State"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr "Stav"
|
msgstr "Stav"
|
||||||
@@ -733,10 +880,16 @@ msgstr "Swap využití"
|
|||||||
#. System theme
|
#. System theme
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Systém"
|
msgstr "Systém"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "System load averages over time"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Systems"
|
msgid "Systems"
|
||||||
msgstr "Systémy"
|
msgstr "Systémy"
|
||||||
@@ -759,6 +912,10 @@ msgstr "Teplota"
|
|||||||
msgid "Temperature"
|
msgid "Temperature"
|
||||||
msgstr "Teplota"
|
msgstr "Teplota"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Temperature unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Temperatures of system sensors"
|
msgid "Temperatures of system sensors"
|
||||||
msgstr "Teploty systémových senzorů"
|
msgstr "Teploty systémových senzorů"
|
||||||
@@ -779,6 +936,10 @@ msgstr "Poté se přihlaste do backendu a obnovte heslo k uživatelskému účtu
|
|||||||
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
||||||
msgstr "Tuto akci nelze vzít zpět. Tím se z databáze trvale odstraní všechny aktuální záznamy pro {name}."
|
msgstr "Tuto akci nelze vzít zpět. Tím se z databáze trvale odstraní všechny aktuální záznamy pro {name}."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "This will permanently delete all selected records from the database."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Throughput of {extraFsName}"
|
msgid "Throughput of {extraFsName}"
|
||||||
msgstr "Propustnost {extraFsName}"
|
msgstr "Propustnost {extraFsName}"
|
||||||
@@ -801,6 +962,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Přepnout motiv"
|
msgstr "Přepnout motiv"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -818,6 +980,18 @@ msgstr ""
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 1 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Spustí se, když některý senzor překročí prahovou hodnotu"
|
msgstr "Spustí se, když některý senzor překročí prahovou hodnotu"
|
||||||
@@ -842,6 +1016,11 @@ msgstr "Spouští se, když se změní dostupnost"
|
|||||||
msgid "Triggers when usage of any disk exceeds a threshold"
|
msgid "Triggers when usage of any disk exceeds a threshold"
|
||||||
msgstr "Spustí se, když využití disku překročí prahovou hodnotu"
|
msgstr "Spustí se, když využití disku překročí prahovou hodnotu"
|
||||||
|
|
||||||
|
#. Temperature / network units
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Unit preferences"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Universal token"
|
msgid "Universal token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -862,7 +1041,8 @@ msgstr "Doba provozu"
|
|||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
msgid "Usage"
|
msgid "Usage"
|
||||||
msgstr "Využití"
|
msgstr "Využití"
|
||||||
|
|
||||||
@@ -872,7 +1052,6 @@ msgstr "Využití kořenového oddílu"
|
|||||||
|
|
||||||
#: src/components/charts/swap-chart.tsx
|
#: src/components/charts/swap-chart.tsx
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Used"
|
msgid "Used"
|
||||||
msgstr "Využito"
|
msgstr "Využito"
|
||||||
|
|
||||||
@@ -881,10 +1060,18 @@ msgstr "Využito"
|
|||||||
msgid "Users"
|
msgid "Users"
|
||||||
msgstr "Uživatelé"
|
msgstr "Uživatelé"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Value"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "View"
|
msgid "View"
|
||||||
msgstr "Zobrazení"
|
msgstr "Zobrazení"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "View your 200 most recent alerts."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Visible Fields"
|
msgid "Visible Fields"
|
||||||
msgstr "Viditelné sloupce"
|
msgstr "Viditelné sloupce"
|
||||||
@@ -906,13 +1093,14 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr ""
|
msgstr "Windows příkaz"
|
||||||
|
|
||||||
#. Disk write
|
#. Disk write
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Write"
|
msgid "Write"
|
||||||
msgstr "Psát"
|
msgstr "Psát"
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ msgstr ""
|
|||||||
"Language: da\n"
|
"Language: da\n"
|
||||||
"Project-Id-Version: beszel\n"
|
"Project-Id-Version: beszel\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2025-03-06 07:27\n"
|
"PO-Revision-Date: 2025-07-25 22:44\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: Danish\n"
|
"Language-Team: Danish\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
@@ -23,6 +23,12 @@ msgstr ""
|
|||||||
msgid "{0, plural, one {# day} other {# days}}"
|
msgid "{0, plural, one {# day} other {# days}}"
|
||||||
msgstr "{0, plural, one {# day} other {# days}}"
|
msgstr "{0, plural, one {# day} other {# days}}"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
|
||||||
|
#. placeholder {1}: table.getFilteredRowModel().rows.length
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "{0} of {1} row(s) selected."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "{hours, plural, one {# hour} other {# hours}}"
|
msgid "{hours, plural, one {# hour} other {# hours}}"
|
||||||
msgstr "{hours, plural, one {# hour} other {# hours}}"
|
msgstr "{hours, plural, one {# hour} other {# hours}}"
|
||||||
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# hour} other {# hours}}"
|
|||||||
msgid "1 hour"
|
msgid "1 hour"
|
||||||
msgstr "1 time"
|
msgstr "1 time"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "1 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "1 week"
|
msgid "1 week"
|
||||||
msgstr "1 uge"
|
msgstr "1 uge"
|
||||||
@@ -39,6 +50,11 @@ msgstr "1 uge"
|
|||||||
msgid "12 hours"
|
msgid "12 hours"
|
||||||
msgstr "12 timer"
|
msgstr "12 timer"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "15 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "24 hours"
|
msgid "24 hours"
|
||||||
msgstr "24 timer"
|
msgstr "24 timer"
|
||||||
@@ -47,12 +63,22 @@ msgstr "24 timer"
|
|||||||
msgid "30 days"
|
msgid "30 days"
|
||||||
msgstr "30 dage"
|
msgstr "30 dage"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "5 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. Table column
|
#. Table column
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "Handlinger"
|
msgstr "Handlinger"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Active"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/home.tsx
|
#: src/components/routes/home.tsx
|
||||||
msgid "Active Alerts"
|
msgid "Active Alerts"
|
||||||
msgstr "Aktive Alarmer"
|
msgstr "Aktive Alarmer"
|
||||||
@@ -86,6 +112,12 @@ msgstr "Admin"
|
|||||||
msgid "Agent"
|
msgid "Agent"
|
||||||
msgstr "Agent"
|
msgstr "Agent"
|
||||||
|
|
||||||
|
#: src/components/command-palette.tsx
|
||||||
|
#: src/components/routes/settings/layout.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Alert History"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
msgid "Alerts"
|
msgid "Alerts"
|
||||||
@@ -100,6 +132,10 @@ msgstr "Alle systemer"
|
|||||||
msgid "Are you sure you want to delete {name}?"
|
msgid "Are you sure you want to delete {name}?"
|
||||||
msgstr "Er du sikker på, at du vil slette {name}?"
|
msgstr "Er du sikker på, at du vil slette {name}?"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Are you sure?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Automatic copy requires a secure context."
|
msgid "Automatic copy requires a secure context."
|
||||||
msgstr "Automatisk kopiering kræver en sikker kontekst."
|
msgstr "Automatisk kopiering kræver en sikker kontekst."
|
||||||
@@ -152,11 +188,22 @@ msgstr "Beszel bruger <0>Shoutrrr</0> til at integrere med populære notifikatio
|
|||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
msgstr "Binær"
|
msgstr "Binær"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bits (Kbps, Mbps, Gbps)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bytes (KB/s, MB/s, GB/s)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
msgid "Cache / Buffers"
|
msgid "Cache / Buffers"
|
||||||
msgstr "Cache / Buffere"
|
msgstr "Cache / Buffere"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Fortryd"
|
msgstr "Fortryd"
|
||||||
|
|
||||||
@@ -164,6 +211,14 @@ msgstr "Fortryd"
|
|||||||
msgid "Caution - potential data loss"
|
msgid "Caution - potential data loss"
|
||||||
msgstr "Forsigtig - muligt tab af data"
|
msgstr "Forsigtig - muligt tab af data"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Celsius (°C)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Change display units for metrics."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Change general application options."
|
msgid "Change general application options."
|
||||||
msgstr "Skift generelle applikationsindstillinger."
|
msgstr "Skift generelle applikationsindstillinger."
|
||||||
@@ -202,7 +257,12 @@ msgstr "Konfigurer hvordan du modtager advarselsmeddelelser."
|
|||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr "Bekræft adgangskode"
|
msgstr "Bekræft adgangskode"
|
||||||
|
|
||||||
|
#: src/components/routes/home.tsx
|
||||||
|
msgid "Connection is down"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Continue"
|
msgid "Continue"
|
||||||
msgstr "Forsæt"
|
msgstr "Forsæt"
|
||||||
|
|
||||||
@@ -211,11 +271,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Kopieret til udklipsholder"
|
msgstr "Kopieret til udklipsholder"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Kopiér docker compose"
|
msgstr "Kopiér docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Kopiér docker run"
|
msgstr "Kopiér docker run"
|
||||||
@@ -230,9 +292,14 @@ msgid "Copy host"
|
|||||||
msgstr "Kopier host"
|
msgstr "Kopier host"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Kopier Linux kommando"
|
msgstr "Kopier Linux kommando"
|
||||||
|
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Copy name"
|
||||||
|
msgstr "Kopier navn"
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Copy text"
|
msgid "Copy text"
|
||||||
msgstr "Kopier tekst"
|
msgstr "Kopier tekst"
|
||||||
@@ -255,7 +322,7 @@ msgstr "CPU"
|
|||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "CPU Usage"
|
msgid "CPU Usage"
|
||||||
msgstr "CPU forbrug"
|
msgstr "CPU forbrug"
|
||||||
|
|
||||||
@@ -263,6 +330,11 @@ msgstr "CPU forbrug"
|
|||||||
msgid "Create account"
|
msgid "Create account"
|
||||||
msgstr "Opret konto"
|
msgstr "Opret konto"
|
||||||
|
|
||||||
|
#. Context: date created
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Created"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. Dark theme
|
#. Dark theme
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
@@ -278,6 +350,7 @@ msgid "Default time period"
|
|||||||
msgstr "Standard tidsperiode"
|
msgstr "Standard tidsperiode"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Slet"
|
msgstr "Slet"
|
||||||
|
|
||||||
@@ -293,6 +366,10 @@ msgstr "Disk"
|
|||||||
msgid "Disk I/O"
|
msgid "Disk I/O"
|
||||||
msgstr "Disk I/O"
|
msgstr "Disk I/O"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Disk unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/disk-chart.tsx
|
#: src/components/charts/disk-chart.tsx
|
||||||
@@ -321,15 +398,20 @@ msgstr "Dokumentation"
|
|||||||
|
|
||||||
#. Context: System is down
|
#. Context: System is down
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Down"
|
msgid "Down"
|
||||||
|
msgstr "Nede"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Duration"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
msgstr ""
|
msgstr "Rediger"
|
||||||
|
|
||||||
#: src/components/login/forgot-pass-form.tsx
|
#: src/components/login/forgot-pass-form.tsx
|
||||||
#: src/components/login/auth-form.tsx
|
#: src/components/login/auth-form.tsx
|
||||||
@@ -351,6 +433,7 @@ msgstr "Indtast e-mailadresse..."
|
|||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
#: src/components/login/auth-form.tsx
|
#: src/components/login/auth-form.tsx
|
||||||
msgid "Error"
|
msgid "Error"
|
||||||
msgstr "Fejl"
|
msgstr "Fejl"
|
||||||
@@ -366,6 +449,10 @@ msgstr "Overskrider {0}{1} i sidste {2, plural, one {# minut} other {# minutter}
|
|||||||
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
||||||
msgstr "Eksisterende systemer ikke defineret i <0>config.yml</0> vil blive slettet. Opret venligst regelmæssige sikkerhedskopier."
|
msgstr "Eksisterende systemer ikke defineret i <0>config.yml</0> vil blive slettet. Opret venligst regelmæssige sikkerhedskopier."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Export"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
msgid "Export configuration"
|
msgid "Export configuration"
|
||||||
msgstr "Eksporter konfiguration"
|
msgstr "Eksporter konfiguration"
|
||||||
@@ -374,6 +461,10 @@ msgstr "Eksporter konfiguration"
|
|||||||
msgid "Export your current systems configuration."
|
msgid "Export your current systems configuration."
|
||||||
msgstr "Eksporter din nuværende systemkonfiguration."
|
msgstr "Eksporter din nuværende systemkonfiguration."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Fahrenheit (°F)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Failed to authenticate"
|
msgid "Failed to authenticate"
|
||||||
msgstr "Kunne ikke godkende"
|
msgstr "Kunne ikke godkende"
|
||||||
@@ -393,9 +484,14 @@ msgstr "Kunne ikke opdatere alarm"
|
|||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Filter..."
|
msgstr "Filter..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "For <0>{min}</0> {min, plural, one {minut} other {minutter}}"
|
msgstr "For <0>{min}</0> {min, plural, one {minut} other {minutter}}"
|
||||||
@@ -419,6 +515,7 @@ msgid "Grid"
|
|||||||
msgstr "Gitter"
|
msgstr "Gitter"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Homebrew-kommando"
|
msgstr "Homebrew-kommando"
|
||||||
@@ -453,6 +550,27 @@ msgstr "Layout"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Lys"
|
msgstr "Lys"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "Load Average"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 1m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Short label for load average
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Load Avg"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Log ud"
|
msgstr "Log ud"
|
||||||
@@ -481,7 +599,7 @@ msgstr "Administrer display og notifikationsindstillinger."
|
|||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Manual setup instructions"
|
msgid "Manual setup instructions"
|
||||||
msgstr ""
|
msgstr "Manuel opsætningsvejledning"
|
||||||
|
|
||||||
#. Chart select field. Please try to keep this short.
|
#. Chart select field. Please try to keep this short.
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
@@ -501,6 +619,7 @@ msgstr "Hukommelsesforbrug"
|
|||||||
msgid "Memory usage of docker containers"
|
msgid "Memory usage of docker containers"
|
||||||
msgstr "Hukommelsesforbrug af dockercontainere"
|
msgstr "Hukommelsesforbrug af dockercontainere"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Navn"
|
msgstr "Navn"
|
||||||
@@ -517,10 +636,19 @@ msgstr "Netværkstrafik af dockercontainere"
|
|||||||
msgid "Network traffic of public interfaces"
|
msgid "Network traffic of public interfaces"
|
||||||
msgstr "Netværkstrafik af offentlige grænseflader"
|
msgstr "Netværkstrafik af offentlige grænseflader"
|
||||||
|
|
||||||
|
#. Context: Bytes or bits
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Network unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "No results found."
|
msgid "No results found."
|
||||||
msgstr "Ingen resultater fundet."
|
msgstr "Ingen resultater fundet."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "No results."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "No systems found."
|
msgid "No systems found."
|
||||||
@@ -558,6 +686,12 @@ msgstr "Overskriv eksisterende alarmer"
|
|||||||
msgid "Page"
|
msgid "Page"
|
||||||
msgstr "Side"
|
msgstr "Side"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getState().pagination.pageIndex + 1
|
||||||
|
#. placeholder {1}: table.getPageCount()
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Page {0} of {1}"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "Pages / Settings"
|
msgid "Pages / Settings"
|
||||||
msgstr "Sider / Indstillinger"
|
msgstr "Sider / Indstillinger"
|
||||||
@@ -573,7 +707,7 @@ msgstr "Adgangskoden skal være på mindst 8 tegn."
|
|||||||
|
|
||||||
#: src/components/login/auth-form.tsx
|
#: src/components/login/auth-form.tsx
|
||||||
msgid "Password must be less than 72 bytes."
|
msgid "Password must be less than 72 bytes."
|
||||||
msgstr ""
|
msgstr "Adgangskoden skal være mindre end 72 bytes."
|
||||||
|
|
||||||
#: src/components/login/forgot-pass-form.tsx
|
#: src/components/login/forgot-pass-form.tsx
|
||||||
msgid "Password reset request received"
|
msgid "Password reset request received"
|
||||||
@@ -639,13 +773,12 @@ msgid "Public Key"
|
|||||||
msgstr "Offentlig nøgle"
|
msgstr "Offentlig nøgle"
|
||||||
|
|
||||||
#. Disk read
|
#. Disk read
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Read"
|
msgid "Read"
|
||||||
msgstr "Læs"
|
msgstr "Læs"
|
||||||
|
|
||||||
#. Network bytes received (download)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Received"
|
msgid "Received"
|
||||||
msgstr "Modtaget"
|
msgstr "Modtaget"
|
||||||
|
|
||||||
@@ -653,6 +786,12 @@ msgstr "Modtaget"
|
|||||||
msgid "Reset Password"
|
msgid "Reset Password"
|
||||||
msgstr "Nulstil adgangskode"
|
msgstr "Nulstil adgangskode"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Resolved"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Resume"
|
msgid "Resume"
|
||||||
msgstr "Genoptag"
|
msgstr "Genoptag"
|
||||||
@@ -661,6 +800,10 @@ msgstr "Genoptag"
|
|||||||
msgid "Rotate token"
|
msgid "Rotate token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Rows per page"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
||||||
msgstr "Gem adresse ved hjælp af enter eller komma. Lad feltet stå tomt for at deaktivere e-mail-meddelelser."
|
msgstr "Gem adresse ved hjælp af enter eller komma. Lad feltet stå tomt for at deaktivere e-mail-meddelelser."
|
||||||
@@ -672,7 +815,7 @@ msgstr "Gem indstillinger"
|
|||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Save system"
|
msgid "Save system"
|
||||||
msgstr ""
|
msgstr "Gem system"
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
@@ -686,8 +829,7 @@ msgstr "Søg efter systemer eller indstillinger..."
|
|||||||
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
||||||
msgstr "Se <0>meddelelsesindstillinger</0> for at konfigurere, hvordan du modtager alarmer."
|
msgstr "Se <0>meddelelsesindstillinger</0> for at konfigurere, hvordan du modtager alarmer."
|
||||||
|
|
||||||
#. Network bytes sent (upload)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Sent"
|
msgid "Sent"
|
||||||
msgstr "Sendt"
|
msgstr "Sendt"
|
||||||
|
|
||||||
@@ -718,6 +860,11 @@ msgstr "SMTP-indstillinger"
|
|||||||
msgid "Sort By"
|
msgid "Sort By"
|
||||||
msgstr "Sorter efter"
|
msgstr "Sorter efter"
|
||||||
|
|
||||||
|
#. Context: alert state (active or resolved)
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "State"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr "Status"
|
msgstr "Status"
|
||||||
@@ -733,10 +880,16 @@ msgstr "Swap forbrug"
|
|||||||
#. System theme
|
#. System theme
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "System"
|
msgstr "System"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "System load averages over time"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Systems"
|
msgid "Systems"
|
||||||
msgstr "Systemer"
|
msgstr "Systemer"
|
||||||
@@ -752,13 +905,17 @@ msgstr "Tabel"
|
|||||||
#. Temperature label in systems table
|
#. Temperature label in systems table
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Temp"
|
msgid "Temp"
|
||||||
msgstr ""
|
msgstr "Temperatur"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Temperature"
|
msgid "Temperature"
|
||||||
msgstr "Temperatur"
|
msgstr "Temperatur"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Temperature unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Temperatures of system sensors"
|
msgid "Temperatures of system sensors"
|
||||||
msgstr "Temperaturer i systemsensorer"
|
msgstr "Temperaturer i systemsensorer"
|
||||||
@@ -779,6 +936,10 @@ msgstr "Log derefter ind på backend og nulstil adgangskoden til din brugerkonto
|
|||||||
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
||||||
msgstr "Denne handling kan ikke fortrydes. Dette vil permanent slette alle aktuelle elementer for {name} fra databasen."
|
msgstr "Denne handling kan ikke fortrydes. Dette vil permanent slette alle aktuelle elementer for {name} fra databasen."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "This will permanently delete all selected records from the database."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Throughput of {extraFsName}"
|
msgid "Throughput of {extraFsName}"
|
||||||
msgstr "Gennemløb af {extraFsName}"
|
msgstr "Gennemløb af {extraFsName}"
|
||||||
@@ -801,6 +962,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Skift tema"
|
msgstr "Skift tema"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -818,6 +980,18 @@ msgstr ""
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 1 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Udløser når en sensor overstiger en tærskel"
|
msgstr "Udløser når en sensor overstiger en tærskel"
|
||||||
@@ -842,6 +1016,11 @@ msgstr "Udløser når status skifter mellem op og ned"
|
|||||||
msgid "Triggers when usage of any disk exceeds a threshold"
|
msgid "Triggers when usage of any disk exceeds a threshold"
|
||||||
msgstr "Udløser når brugen af en disk overstiger en tærskel"
|
msgstr "Udløser når brugen af en disk overstiger en tærskel"
|
||||||
|
|
||||||
|
#. Temperature / network units
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Unit preferences"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Universal token"
|
msgid "Universal token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -850,7 +1029,7 @@ msgstr ""
|
|||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Up"
|
msgid "Up"
|
||||||
msgstr ""
|
msgstr "Oppe"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Updated in real time. Click on a system to view information."
|
msgid "Updated in real time. Click on a system to view information."
|
||||||
@@ -862,7 +1041,8 @@ msgstr "Oppetid"
|
|||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
msgid "Usage"
|
msgid "Usage"
|
||||||
msgstr "Forbrug"
|
msgstr "Forbrug"
|
||||||
|
|
||||||
@@ -872,7 +1052,6 @@ msgstr "Brug af rodpartition"
|
|||||||
|
|
||||||
#: src/components/charts/swap-chart.tsx
|
#: src/components/charts/swap-chart.tsx
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Used"
|
msgid "Used"
|
||||||
msgstr "Brugt"
|
msgstr "Brugt"
|
||||||
|
|
||||||
@@ -881,10 +1060,18 @@ msgstr "Brugt"
|
|||||||
msgid "Users"
|
msgid "Users"
|
||||||
msgstr "Brugere"
|
msgstr "Brugere"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Value"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "View"
|
msgid "View"
|
||||||
msgstr "Vis"
|
msgstr "Vis"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "View your 200 most recent alerts."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Visible Fields"
|
msgid "Visible Fields"
|
||||||
msgstr "Synlige felter"
|
msgstr "Synlige felter"
|
||||||
@@ -906,13 +1093,14 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Windows-kommando"
|
msgstr "Windows-kommando"
|
||||||
|
|
||||||
#. Disk write
|
#. Disk write
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Write"
|
msgid "Write"
|
||||||
msgstr "Skriv"
|
msgstr "Skriv"
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ msgstr ""
|
|||||||
"Language: de\n"
|
"Language: de\n"
|
||||||
"Project-Id-Version: beszel\n"
|
"Project-Id-Version: beszel\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2025-03-06 07:27\n"
|
"PO-Revision-Date: 2025-07-25 22:44\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: German\n"
|
"Language-Team: German\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
@@ -23,6 +23,12 @@ msgstr ""
|
|||||||
msgid "{0, plural, one {# day} other {# days}}"
|
msgid "{0, plural, one {# day} other {# days}}"
|
||||||
msgstr "{0, plural, one {# Tag} other {# Tage}}"
|
msgstr "{0, plural, one {# Tag} other {# Tage}}"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
|
||||||
|
#. placeholder {1}: table.getFilteredRowModel().rows.length
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "{0} of {1} row(s) selected."
|
||||||
|
msgstr "{0} von {1} Zeile(n) ausgewählt."
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "{hours, plural, one {# hour} other {# hours}}"
|
msgid "{hours, plural, one {# hour} other {# hours}}"
|
||||||
msgstr "{hours, plural, one {# Stunde} other {# Stunden}}"
|
msgstr "{hours, plural, one {# Stunde} other {# Stunden}}"
|
||||||
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# Stunde} other {# Stunden}}"
|
|||||||
msgid "1 hour"
|
msgid "1 hour"
|
||||||
msgstr "1 Stunde"
|
msgstr "1 Stunde"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "1 min"
|
||||||
|
msgstr "1 Min"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "1 week"
|
msgid "1 week"
|
||||||
msgstr "1 Woche"
|
msgstr "1 Woche"
|
||||||
@@ -39,6 +50,11 @@ msgstr "1 Woche"
|
|||||||
msgid "12 hours"
|
msgid "12 hours"
|
||||||
msgstr "12 Stunden"
|
msgstr "12 Stunden"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "15 min"
|
||||||
|
msgstr "15 Min"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "24 hours"
|
msgid "24 hours"
|
||||||
msgstr "24 Stunden"
|
msgstr "24 Stunden"
|
||||||
@@ -47,12 +63,22 @@ msgstr "24 Stunden"
|
|||||||
msgid "30 days"
|
msgid "30 days"
|
||||||
msgstr "30 Tage"
|
msgstr "30 Tage"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "5 min"
|
||||||
|
msgstr "5 Min"
|
||||||
|
|
||||||
#. Table column
|
#. Table column
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "Aktionen"
|
msgstr "Aktionen"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Active"
|
||||||
|
msgstr "Aktiv"
|
||||||
|
|
||||||
#: src/components/routes/home.tsx
|
#: src/components/routes/home.tsx
|
||||||
msgid "Active Alerts"
|
msgid "Active Alerts"
|
||||||
msgstr "Aktive Warnungen"
|
msgstr "Aktive Warnungen"
|
||||||
@@ -86,6 +112,12 @@ msgstr "Admin"
|
|||||||
msgid "Agent"
|
msgid "Agent"
|
||||||
msgstr "Agent"
|
msgstr "Agent"
|
||||||
|
|
||||||
|
#: src/components/command-palette.tsx
|
||||||
|
#: src/components/routes/settings/layout.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Alert History"
|
||||||
|
msgstr "Alarm-Verlauf"
|
||||||
|
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
msgid "Alerts"
|
msgid "Alerts"
|
||||||
@@ -100,6 +132,10 @@ msgstr "Alle Systeme"
|
|||||||
msgid "Are you sure you want to delete {name}?"
|
msgid "Are you sure you want to delete {name}?"
|
||||||
msgstr "Möchtest du {name} wirklich löschen?"
|
msgstr "Möchtest du {name} wirklich löschen?"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Are you sure?"
|
||||||
|
msgstr "Bist du sicher?"
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Automatic copy requires a secure context."
|
msgid "Automatic copy requires a secure context."
|
||||||
msgstr "Automatisches Kopieren erfordert einen sicheren Kontext."
|
msgstr "Automatisches Kopieren erfordert einen sicheren Kontext."
|
||||||
@@ -152,11 +188,22 @@ msgstr "Beszel verwendet <0>Shoutrrr</0>, um sich mit beliebten Benachrichtigung
|
|||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
msgstr "Binär"
|
msgstr "Binär"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bits (Kbps, Mbps, Gbps)"
|
||||||
|
msgstr "Bits (Kbps, Mbps, Gbps)"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bytes (KB/s, MB/s, GB/s)"
|
||||||
|
msgstr "Bytes (KB/s, MB/s, GB/s)"
|
||||||
|
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
msgid "Cache / Buffers"
|
msgid "Cache / Buffers"
|
||||||
msgstr "Cache / Puffer"
|
msgstr "Cache / Puffer"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Abbrechen"
|
msgstr "Abbrechen"
|
||||||
|
|
||||||
@@ -164,6 +211,14 @@ msgstr "Abbrechen"
|
|||||||
msgid "Caution - potential data loss"
|
msgid "Caution - potential data loss"
|
||||||
msgstr "Vorsicht - potenzieller Datenverlust"
|
msgstr "Vorsicht - potenzieller Datenverlust"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Celsius (°C)"
|
||||||
|
msgstr "Celsius (°C)"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Change display units for metrics."
|
||||||
|
msgstr "Anzeigeeinheiten der Werte ändern."
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Change general application options."
|
msgid "Change general application options."
|
||||||
msgstr "Allgemeine Anwendungsoptionen ändern."
|
msgstr "Allgemeine Anwendungsoptionen ändern."
|
||||||
@@ -202,7 +257,12 @@ msgstr "Konfiguriere, wie du Warnbenachrichtigungen erhältst."
|
|||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr "Passwort bestätigen"
|
msgstr "Passwort bestätigen"
|
||||||
|
|
||||||
|
#: src/components/routes/home.tsx
|
||||||
|
msgid "Connection is down"
|
||||||
|
msgstr "Verbindung unterbrochen"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Continue"
|
msgid "Continue"
|
||||||
msgstr "Fortfahren"
|
msgstr "Fortfahren"
|
||||||
|
|
||||||
@@ -211,11 +271,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "In die Zwischenablage kopiert"
|
msgstr "In die Zwischenablage kopiert"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Docker compose kopieren"
|
msgstr "Docker compose kopieren"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Docker run kopieren"
|
msgstr "Docker run kopieren"
|
||||||
@@ -230,9 +292,14 @@ msgid "Copy host"
|
|||||||
msgstr "Host kopieren"
|
msgstr "Host kopieren"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Linux-Befehl kopieren"
|
msgstr "Linux-Befehl kopieren"
|
||||||
|
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Copy name"
|
||||||
|
msgstr "Name kopieren"
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Copy text"
|
msgid "Copy text"
|
||||||
msgstr "Text kopieren"
|
msgstr "Text kopieren"
|
||||||
@@ -255,7 +322,7 @@ msgstr "CPU"
|
|||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "CPU Usage"
|
msgid "CPU Usage"
|
||||||
msgstr "CPU-Auslastung"
|
msgstr "CPU-Auslastung"
|
||||||
|
|
||||||
@@ -263,6 +330,11 @@ msgstr "CPU-Auslastung"
|
|||||||
msgid "Create account"
|
msgid "Create account"
|
||||||
msgstr "Konto erstellen"
|
msgstr "Konto erstellen"
|
||||||
|
|
||||||
|
#. Context: date created
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Created"
|
||||||
|
msgstr "Erstellt"
|
||||||
|
|
||||||
#. Dark theme
|
#. Dark theme
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
@@ -278,6 +350,7 @@ msgid "Default time period"
|
|||||||
msgstr "Standardzeitraum"
|
msgstr "Standardzeitraum"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Löschen"
|
msgstr "Löschen"
|
||||||
|
|
||||||
@@ -293,6 +366,10 @@ msgstr "Festplatte"
|
|||||||
msgid "Disk I/O"
|
msgid "Disk I/O"
|
||||||
msgstr "Festplatten-I/O"
|
msgstr "Festplatten-I/O"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Disk unit"
|
||||||
|
msgstr "Festplatteneinheit"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/disk-chart.tsx
|
#: src/components/charts/disk-chart.tsx
|
||||||
@@ -321,11 +398,16 @@ msgstr "Dokumentation"
|
|||||||
|
|
||||||
#. Context: System is down
|
#. Context: System is down
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Down"
|
msgid "Down"
|
||||||
msgstr "Offline"
|
msgstr "Offline"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Duration"
|
||||||
|
msgstr "Dauer"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
@@ -351,6 +433,7 @@ msgstr "E-Mail-Adresse eingeben..."
|
|||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
#: src/components/login/auth-form.tsx
|
#: src/components/login/auth-form.tsx
|
||||||
msgid "Error"
|
msgid "Error"
|
||||||
msgstr "Fehler"
|
msgstr "Fehler"
|
||||||
@@ -366,6 +449,10 @@ msgstr "Überschreitet {0}{1} in den letzten {2, plural, one {# Minute} other {#
|
|||||||
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
||||||
msgstr "Bestehende Systeme, die nicht in der <0>config.yml</0> definiert sind, werden gelöscht. Bitte mache regelmäßige Backups."
|
msgstr "Bestehende Systeme, die nicht in der <0>config.yml</0> definiert sind, werden gelöscht. Bitte mache regelmäßige Backups."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Export"
|
||||||
|
msgstr "Exportieren"
|
||||||
|
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
msgid "Export configuration"
|
msgid "Export configuration"
|
||||||
msgstr "Konfiguration exportieren"
|
msgstr "Konfiguration exportieren"
|
||||||
@@ -374,6 +461,10 @@ msgstr "Konfiguration exportieren"
|
|||||||
msgid "Export your current systems configuration."
|
msgid "Export your current systems configuration."
|
||||||
msgstr "Exportiere die aktuelle Systemkonfiguration."
|
msgstr "Exportiere die aktuelle Systemkonfiguration."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Fahrenheit (°F)"
|
||||||
|
msgstr "Fahrenheit (°F)"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Failed to authenticate"
|
msgid "Failed to authenticate"
|
||||||
msgstr "Authentifizierung fehlgeschlagen"
|
msgstr "Authentifizierung fehlgeschlagen"
|
||||||
@@ -393,9 +484,14 @@ msgstr "Warnung konnte nicht aktualisiert werden"
|
|||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Filter..."
|
msgstr "Filter..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr "Fingerabdruck"
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "Für <0>{min}</0> {min, plural, one {Minute} other {Minuten}}"
|
msgstr "Für <0>{min}</0> {min, plural, one {Minute} other {Minuten}}"
|
||||||
@@ -419,6 +515,7 @@ msgid "Grid"
|
|||||||
msgstr "Raster"
|
msgstr "Raster"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Homebrew-Befehl"
|
msgstr "Homebrew-Befehl"
|
||||||
@@ -453,6 +550,27 @@ msgstr "Anordnung"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Hell"
|
msgstr "Hell"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "Load Average"
|
||||||
|
msgstr "Durchschnittliche Systemlast"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr "Durchschnittliche Systemlast 15 Min"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 1m"
|
||||||
|
msgstr "Durchschnittliche Systemlast 1 Min"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr "Durchschnittliche Systemlast 5 Min"
|
||||||
|
|
||||||
|
#. Short label for load average
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Load Avg"
|
||||||
|
msgstr "Durchschnittliche Last"
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Abmelden"
|
msgstr "Abmelden"
|
||||||
@@ -501,6 +619,7 @@ msgstr "Arbeitsspeichernutzung"
|
|||||||
msgid "Memory usage of docker containers"
|
msgid "Memory usage of docker containers"
|
||||||
msgstr "Arbeitsspeichernutzung der Docker-Container"
|
msgstr "Arbeitsspeichernutzung der Docker-Container"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Name"
|
msgstr "Name"
|
||||||
@@ -517,10 +636,19 @@ msgstr "Netzwerkverkehr der Docker-Container"
|
|||||||
msgid "Network traffic of public interfaces"
|
msgid "Network traffic of public interfaces"
|
||||||
msgstr "Netzwerkverkehr der öffentlichen Schnittstellen"
|
msgstr "Netzwerkverkehr der öffentlichen Schnittstellen"
|
||||||
|
|
||||||
|
#. Context: Bytes or bits
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Network unit"
|
||||||
|
msgstr "Netzwerkeinheit"
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "No results found."
|
msgid "No results found."
|
||||||
msgstr "Keine Ergebnisse gefunden."
|
msgstr "Keine Ergebnisse gefunden."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "No results."
|
||||||
|
msgstr "Keine Ergebnisse."
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "No systems found."
|
msgid "No systems found."
|
||||||
@@ -558,6 +686,12 @@ msgstr "Bestehende Warnungen überschreiben"
|
|||||||
msgid "Page"
|
msgid "Page"
|
||||||
msgstr "Seite"
|
msgstr "Seite"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getState().pagination.pageIndex + 1
|
||||||
|
#. placeholder {1}: table.getPageCount()
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Page {0} of {1}"
|
||||||
|
msgstr "Seite {0} von {1}"
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "Pages / Settings"
|
msgid "Pages / Settings"
|
||||||
msgstr "Seiten / Einstellungen"
|
msgstr "Seiten / Einstellungen"
|
||||||
@@ -639,13 +773,12 @@ msgid "Public Key"
|
|||||||
msgstr "Schlüssel"
|
msgstr "Schlüssel"
|
||||||
|
|
||||||
#. Disk read
|
#. Disk read
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Read"
|
msgid "Read"
|
||||||
msgstr "Lesen"
|
msgstr "Lesen"
|
||||||
|
|
||||||
#. Network bytes received (download)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Received"
|
msgid "Received"
|
||||||
msgstr "Empfangen"
|
msgstr "Empfangen"
|
||||||
|
|
||||||
@@ -653,6 +786,12 @@ msgstr "Empfangen"
|
|||||||
msgid "Reset Password"
|
msgid "Reset Password"
|
||||||
msgstr "Passwort zurücksetzen"
|
msgstr "Passwort zurücksetzen"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Resolved"
|
||||||
|
msgstr "Gelöst"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Resume"
|
msgid "Resume"
|
||||||
msgstr "Fortsetzen"
|
msgstr "Fortsetzen"
|
||||||
@@ -661,6 +800,10 @@ msgstr "Fortsetzen"
|
|||||||
msgid "Rotate token"
|
msgid "Rotate token"
|
||||||
msgstr "Token rotieren"
|
msgstr "Token rotieren"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Rows per page"
|
||||||
|
msgstr "Zeilen pro Seite"
|
||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
||||||
msgstr "Adresse mit der Enter-Taste oder Komma speichern. Leer lassen, um E-Mail-Benachrichtigungen zu deaktivieren."
|
msgstr "Adresse mit der Enter-Taste oder Komma speichern. Leer lassen, um E-Mail-Benachrichtigungen zu deaktivieren."
|
||||||
@@ -672,7 +815,7 @@ msgstr "Einstellungen speichern"
|
|||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Save system"
|
msgid "Save system"
|
||||||
msgstr ""
|
msgstr "System sichern"
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
@@ -686,8 +829,7 @@ msgstr "Nach Systemen oder Einstellungen suchen..."
|
|||||||
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
||||||
msgstr "Siehe <0>Benachrichtigungseinstellungen</0>, um zu konfigurieren, wie du Warnungen erhältst."
|
msgstr "Siehe <0>Benachrichtigungseinstellungen</0>, um zu konfigurieren, wie du Warnungen erhältst."
|
||||||
|
|
||||||
#. Network bytes sent (upload)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Sent"
|
msgid "Sent"
|
||||||
msgstr "Gesendet"
|
msgstr "Gesendet"
|
||||||
|
|
||||||
@@ -718,6 +860,11 @@ msgstr "SMTP-Einstellungen"
|
|||||||
msgid "Sort By"
|
msgid "Sort By"
|
||||||
msgstr "Sortieren nach"
|
msgstr "Sortieren nach"
|
||||||
|
|
||||||
|
#. Context: alert state (active or resolved)
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "State"
|
||||||
|
msgstr "Status"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr "Status"
|
msgstr "Status"
|
||||||
@@ -733,10 +880,16 @@ msgstr "Swap-Nutzung"
|
|||||||
#. System theme
|
#. System theme
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "System"
|
msgstr "System"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "System load averages over time"
|
||||||
|
msgstr "Systemlastdurchschnitt im Zeitverlauf"
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Systems"
|
msgid "Systems"
|
||||||
msgstr "Systeme"
|
msgstr "Systeme"
|
||||||
@@ -759,6 +912,10 @@ msgstr "Temperatur"
|
|||||||
msgid "Temperature"
|
msgid "Temperature"
|
||||||
msgstr "Temperatur"
|
msgstr "Temperatur"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Temperature unit"
|
||||||
|
msgstr "Temperatureinheit"
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Temperatures of system sensors"
|
msgid "Temperatures of system sensors"
|
||||||
msgstr "Temperaturen der Systemsensoren"
|
msgstr "Temperaturen der Systemsensoren"
|
||||||
@@ -779,6 +936,10 @@ msgstr "Melde dich dann im Backend an und setze dein Benutzerkontopasswort in de
|
|||||||
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
||||||
msgstr "Diese Aktion kann nicht rückgängig gemacht werden. Dadurch werden alle aktuellen Datensätze für {name} dauerhaft aus der Datenbank gelöscht."
|
msgstr "Diese Aktion kann nicht rückgängig gemacht werden. Dadurch werden alle aktuellen Datensätze für {name} dauerhaft aus der Datenbank gelöscht."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "This will permanently delete all selected records from the database."
|
||||||
|
msgstr "Dadurch werden alle ausgewählten Datensätze dauerhaft aus der Datenbank gelöscht."
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Throughput of {extraFsName}"
|
msgid "Throughput of {extraFsName}"
|
||||||
msgstr "Durchsatz von {extraFsName}"
|
msgstr "Durchsatz von {extraFsName}"
|
||||||
@@ -801,6 +962,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Darstellung umschalten"
|
msgstr "Darstellung umschalten"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr "Token"
|
msgstr "Token"
|
||||||
|
|
||||||
@@ -818,6 +980,18 @@ msgstr "Tokens ermöglichen es Agents, sich zu verbinden und zu registrieren. Fi
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr "Tokens und Fingerabdrücke werden verwendet, um WebSocket-Verbindungen zum Hub zu authentifizieren."
|
msgstr "Tokens und Fingerabdrücke werden verwendet, um WebSocket-Verbindungen zum Hub zu authentifizieren."
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 1 minute load average exceeds a threshold"
|
||||||
|
msgstr "Löst aus, wenn der Lastdurchschnitt der letzten Minute einen Schwellenwert überschreitet"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr "Löst aus, wenn der Lastdurchschnitt der letzten 15 Minuten einen Schwellenwert überschreitet"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr "Löst aus, wenn der Lastdurchschnitt der letzten 5 Minuten einen Schwellenwert überschreitet"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Löst aus, wenn ein Sensor einen Schwellenwert überschreitet"
|
msgstr "Löst aus, wenn ein Sensor einen Schwellenwert überschreitet"
|
||||||
@@ -842,6 +1016,11 @@ msgstr "Löst aus, wenn der Status zwischen online und offline wechselt"
|
|||||||
msgid "Triggers when usage of any disk exceeds a threshold"
|
msgid "Triggers when usage of any disk exceeds a threshold"
|
||||||
msgstr "Löst aus, wenn die Nutzung einer Festplatte einen Schwellenwert überschreitet"
|
msgstr "Löst aus, wenn die Nutzung einer Festplatte einen Schwellenwert überschreitet"
|
||||||
|
|
||||||
|
#. Temperature / network units
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Unit preferences"
|
||||||
|
msgstr "Einheiten"
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Universal token"
|
msgid "Universal token"
|
||||||
msgstr "Universeller Token"
|
msgstr "Universeller Token"
|
||||||
@@ -850,7 +1029,7 @@ msgstr "Universeller Token"
|
|||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Up"
|
msgid "Up"
|
||||||
msgstr ""
|
msgstr "aktiv"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Updated in real time. Click on a system to view information."
|
msgid "Updated in real time. Click on a system to view information."
|
||||||
@@ -862,7 +1041,8 @@ msgstr "Betriebszeit"
|
|||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
msgid "Usage"
|
msgid "Usage"
|
||||||
msgstr "Nutzung"
|
msgstr "Nutzung"
|
||||||
|
|
||||||
@@ -872,7 +1052,6 @@ msgstr "Nutzung der Root-Partition"
|
|||||||
|
|
||||||
#: src/components/charts/swap-chart.tsx
|
#: src/components/charts/swap-chart.tsx
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Used"
|
msgid "Used"
|
||||||
msgstr "Verwendet"
|
msgstr "Verwendet"
|
||||||
|
|
||||||
@@ -881,10 +1060,18 @@ msgstr "Verwendet"
|
|||||||
msgid "Users"
|
msgid "Users"
|
||||||
msgstr "Benutzer"
|
msgstr "Benutzer"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Value"
|
||||||
|
msgstr "Wert"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "View"
|
msgid "View"
|
||||||
msgstr "Ansicht"
|
msgstr "Ansicht"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "View your 200 most recent alerts."
|
||||||
|
msgstr "Sieh dir die neusten 200 Alarme an."
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Visible Fields"
|
msgid "Visible Fields"
|
||||||
msgstr "Sichtbare Spalten"
|
msgstr "Sichtbare Spalten"
|
||||||
@@ -906,13 +1093,14 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr "Wenn aktiviert, ermöglicht dieser Token Agents, sich selbst zu registrieren, ohne vorherige Systemerstellung. Läuft nach einer Stunde oder beim Hub-Neustart ab."
|
msgstr "Wenn aktiviert, ermöglicht dieser Token Agents, sich selbst zu registrieren, ohne vorherige Systemerstellung. Läuft nach einer Stunde oder beim Hub-Neustart ab."
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Windows-Befehl"
|
msgstr "Windows-Befehl"
|
||||||
|
|
||||||
#. Disk write
|
#. Disk write
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Write"
|
msgid "Write"
|
||||||
msgstr "Schreiben"
|
msgstr "Schreiben"
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,12 @@ msgstr ""
|
|||||||
msgid "{0, plural, one {# day} other {# days}}"
|
msgid "{0, plural, one {# day} other {# days}}"
|
||||||
msgstr "{0, plural, one {# day} other {# days}}"
|
msgstr "{0, plural, one {# day} other {# days}}"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
|
||||||
|
#. placeholder {1}: table.getFilteredRowModel().rows.length
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "{0} of {1} row(s) selected."
|
||||||
|
msgstr "{0} of {1} row(s) selected."
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "{hours, plural, one {# hour} other {# hours}}"
|
msgid "{hours, plural, one {# hour} other {# hours}}"
|
||||||
msgstr "{hours, plural, one {# hour} other {# hours}}"
|
msgstr "{hours, plural, one {# hour} other {# hours}}"
|
||||||
@@ -26,6 +32,11 @@ msgstr "{hours, plural, one {# hour} other {# hours}}"
|
|||||||
msgid "1 hour"
|
msgid "1 hour"
|
||||||
msgstr "1 hour"
|
msgstr "1 hour"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "1 min"
|
||||||
|
msgstr "1 min"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "1 week"
|
msgid "1 week"
|
||||||
msgstr "1 week"
|
msgstr "1 week"
|
||||||
@@ -34,6 +45,11 @@ msgstr "1 week"
|
|||||||
msgid "12 hours"
|
msgid "12 hours"
|
||||||
msgstr "12 hours"
|
msgstr "12 hours"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "15 min"
|
||||||
|
msgstr "15 min"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "24 hours"
|
msgid "24 hours"
|
||||||
msgstr "24 hours"
|
msgstr "24 hours"
|
||||||
@@ -42,12 +58,22 @@ msgstr "24 hours"
|
|||||||
msgid "30 days"
|
msgid "30 days"
|
||||||
msgstr "30 days"
|
msgstr "30 days"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "5 min"
|
||||||
|
msgstr "5 min"
|
||||||
|
|
||||||
#. Table column
|
#. Table column
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "Actions"
|
msgstr "Actions"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Active"
|
||||||
|
msgstr "Active"
|
||||||
|
|
||||||
#: src/components/routes/home.tsx
|
#: src/components/routes/home.tsx
|
||||||
msgid "Active Alerts"
|
msgid "Active Alerts"
|
||||||
msgstr "Active Alerts"
|
msgstr "Active Alerts"
|
||||||
@@ -81,6 +107,12 @@ msgstr "Admin"
|
|||||||
msgid "Agent"
|
msgid "Agent"
|
||||||
msgstr "Agent"
|
msgstr "Agent"
|
||||||
|
|
||||||
|
#: src/components/command-palette.tsx
|
||||||
|
#: src/components/routes/settings/layout.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Alert History"
|
||||||
|
msgstr "Alert History"
|
||||||
|
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
msgid "Alerts"
|
msgid "Alerts"
|
||||||
@@ -95,6 +127,10 @@ msgstr "All Systems"
|
|||||||
msgid "Are you sure you want to delete {name}?"
|
msgid "Are you sure you want to delete {name}?"
|
||||||
msgstr "Are you sure you want to delete {name}?"
|
msgstr "Are you sure you want to delete {name}?"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Are you sure?"
|
||||||
|
msgstr "Are you sure?"
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Automatic copy requires a secure context."
|
msgid "Automatic copy requires a secure context."
|
||||||
msgstr "Automatic copy requires a secure context."
|
msgstr "Automatic copy requires a secure context."
|
||||||
@@ -147,11 +183,22 @@ msgstr "Beszel uses <0>Shoutrrr</0> to integrate with popular notification servi
|
|||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
msgstr "Binary"
|
msgstr "Binary"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bits (Kbps, Mbps, Gbps)"
|
||||||
|
msgstr "Bits (Kbps, Mbps, Gbps)"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bytes (KB/s, MB/s, GB/s)"
|
||||||
|
msgstr "Bytes (KB/s, MB/s, GB/s)"
|
||||||
|
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
msgid "Cache / Buffers"
|
msgid "Cache / Buffers"
|
||||||
msgstr "Cache / Buffers"
|
msgstr "Cache / Buffers"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Cancel"
|
msgstr "Cancel"
|
||||||
|
|
||||||
@@ -159,6 +206,14 @@ msgstr "Cancel"
|
|||||||
msgid "Caution - potential data loss"
|
msgid "Caution - potential data loss"
|
||||||
msgstr "Caution - potential data loss"
|
msgstr "Caution - potential data loss"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Celsius (°C)"
|
||||||
|
msgstr "Celsius (°C)"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Change display units for metrics."
|
||||||
|
msgstr "Change display units for metrics."
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Change general application options."
|
msgid "Change general application options."
|
||||||
msgstr "Change general application options."
|
msgstr "Change general application options."
|
||||||
@@ -197,7 +252,12 @@ msgstr "Configure how you receive alert notifications."
|
|||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr "Confirm password"
|
msgstr "Confirm password"
|
||||||
|
|
||||||
|
#: src/components/routes/home.tsx
|
||||||
|
msgid "Connection is down"
|
||||||
|
msgstr "Connection is down"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Continue"
|
msgid "Continue"
|
||||||
msgstr "Continue"
|
msgstr "Continue"
|
||||||
|
|
||||||
@@ -206,11 +266,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Copied to clipboard"
|
msgstr "Copied to clipboard"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Copy docker compose"
|
msgstr "Copy docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Copy docker run"
|
msgstr "Copy docker run"
|
||||||
@@ -225,9 +287,14 @@ msgid "Copy host"
|
|||||||
msgstr "Copy host"
|
msgstr "Copy host"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Copy Linux command"
|
msgstr "Copy Linux command"
|
||||||
|
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Copy name"
|
||||||
|
msgstr "Copy name"
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Copy text"
|
msgid "Copy text"
|
||||||
msgstr "Copy text"
|
msgstr "Copy text"
|
||||||
@@ -250,7 +317,7 @@ msgstr "CPU"
|
|||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "CPU Usage"
|
msgid "CPU Usage"
|
||||||
msgstr "CPU Usage"
|
msgstr "CPU Usage"
|
||||||
|
|
||||||
@@ -258,6 +325,11 @@ msgstr "CPU Usage"
|
|||||||
msgid "Create account"
|
msgid "Create account"
|
||||||
msgstr "Create account"
|
msgstr "Create account"
|
||||||
|
|
||||||
|
#. Context: date created
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Created"
|
||||||
|
msgstr "Created"
|
||||||
|
|
||||||
#. Dark theme
|
#. Dark theme
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
@@ -273,6 +345,7 @@ msgid "Default time period"
|
|||||||
msgstr "Default time period"
|
msgstr "Default time period"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Delete"
|
msgstr "Delete"
|
||||||
|
|
||||||
@@ -288,6 +361,10 @@ msgstr "Disk"
|
|||||||
msgid "Disk I/O"
|
msgid "Disk I/O"
|
||||||
msgstr "Disk I/O"
|
msgstr "Disk I/O"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Disk unit"
|
||||||
|
msgstr "Disk unit"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/disk-chart.tsx
|
#: src/components/charts/disk-chart.tsx
|
||||||
@@ -316,11 +393,16 @@ msgstr "Documentation"
|
|||||||
|
|
||||||
#. Context: System is down
|
#. Context: System is down
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Down"
|
msgid "Down"
|
||||||
msgstr "Down"
|
msgstr "Down"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Duration"
|
||||||
|
msgstr "Duration"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
@@ -346,6 +428,7 @@ msgstr "Enter email address..."
|
|||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
#: src/components/login/auth-form.tsx
|
#: src/components/login/auth-form.tsx
|
||||||
msgid "Error"
|
msgid "Error"
|
||||||
msgstr "Error"
|
msgstr "Error"
|
||||||
@@ -361,6 +444,10 @@ msgstr "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
|
|||||||
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
||||||
msgstr "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
msgstr "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Export"
|
||||||
|
msgstr "Export"
|
||||||
|
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
msgid "Export configuration"
|
msgid "Export configuration"
|
||||||
msgstr "Export configuration"
|
msgstr "Export configuration"
|
||||||
@@ -369,6 +456,10 @@ msgstr "Export configuration"
|
|||||||
msgid "Export your current systems configuration."
|
msgid "Export your current systems configuration."
|
||||||
msgstr "Export your current systems configuration."
|
msgstr "Export your current systems configuration."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Fahrenheit (°F)"
|
||||||
|
msgstr "Fahrenheit (°F)"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Failed to authenticate"
|
msgid "Failed to authenticate"
|
||||||
msgstr "Failed to authenticate"
|
msgstr "Failed to authenticate"
|
||||||
@@ -388,9 +479,14 @@ msgstr "Failed to update alert"
|
|||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Filter..."
|
msgstr "Filter..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr "Fingerprint"
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgstr "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
@@ -414,6 +510,7 @@ msgid "Grid"
|
|||||||
msgstr "Grid"
|
msgstr "Grid"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Homebrew command"
|
msgstr "Homebrew command"
|
||||||
@@ -448,6 +545,27 @@ msgstr "Layout"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Light"
|
msgstr "Light"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "Load Average"
|
||||||
|
msgstr "Load Average"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr "Load Average 15m"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 1m"
|
||||||
|
msgstr "Load Average 1m"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr "Load Average 5m"
|
||||||
|
|
||||||
|
#. Short label for load average
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Load Avg"
|
||||||
|
msgstr "Load Avg"
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Log Out"
|
msgstr "Log Out"
|
||||||
@@ -496,6 +614,7 @@ msgstr "Memory Usage"
|
|||||||
msgid "Memory usage of docker containers"
|
msgid "Memory usage of docker containers"
|
||||||
msgstr "Memory usage of docker containers"
|
msgstr "Memory usage of docker containers"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Name"
|
msgstr "Name"
|
||||||
@@ -512,10 +631,19 @@ msgstr "Network traffic of docker containers"
|
|||||||
msgid "Network traffic of public interfaces"
|
msgid "Network traffic of public interfaces"
|
||||||
msgstr "Network traffic of public interfaces"
|
msgstr "Network traffic of public interfaces"
|
||||||
|
|
||||||
|
#. Context: Bytes or bits
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Network unit"
|
||||||
|
msgstr "Network unit"
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "No results found."
|
msgid "No results found."
|
||||||
msgstr "No results found."
|
msgstr "No results found."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "No results."
|
||||||
|
msgstr "No results."
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "No systems found."
|
msgid "No systems found."
|
||||||
@@ -553,6 +681,12 @@ msgstr "Overwrite existing alerts"
|
|||||||
msgid "Page"
|
msgid "Page"
|
||||||
msgstr "Page"
|
msgstr "Page"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getState().pagination.pageIndex + 1
|
||||||
|
#. placeholder {1}: table.getPageCount()
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Page {0} of {1}"
|
||||||
|
msgstr "Page {0} of {1}"
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "Pages / Settings"
|
msgid "Pages / Settings"
|
||||||
msgstr "Pages / Settings"
|
msgstr "Pages / Settings"
|
||||||
@@ -634,13 +768,12 @@ msgid "Public Key"
|
|||||||
msgstr "Public Key"
|
msgstr "Public Key"
|
||||||
|
|
||||||
#. Disk read
|
#. Disk read
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Read"
|
msgid "Read"
|
||||||
msgstr "Read"
|
msgstr "Read"
|
||||||
|
|
||||||
#. Network bytes received (download)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Received"
|
msgid "Received"
|
||||||
msgstr "Received"
|
msgstr "Received"
|
||||||
|
|
||||||
@@ -648,6 +781,12 @@ msgstr "Received"
|
|||||||
msgid "Reset Password"
|
msgid "Reset Password"
|
||||||
msgstr "Reset Password"
|
msgstr "Reset Password"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Resolved"
|
||||||
|
msgstr "Resolved"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Resume"
|
msgid "Resume"
|
||||||
msgstr "Resume"
|
msgstr "Resume"
|
||||||
@@ -656,6 +795,10 @@ msgstr "Resume"
|
|||||||
msgid "Rotate token"
|
msgid "Rotate token"
|
||||||
msgstr "Rotate token"
|
msgstr "Rotate token"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Rows per page"
|
||||||
|
msgstr "Rows per page"
|
||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
||||||
msgstr "Save address using enter key or comma. Leave blank to disable email notifications."
|
msgstr "Save address using enter key or comma. Leave blank to disable email notifications."
|
||||||
@@ -681,8 +824,7 @@ msgstr "Search for systems or settings..."
|
|||||||
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
||||||
msgstr "See <0>notification settings</0> to configure how you receive alerts."
|
msgstr "See <0>notification settings</0> to configure how you receive alerts."
|
||||||
|
|
||||||
#. Network bytes sent (upload)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Sent"
|
msgid "Sent"
|
||||||
msgstr "Sent"
|
msgstr "Sent"
|
||||||
|
|
||||||
@@ -713,6 +855,11 @@ msgstr "SMTP settings"
|
|||||||
msgid "Sort By"
|
msgid "Sort By"
|
||||||
msgstr "Sort By"
|
msgstr "Sort By"
|
||||||
|
|
||||||
|
#. Context: alert state (active or resolved)
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "State"
|
||||||
|
msgstr "State"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr "Status"
|
msgstr "Status"
|
||||||
@@ -728,10 +875,16 @@ msgstr "Swap Usage"
|
|||||||
#. System theme
|
#. System theme
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "System"
|
msgstr "System"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "System load averages over time"
|
||||||
|
msgstr "System load averages over time"
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Systems"
|
msgid "Systems"
|
||||||
msgstr "Systems"
|
msgstr "Systems"
|
||||||
@@ -754,6 +907,10 @@ msgstr "Temp"
|
|||||||
msgid "Temperature"
|
msgid "Temperature"
|
||||||
msgstr "Temperature"
|
msgstr "Temperature"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Temperature unit"
|
||||||
|
msgstr "Temperature unit"
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Temperatures of system sensors"
|
msgid "Temperatures of system sensors"
|
||||||
msgstr "Temperatures of system sensors"
|
msgstr "Temperatures of system sensors"
|
||||||
@@ -774,6 +931,10 @@ msgstr "Then log into the backend and reset your user account password in the us
|
|||||||
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
||||||
msgstr "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
msgstr "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "This will permanently delete all selected records from the database."
|
||||||
|
msgstr "This will permanently delete all selected records from the database."
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Throughput of {extraFsName}"
|
msgid "Throughput of {extraFsName}"
|
||||||
msgstr "Throughput of {extraFsName}"
|
msgstr "Throughput of {extraFsName}"
|
||||||
@@ -796,6 +957,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Toggle theme"
|
msgstr "Toggle theme"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr "Token"
|
msgstr "Token"
|
||||||
|
|
||||||
@@ -813,6 +975,18 @@ msgstr "Tokens allow agents to connect and register. Fingerprints are stable ide
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgstr "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 1 minute load average exceeds a threshold"
|
||||||
|
msgstr "Triggers when 1 minute load average exceeds a threshold"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Triggers when any sensor exceeds a threshold"
|
msgstr "Triggers when any sensor exceeds a threshold"
|
||||||
@@ -837,6 +1011,11 @@ msgstr "Triggers when status switches between up and down"
|
|||||||
msgid "Triggers when usage of any disk exceeds a threshold"
|
msgid "Triggers when usage of any disk exceeds a threshold"
|
||||||
msgstr "Triggers when usage of any disk exceeds a threshold"
|
msgstr "Triggers when usage of any disk exceeds a threshold"
|
||||||
|
|
||||||
|
#. Temperature / network units
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Unit preferences"
|
||||||
|
msgstr "Unit preferences"
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Universal token"
|
msgid "Universal token"
|
||||||
msgstr "Universal token"
|
msgstr "Universal token"
|
||||||
@@ -857,7 +1036,8 @@ msgstr "Uptime"
|
|||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
msgid "Usage"
|
msgid "Usage"
|
||||||
msgstr "Usage"
|
msgstr "Usage"
|
||||||
|
|
||||||
@@ -867,7 +1047,6 @@ msgstr "Usage of root partition"
|
|||||||
|
|
||||||
#: src/components/charts/swap-chart.tsx
|
#: src/components/charts/swap-chart.tsx
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Used"
|
msgid "Used"
|
||||||
msgstr "Used"
|
msgstr "Used"
|
||||||
|
|
||||||
@@ -876,10 +1055,18 @@ msgstr "Used"
|
|||||||
msgid "Users"
|
msgid "Users"
|
||||||
msgstr "Users"
|
msgstr "Users"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Value"
|
||||||
|
msgstr "Value"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "View"
|
msgid "View"
|
||||||
msgstr "View"
|
msgstr "View"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "View your 200 most recent alerts."
|
||||||
|
msgstr "View your 200 most recent alerts."
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Visible Fields"
|
msgid "Visible Fields"
|
||||||
msgstr "Visible Fields"
|
msgstr "Visible Fields"
|
||||||
@@ -901,13 +1088,14 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr "When enabled, this token allows agents to self-register without prior system creation. Expires after one hour or on hub restart."
|
msgstr "When enabled, this token allows agents to self-register without prior system creation. Expires after one hour or on hub restart."
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Windows command"
|
msgstr "Windows command"
|
||||||
|
|
||||||
#. Disk write
|
#. Disk write
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Write"
|
msgid "Write"
|
||||||
msgstr "Write"
|
msgstr "Write"
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ msgstr ""
|
|||||||
"Language: es\n"
|
"Language: es\n"
|
||||||
"Project-Id-Version: beszel\n"
|
"Project-Id-Version: beszel\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2025-03-06 07:27\n"
|
"PO-Revision-Date: 2025-07-25 22:44\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: Spanish\n"
|
"Language-Team: Spanish\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
@@ -23,6 +23,12 @@ msgstr ""
|
|||||||
msgid "{0, plural, one {# day} other {# days}}"
|
msgid "{0, plural, one {# day} other {# days}}"
|
||||||
msgstr "{0, plural, one {# día} other {# días}}"
|
msgstr "{0, plural, one {# día} other {# días}}"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
|
||||||
|
#. placeholder {1}: table.getFilteredRowModel().rows.length
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "{0} of {1} row(s) selected."
|
||||||
|
msgstr "{0} de {1} fila(s) seleccionada(s)."
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "{hours, plural, one {# hour} other {# hours}}"
|
msgid "{hours, plural, one {# hour} other {# hours}}"
|
||||||
msgstr "{hours, plural, one {# hora} other {# horas}}"
|
msgstr "{hours, plural, one {# hora} other {# horas}}"
|
||||||
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# hora} other {# horas}}"
|
|||||||
msgid "1 hour"
|
msgid "1 hour"
|
||||||
msgstr "1 hora"
|
msgstr "1 hora"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "1 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "1 week"
|
msgid "1 week"
|
||||||
msgstr "1 semana"
|
msgstr "1 semana"
|
||||||
@@ -39,6 +50,11 @@ msgstr "1 semana"
|
|||||||
msgid "12 hours"
|
msgid "12 hours"
|
||||||
msgstr "12 horas"
|
msgstr "12 horas"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "15 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "24 hours"
|
msgid "24 hours"
|
||||||
msgstr "24 horas"
|
msgstr "24 horas"
|
||||||
@@ -47,12 +63,22 @@ msgstr "24 horas"
|
|||||||
msgid "30 days"
|
msgid "30 days"
|
||||||
msgstr "30 días"
|
msgstr "30 días"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "5 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. Table column
|
#. Table column
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "Acciones"
|
msgstr "Acciones"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Active"
|
||||||
|
msgstr "Activo"
|
||||||
|
|
||||||
#: src/components/routes/home.tsx
|
#: src/components/routes/home.tsx
|
||||||
msgid "Active Alerts"
|
msgid "Active Alerts"
|
||||||
msgstr "Alertas Activas"
|
msgstr "Alertas Activas"
|
||||||
@@ -86,6 +112,12 @@ msgstr "Administrador"
|
|||||||
msgid "Agent"
|
msgid "Agent"
|
||||||
msgstr "Agente"
|
msgstr "Agente"
|
||||||
|
|
||||||
|
#: src/components/command-palette.tsx
|
||||||
|
#: src/components/routes/settings/layout.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Alert History"
|
||||||
|
msgstr "Historial de Alertas"
|
||||||
|
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
msgid "Alerts"
|
msgid "Alerts"
|
||||||
@@ -100,6 +132,10 @@ msgstr "Todos los Sistemas"
|
|||||||
msgid "Are you sure you want to delete {name}?"
|
msgid "Are you sure you want to delete {name}?"
|
||||||
msgstr "¿Está seguro de que desea eliminar {name}?"
|
msgstr "¿Está seguro de que desea eliminar {name}?"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Are you sure?"
|
||||||
|
msgstr "¿Estás seguro?"
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Automatic copy requires a secure context."
|
msgid "Automatic copy requires a secure context."
|
||||||
msgstr "La copia automática requiere un contexto seguro."
|
msgstr "La copia automática requiere un contexto seguro."
|
||||||
@@ -152,11 +188,22 @@ msgstr "Beszel utiliza <0>Shoutrrr</0> para integrarse con servicios populares d
|
|||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
msgstr "Binario"
|
msgstr "Binario"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bits (Kbps, Mbps, Gbps)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bytes (KB/s, MB/s, GB/s)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
msgid "Cache / Buffers"
|
msgid "Cache / Buffers"
|
||||||
msgstr "Caché / Buffers"
|
msgstr "Caché / Buffers"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Cancelar"
|
msgstr "Cancelar"
|
||||||
|
|
||||||
@@ -164,6 +211,14 @@ msgstr "Cancelar"
|
|||||||
msgid "Caution - potential data loss"
|
msgid "Caution - potential data loss"
|
||||||
msgstr "Precaución - posible pérdida de datos"
|
msgstr "Precaución - posible pérdida de datos"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Celsius (°C)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Change display units for metrics."
|
||||||
|
msgstr "Cambiar las unidades de visualización de las métricas."
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Change general application options."
|
msgid "Change general application options."
|
||||||
msgstr "Cambiar las opciones generales de la aplicación."
|
msgstr "Cambiar las opciones generales de la aplicación."
|
||||||
@@ -202,7 +257,12 @@ msgstr "Configure cómo recibe las notificaciones de alertas."
|
|||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr "Confirmar contraseña"
|
msgstr "Confirmar contraseña"
|
||||||
|
|
||||||
|
#: src/components/routes/home.tsx
|
||||||
|
msgid "Connection is down"
|
||||||
|
msgstr "La conexión está caída"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Continue"
|
msgid "Continue"
|
||||||
msgstr "Continuar"
|
msgstr "Continuar"
|
||||||
|
|
||||||
@@ -211,11 +271,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Copiado al portapapeles"
|
msgstr "Copiado al portapapeles"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Copiar docker compose"
|
msgstr "Copiar docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Copiar docker run"
|
msgstr "Copiar docker run"
|
||||||
@@ -230,9 +292,14 @@ msgid "Copy host"
|
|||||||
msgstr "Copiar host"
|
msgstr "Copiar host"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Copiar comando de Linux"
|
msgstr "Copiar comando de Linux"
|
||||||
|
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Copy name"
|
||||||
|
msgstr "Copiar nombre"
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Copy text"
|
msgid "Copy text"
|
||||||
msgstr "Copiar texto"
|
msgstr "Copiar texto"
|
||||||
@@ -255,7 +322,7 @@ msgstr "CPU"
|
|||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "CPU Usage"
|
msgid "CPU Usage"
|
||||||
msgstr "Uso de CPU"
|
msgstr "Uso de CPU"
|
||||||
|
|
||||||
@@ -263,6 +330,11 @@ msgstr "Uso de CPU"
|
|||||||
msgid "Create account"
|
msgid "Create account"
|
||||||
msgstr "Crear cuenta"
|
msgstr "Crear cuenta"
|
||||||
|
|
||||||
|
#. Context: date created
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Created"
|
||||||
|
msgstr "Creado"
|
||||||
|
|
||||||
#. Dark theme
|
#. Dark theme
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
@@ -278,6 +350,7 @@ msgid "Default time period"
|
|||||||
msgstr "Período de tiempo predeterminado"
|
msgstr "Período de tiempo predeterminado"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Eliminar"
|
msgstr "Eliminar"
|
||||||
|
|
||||||
@@ -293,6 +366,10 @@ msgstr "Disco"
|
|||||||
msgid "Disk I/O"
|
msgid "Disk I/O"
|
||||||
msgstr "E/S de Disco"
|
msgstr "E/S de Disco"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Disk unit"
|
||||||
|
msgstr "Unidad de disco"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/disk-chart.tsx
|
#: src/components/charts/disk-chart.tsx
|
||||||
@@ -321,11 +398,16 @@ msgstr "Documentación"
|
|||||||
|
|
||||||
#. Context: System is down
|
#. Context: System is down
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Down"
|
msgid "Down"
|
||||||
msgstr "Abajo"
|
msgstr "Abajo"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Duration"
|
||||||
|
msgstr "Duración"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
@@ -351,6 +433,7 @@ msgstr "Ingrese dirección de correo..."
|
|||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
#: src/components/login/auth-form.tsx
|
#: src/components/login/auth-form.tsx
|
||||||
msgid "Error"
|
msgid "Error"
|
||||||
msgstr "Error"
|
msgstr "Error"
|
||||||
@@ -366,6 +449,10 @@ msgstr "Excede {0}{1} en el último {2, plural, one {# minuto} other {# minutos}
|
|||||||
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
||||||
msgstr "Los sistemas existentes no definidos en <0>config.yml</0> serán eliminados. Por favor, haga copias de seguridad regularmente."
|
msgstr "Los sistemas existentes no definidos en <0>config.yml</0> serán eliminados. Por favor, haga copias de seguridad regularmente."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Export"
|
||||||
|
msgstr "Exportar"
|
||||||
|
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
msgid "Export configuration"
|
msgid "Export configuration"
|
||||||
msgstr "Exportar configuración"
|
msgstr "Exportar configuración"
|
||||||
@@ -374,6 +461,10 @@ msgstr "Exportar configuración"
|
|||||||
msgid "Export your current systems configuration."
|
msgid "Export your current systems configuration."
|
||||||
msgstr "Exporte la configuración actual de sus sistemas."
|
msgstr "Exporte la configuración actual de sus sistemas."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Fahrenheit (°F)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Failed to authenticate"
|
msgid "Failed to authenticate"
|
||||||
msgstr "Error al autenticar"
|
msgstr "Error al autenticar"
|
||||||
@@ -393,9 +484,14 @@ msgstr "Error al actualizar la alerta"
|
|||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Filtrar..."
|
msgstr "Filtrar..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr "Huella dactilar"
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "Por <0>{min}</0> {min, plural, one {minuto} other {minutos}}"
|
msgstr "Por <0>{min}</0> {min, plural, one {minuto} other {minutos}}"
|
||||||
@@ -419,6 +515,7 @@ msgid "Grid"
|
|||||||
msgstr "Cuadrícula"
|
msgstr "Cuadrícula"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Comando Homebrew"
|
msgstr "Comando Homebrew"
|
||||||
@@ -453,6 +550,27 @@ msgstr "Diseño"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Claro"
|
msgstr "Claro"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "Load Average"
|
||||||
|
msgstr "Carga Media"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr "Carga media 15m"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 1m"
|
||||||
|
msgstr "Carga media 1m"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr "Carga media 5m"
|
||||||
|
|
||||||
|
#. Short label for load average
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Load Avg"
|
||||||
|
msgstr "Carga media"
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Cerrar Sesión"
|
msgstr "Cerrar Sesión"
|
||||||
@@ -501,6 +619,7 @@ msgstr "Uso de Memoria"
|
|||||||
msgid "Memory usage of docker containers"
|
msgid "Memory usage of docker containers"
|
||||||
msgstr "Uso de memoria de los contenedores de Docker"
|
msgstr "Uso de memoria de los contenedores de Docker"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Nombre"
|
msgstr "Nombre"
|
||||||
@@ -517,10 +636,19 @@ msgstr "Tráfico de red de los contenedores de Docker"
|
|||||||
msgid "Network traffic of public interfaces"
|
msgid "Network traffic of public interfaces"
|
||||||
msgstr "Tráfico de red de interfaces públicas"
|
msgstr "Tráfico de red de interfaces públicas"
|
||||||
|
|
||||||
|
#. Context: Bytes or bits
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Network unit"
|
||||||
|
msgstr "Unidad de red"
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "No results found."
|
msgid "No results found."
|
||||||
msgstr "No se encontraron resultados."
|
msgstr "No se encontraron resultados."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "No results."
|
||||||
|
msgstr "Sin resultados."
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "No systems found."
|
msgid "No systems found."
|
||||||
@@ -558,6 +686,12 @@ msgstr "Sobrescribir alertas existentes"
|
|||||||
msgid "Page"
|
msgid "Page"
|
||||||
msgstr "Página"
|
msgstr "Página"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getState().pagination.pageIndex + 1
|
||||||
|
#. placeholder {1}: table.getPageCount()
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Page {0} of {1}"
|
||||||
|
msgstr "Página {0} de {1}"
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "Pages / Settings"
|
msgid "Pages / Settings"
|
||||||
msgstr "Páginas / Configuraciones"
|
msgstr "Páginas / Configuraciones"
|
||||||
@@ -639,13 +773,12 @@ msgid "Public Key"
|
|||||||
msgstr "Clave Pública"
|
msgstr "Clave Pública"
|
||||||
|
|
||||||
#. Disk read
|
#. Disk read
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Read"
|
msgid "Read"
|
||||||
msgstr "Lectura"
|
msgstr "Lectura"
|
||||||
|
|
||||||
#. Network bytes received (download)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Received"
|
msgid "Received"
|
||||||
msgstr "Recibido"
|
msgstr "Recibido"
|
||||||
|
|
||||||
@@ -653,6 +786,12 @@ msgstr "Recibido"
|
|||||||
msgid "Reset Password"
|
msgid "Reset Password"
|
||||||
msgstr "Restablecer Contraseña"
|
msgstr "Restablecer Contraseña"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Resolved"
|
||||||
|
msgstr "Resuelto"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Resume"
|
msgid "Resume"
|
||||||
msgstr "Reanudar"
|
msgstr "Reanudar"
|
||||||
@@ -661,6 +800,10 @@ msgstr "Reanudar"
|
|||||||
msgid "Rotate token"
|
msgid "Rotate token"
|
||||||
msgstr "Rotar token"
|
msgstr "Rotar token"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Rows per page"
|
||||||
|
msgstr "Filas por página"
|
||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
||||||
msgstr "Guarde la dirección usando la tecla enter o coma. Deje en blanco para desactivar las notificaciones por correo."
|
msgstr "Guarde la dirección usando la tecla enter o coma. Deje en blanco para desactivar las notificaciones por correo."
|
||||||
@@ -686,8 +829,7 @@ msgstr "Buscar sistemas o configuraciones..."
|
|||||||
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
||||||
msgstr "Consulte <0>configuración de notificaciones</0> para configurar cómo recibe alertas."
|
msgstr "Consulte <0>configuración de notificaciones</0> para configurar cómo recibe alertas."
|
||||||
|
|
||||||
#. Network bytes sent (upload)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Sent"
|
msgid "Sent"
|
||||||
msgstr "Enviado"
|
msgstr "Enviado"
|
||||||
|
|
||||||
@@ -718,6 +860,11 @@ msgstr "Configuración SMTP"
|
|||||||
msgid "Sort By"
|
msgid "Sort By"
|
||||||
msgstr "Ordenar por"
|
msgstr "Ordenar por"
|
||||||
|
|
||||||
|
#. Context: alert state (active or resolved)
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "State"
|
||||||
|
msgstr "Estado"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr "Estado"
|
msgstr "Estado"
|
||||||
@@ -733,10 +880,16 @@ msgstr "Uso de Swap"
|
|||||||
#. System theme
|
#. System theme
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Sistema"
|
msgstr "Sistema"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "System load averages over time"
|
||||||
|
msgstr "Promedios de carga del sistema a lo largo del tiempo"
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Systems"
|
msgid "Systems"
|
||||||
msgstr "Sistemas"
|
msgstr "Sistemas"
|
||||||
@@ -759,6 +912,10 @@ msgstr "Temperatura"
|
|||||||
msgid "Temperature"
|
msgid "Temperature"
|
||||||
msgstr "Temperatura"
|
msgstr "Temperatura"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Temperature unit"
|
||||||
|
msgstr "Unidad de temperatura"
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Temperatures of system sensors"
|
msgid "Temperatures of system sensors"
|
||||||
msgstr "Temperaturas de los sensores del sistema"
|
msgstr "Temperaturas de los sensores del sistema"
|
||||||
@@ -779,6 +936,10 @@ msgstr "Luego inicie sesión en el backend y restablezca la contraseña de su cu
|
|||||||
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
||||||
msgstr "Esta acción no se puede deshacer. Esto eliminará permanentemente todos los registros actuales de {name} de la base de datos."
|
msgstr "Esta acción no se puede deshacer. Esto eliminará permanentemente todos los registros actuales de {name} de la base de datos."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "This will permanently delete all selected records from the database."
|
||||||
|
msgstr "Esto eliminará permanentemente todos los registros seleccionados de la base de datos."
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Throughput of {extraFsName}"
|
msgid "Throughput of {extraFsName}"
|
||||||
msgstr "Rendimiento de {extraFsName}"
|
msgstr "Rendimiento de {extraFsName}"
|
||||||
@@ -801,8 +962,9 @@ msgid "Toggle theme"
|
|||||||
msgstr "Alternar tema"
|
msgstr "Alternar tema"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr "Token"
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
@@ -818,6 +980,18 @@ msgstr "Los tokens permiten que los agentes se conecten y registren. Las huellas
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr "Los tokens y las huellas digitales se utilizan para autenticar las conexiones WebSocket al hub."
|
msgstr "Los tokens y las huellas digitales se utilizan para autenticar las conexiones WebSocket al hub."
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 1 minute load average exceeds a threshold"
|
||||||
|
msgstr "Se activa cuando la carga media de 1 minuto supera un umbral"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr "Se activa cuando la carga media de 15 minutos supera un umbral"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr "Se activa cuando la carga media de 5 minutos supera un umbral"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Se activa cuando cualquier sensor supera un umbral"
|
msgstr "Se activa cuando cualquier sensor supera un umbral"
|
||||||
@@ -842,6 +1016,11 @@ msgstr "Se activa cuando el estado cambia entre activo e inactivo"
|
|||||||
msgid "Triggers when usage of any disk exceeds a threshold"
|
msgid "Triggers when usage of any disk exceeds a threshold"
|
||||||
msgstr "Se activa cuando el uso de cualquier disco supera un umbral"
|
msgstr "Se activa cuando el uso de cualquier disco supera un umbral"
|
||||||
|
|
||||||
|
#. Temperature / network units
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Unit preferences"
|
||||||
|
msgstr "Preferencias de unidad"
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Universal token"
|
msgid "Universal token"
|
||||||
msgstr "Token universal"
|
msgstr "Token universal"
|
||||||
@@ -862,7 +1041,8 @@ msgstr "Tiempo de actividad"
|
|||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
msgid "Usage"
|
msgid "Usage"
|
||||||
msgstr "Uso"
|
msgstr "Uso"
|
||||||
|
|
||||||
@@ -872,7 +1052,6 @@ msgstr "Uso de la partición raíz"
|
|||||||
|
|
||||||
#: src/components/charts/swap-chart.tsx
|
#: src/components/charts/swap-chart.tsx
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Used"
|
msgid "Used"
|
||||||
msgstr "Usado"
|
msgstr "Usado"
|
||||||
|
|
||||||
@@ -881,10 +1060,18 @@ msgstr "Usado"
|
|||||||
msgid "Users"
|
msgid "Users"
|
||||||
msgstr "Usuarios"
|
msgstr "Usuarios"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Value"
|
||||||
|
msgstr "Valor"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "View"
|
msgid "View"
|
||||||
msgstr "Vista"
|
msgstr "Vista"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "View your 200 most recent alerts."
|
||||||
|
msgstr "Ver sus 200 alertas más recientes."
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Visible Fields"
|
msgid "Visible Fields"
|
||||||
msgstr "Columnas visibles"
|
msgstr "Columnas visibles"
|
||||||
@@ -906,13 +1093,14 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr "Cuando está habilitado, este token permite que los agentes se auto-registren sin crear previamente el sistema. Expira después de una hora o al reiniciar el hub."
|
msgstr "Cuando está habilitado, este token permite que los agentes se auto-registren sin crear previamente el sistema. Expira después de una hora o al reiniciar el hub."
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Comando Windows"
|
msgstr "Comando Windows"
|
||||||
|
|
||||||
#. Disk write
|
#. Disk write
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Write"
|
msgid "Write"
|
||||||
msgstr "Escritura"
|
msgstr "Escritura"
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ msgstr ""
|
|||||||
"Language: fa\n"
|
"Language: fa\n"
|
||||||
"Project-Id-Version: beszel\n"
|
"Project-Id-Version: beszel\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2025-03-06 07:27\n"
|
"PO-Revision-Date: 2025-07-25 22:44\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: Persian\n"
|
"Language-Team: Persian\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
@@ -23,6 +23,12 @@ msgstr ""
|
|||||||
msgid "{0, plural, one {# day} other {# days}}"
|
msgid "{0, plural, one {# day} other {# days}}"
|
||||||
msgstr "{0, plural, one {# روز} other {# روز}}"
|
msgstr "{0, plural, one {# روز} other {# روز}}"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
|
||||||
|
#. placeholder {1}: table.getFilteredRowModel().rows.length
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "{0} of {1} row(s) selected."
|
||||||
|
msgstr "{0} از {1} ردیف انتخاب شده است."
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "{hours, plural, one {# hour} other {# hours}}"
|
msgid "{hours, plural, one {# hour} other {# hours}}"
|
||||||
msgstr "{hours, plural, one {# ساعت} other {# ساعت}}"
|
msgstr "{hours, plural, one {# ساعت} other {# ساعت}}"
|
||||||
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# ساعت} other {# ساعت}}"
|
|||||||
msgid "1 hour"
|
msgid "1 hour"
|
||||||
msgstr "۱ ساعت"
|
msgstr "۱ ساعت"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "1 min"
|
||||||
|
msgstr "۱ دقیقه"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "1 week"
|
msgid "1 week"
|
||||||
msgstr "۱ هفته"
|
msgstr "۱ هفته"
|
||||||
@@ -39,6 +50,11 @@ msgstr "۱ هفته"
|
|||||||
msgid "12 hours"
|
msgid "12 hours"
|
||||||
msgstr "۱۲ ساعت"
|
msgstr "۱۲ ساعت"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "15 min"
|
||||||
|
msgstr "۱۵ دقیقه"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "24 hours"
|
msgid "24 hours"
|
||||||
msgstr "۲۴ ساعت"
|
msgstr "۲۴ ساعت"
|
||||||
@@ -47,12 +63,22 @@ msgstr "۲۴ ساعت"
|
|||||||
msgid "30 days"
|
msgid "30 days"
|
||||||
msgstr "۳۰ روز"
|
msgstr "۳۰ روز"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "5 min"
|
||||||
|
msgstr "۵ دقیقه"
|
||||||
|
|
||||||
#. Table column
|
#. Table column
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "عملیات"
|
msgstr "عملیات"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Active"
|
||||||
|
msgstr "فعال"
|
||||||
|
|
||||||
#: src/components/routes/home.tsx
|
#: src/components/routes/home.tsx
|
||||||
msgid "Active Alerts"
|
msgid "Active Alerts"
|
||||||
msgstr " هشدارهای فعال"
|
msgstr " هشدارهای فعال"
|
||||||
@@ -86,6 +112,12 @@ msgstr "مدیر"
|
|||||||
msgid "Agent"
|
msgid "Agent"
|
||||||
msgstr "عامل"
|
msgstr "عامل"
|
||||||
|
|
||||||
|
#: src/components/command-palette.tsx
|
||||||
|
#: src/components/routes/settings/layout.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Alert History"
|
||||||
|
msgstr "تاریخچه هشدارها"
|
||||||
|
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
msgid "Alerts"
|
msgid "Alerts"
|
||||||
@@ -100,6 +132,10 @@ msgstr "همه سیستمها"
|
|||||||
msgid "Are you sure you want to delete {name}?"
|
msgid "Are you sure you want to delete {name}?"
|
||||||
msgstr "آیا مطمئن هستید که میخواهید {name} را حذف کنید؟"
|
msgstr "آیا مطمئن هستید که میخواهید {name} را حذف کنید؟"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Are you sure?"
|
||||||
|
msgstr "آیا مطمئن هستید؟"
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Automatic copy requires a secure context."
|
msgid "Automatic copy requires a secure context."
|
||||||
msgstr "کپی خودکار نیاز به یک زمینه امن دارد."
|
msgstr "کپی خودکار نیاز به یک زمینه امن دارد."
|
||||||
@@ -115,7 +151,7 @@ msgstr "میانگین استفاده از CPU کانتینرها"
|
|||||||
#. placeholder {0}: data.alert.unit
|
#. placeholder {0}: data.alert.unit
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "Average exceeds <0>{value}{0}</0>"
|
msgid "Average exceeds <0>{value}{0}</0>"
|
||||||
msgstr ""
|
msgstr "میانگین از <0>{value}{0}</0> فراتر رفته است"
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Average power consumption of GPUs"
|
msgid "Average power consumption of GPUs"
|
||||||
@@ -152,11 +188,22 @@ msgstr "بِزل از <0>Shoutrrr</0> برای ادغام با سرویسها
|
|||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
msgstr "دودویی"
|
msgstr "دودویی"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bits (Kbps, Mbps, Gbps)"
|
||||||
|
msgstr "بیت (کیلوبیت بر ثانیه، مگابیت بر ثانیه، گیگابیت بر ثانیه)"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bytes (KB/s, MB/s, GB/s)"
|
||||||
|
msgstr "بایت (کیلوبایت بر ثانیه، مگابایت بر ثانیه، گیگابایت بر ثانیه)"
|
||||||
|
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
msgid "Cache / Buffers"
|
msgid "Cache / Buffers"
|
||||||
msgstr "حافظه پنهان / بافرها"
|
msgstr "حافظه پنهان / بافرها"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "لغو"
|
msgstr "لغو"
|
||||||
|
|
||||||
@@ -164,6 +211,14 @@ msgstr "لغو"
|
|||||||
msgid "Caution - potential data loss"
|
msgid "Caution - potential data loss"
|
||||||
msgstr "احتیاط - احتمال از دست رفتن دادهها"
|
msgstr "احتیاط - احتمال از دست رفتن دادهها"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Celsius (°C)"
|
||||||
|
msgstr "سلسیوس (°C)"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Change display units for metrics."
|
||||||
|
msgstr "تغییر واحدهای نمایش برای معیارها."
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Change general application options."
|
msgid "Change general application options."
|
||||||
msgstr "تغییر گزینههای کلی برنامه."
|
msgstr "تغییر گزینههای کلی برنامه."
|
||||||
@@ -202,7 +257,12 @@ msgstr "نحوه دریافت هشدارهای اطلاعرسانی را پی
|
|||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr "تأیید رمز عبور"
|
msgstr "تأیید رمز عبور"
|
||||||
|
|
||||||
|
#: src/components/routes/home.tsx
|
||||||
|
msgid "Connection is down"
|
||||||
|
msgstr "اتصال قطع است"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Continue"
|
msgid "Continue"
|
||||||
msgstr "ادامه"
|
msgstr "ادامه"
|
||||||
|
|
||||||
@@ -211,11 +271,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "در کلیپبورد کپی شد"
|
msgstr "در کلیپبورد کپی شد"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "کپی docker compose"
|
msgstr "کپی docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "کپی docker run"
|
msgstr "کپی docker run"
|
||||||
@@ -230,9 +292,14 @@ msgid "Copy host"
|
|||||||
msgstr "کپی میزبان"
|
msgstr "کپی میزبان"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "کپی دستور لینوکس"
|
msgstr "کپی دستور لینوکس"
|
||||||
|
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Copy name"
|
||||||
|
msgstr "کپی نام"
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Copy text"
|
msgid "Copy text"
|
||||||
msgstr "کپی متن"
|
msgstr "کپی متن"
|
||||||
@@ -255,7 +322,7 @@ msgstr "پردازنده"
|
|||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "CPU Usage"
|
msgid "CPU Usage"
|
||||||
msgstr "میزان استفاده از پردازنده"
|
msgstr "میزان استفاده از پردازنده"
|
||||||
|
|
||||||
@@ -263,6 +330,11 @@ msgstr "میزان استفاده از پردازنده"
|
|||||||
msgid "Create account"
|
msgid "Create account"
|
||||||
msgstr "ایجاد حساب کاربری"
|
msgstr "ایجاد حساب کاربری"
|
||||||
|
|
||||||
|
#. Context: date created
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Created"
|
||||||
|
msgstr "ایجاد شده"
|
||||||
|
|
||||||
#. Dark theme
|
#. Dark theme
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
@@ -278,6 +350,7 @@ msgid "Default time period"
|
|||||||
msgstr "بازه زمانی پیشفرض"
|
msgstr "بازه زمانی پیشفرض"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "حذف"
|
msgstr "حذف"
|
||||||
|
|
||||||
@@ -293,6 +366,10 @@ msgstr "دیسک"
|
|||||||
msgid "Disk I/O"
|
msgid "Disk I/O"
|
||||||
msgstr "ورودی/خروجی دیسک"
|
msgstr "ورودی/خروجی دیسک"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Disk unit"
|
||||||
|
msgstr "واحد دیسک"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/disk-chart.tsx
|
#: src/components/charts/disk-chart.tsx
|
||||||
@@ -321,15 +398,20 @@ msgstr "مستندات"
|
|||||||
|
|
||||||
#. Context: System is down
|
#. Context: System is down
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Down"
|
msgid "Down"
|
||||||
msgstr ""
|
msgstr "قطع"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Duration"
|
||||||
|
msgstr "مدت زمان"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
msgstr ""
|
msgstr "ویرایش"
|
||||||
|
|
||||||
#: src/components/login/forgot-pass-form.tsx
|
#: src/components/login/forgot-pass-form.tsx
|
||||||
#: src/components/login/auth-form.tsx
|
#: src/components/login/auth-form.tsx
|
||||||
@@ -351,6 +433,7 @@ msgstr "آدرس ایمیل را وارد کنید..."
|
|||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
#: src/components/login/auth-form.tsx
|
#: src/components/login/auth-form.tsx
|
||||||
msgid "Error"
|
msgid "Error"
|
||||||
msgstr "خطا"
|
msgstr "خطا"
|
||||||
@@ -366,6 +449,10 @@ msgstr "در {2, plural, one {# دقیقه} other {# دقیقه}} گذشته ا
|
|||||||
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
||||||
msgstr "سیستمهای موجود که در <0>config.yml</0> تعریف نشدهاند حذف خواهند شد. لطفاً به طور منظم پشتیبانگیری کنید."
|
msgstr "سیستمهای موجود که در <0>config.yml</0> تعریف نشدهاند حذف خواهند شد. لطفاً به طور منظم پشتیبانگیری کنید."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Export"
|
||||||
|
msgstr "خروجی گرفتن"
|
||||||
|
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
msgid "Export configuration"
|
msgid "Export configuration"
|
||||||
msgstr "خارج کردن پیکربندی"
|
msgstr "خارج کردن پیکربندی"
|
||||||
@@ -374,6 +461,10 @@ msgstr "خارج کردن پیکربندی"
|
|||||||
msgid "Export your current systems configuration."
|
msgid "Export your current systems configuration."
|
||||||
msgstr "پیکربندی سیستمهای فعلی خود را خارج کنید."
|
msgstr "پیکربندی سیستمهای فعلی خود را خارج کنید."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Fahrenheit (°F)"
|
||||||
|
msgstr "فارنهایت (°F)"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Failed to authenticate"
|
msgid "Failed to authenticate"
|
||||||
msgstr "احراز هویت ناموفق بود"
|
msgstr "احراز هویت ناموفق بود"
|
||||||
@@ -393,9 +484,14 @@ msgstr "بهروزرسانی هشدار ناموفق بود"
|
|||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "فیلتر..."
|
msgstr "فیلتر..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr "اثر انگشت"
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "برای <0>{min}</0> {min, plural, one {دقیقه} other {دقیقه}}"
|
msgstr "برای <0>{min}</0> {min, plural, one {دقیقه} other {دقیقه}}"
|
||||||
@@ -419,6 +515,7 @@ msgid "Grid"
|
|||||||
msgstr "جدول"
|
msgstr "جدول"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "دستور Homebrew"
|
msgstr "دستور Homebrew"
|
||||||
@@ -453,6 +550,27 @@ msgstr "طرحبندی"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "روشن"
|
msgstr "روشن"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "Load Average"
|
||||||
|
msgstr "میانگین بار"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr "میانگین بار ۱۵ دقیقه"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 1m"
|
||||||
|
msgstr "میانگین بار ۱ دقیقه"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr "میانگین بار ۵ دقیقه"
|
||||||
|
|
||||||
|
#. Short label for load average
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Load Avg"
|
||||||
|
msgstr "میانگین بار"
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "خروج"
|
msgstr "خروج"
|
||||||
@@ -481,7 +599,7 @@ msgstr "مدیریت تنظیمات نمایش و اعلانها."
|
|||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Manual setup instructions"
|
msgid "Manual setup instructions"
|
||||||
msgstr ""
|
msgstr "دستورالعملهای راهاندازی دستی"
|
||||||
|
|
||||||
#. Chart select field. Please try to keep this short.
|
#. Chart select field. Please try to keep this short.
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
@@ -501,6 +619,7 @@ msgstr "میزان استفاده از حافظه"
|
|||||||
msgid "Memory usage of docker containers"
|
msgid "Memory usage of docker containers"
|
||||||
msgstr "میزان استفاده از حافظه کانتینرهای داکر"
|
msgstr "میزان استفاده از حافظه کانتینرهای داکر"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "نام"
|
msgstr "نام"
|
||||||
@@ -517,10 +636,19 @@ msgstr "ترافیک شبکه کانتینرهای داکر"
|
|||||||
msgid "Network traffic of public interfaces"
|
msgid "Network traffic of public interfaces"
|
||||||
msgstr "ترافیک شبکه رابطهای عمومی"
|
msgstr "ترافیک شبکه رابطهای عمومی"
|
||||||
|
|
||||||
|
#. Context: Bytes or bits
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Network unit"
|
||||||
|
msgstr "واحد شبکه"
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "No results found."
|
msgid "No results found."
|
||||||
msgstr "هیچ نتیجهای یافت نشد."
|
msgstr "هیچ نتیجهای یافت نشد."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "No results."
|
||||||
|
msgstr "نتیجهای یافت نشد."
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "No systems found."
|
msgid "No systems found."
|
||||||
@@ -558,6 +686,12 @@ msgstr "بازنویسی هشدارهای موجود"
|
|||||||
msgid "Page"
|
msgid "Page"
|
||||||
msgstr "صفحه"
|
msgstr "صفحه"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getState().pagination.pageIndex + 1
|
||||||
|
#. placeholder {1}: table.getPageCount()
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Page {0} of {1}"
|
||||||
|
msgstr "صفحه {0} از {1}"
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "Pages / Settings"
|
msgid "Pages / Settings"
|
||||||
msgstr "صفحات / تنظیمات"
|
msgstr "صفحات / تنظیمات"
|
||||||
@@ -573,7 +707,7 @@ msgstr "رمز عبور باید حداقل ۸ کاراکتر باشد."
|
|||||||
|
|
||||||
#: src/components/login/auth-form.tsx
|
#: src/components/login/auth-form.tsx
|
||||||
msgid "Password must be less than 72 bytes."
|
msgid "Password must be less than 72 bytes."
|
||||||
msgstr ""
|
msgstr "رمز عبور باید کمتر از ۷۲ بایت باشد."
|
||||||
|
|
||||||
#: src/components/login/forgot-pass-form.tsx
|
#: src/components/login/forgot-pass-form.tsx
|
||||||
msgid "Password reset request received"
|
msgid "Password reset request received"
|
||||||
@@ -639,13 +773,12 @@ msgid "Public Key"
|
|||||||
msgstr "کلید عمومی"
|
msgstr "کلید عمومی"
|
||||||
|
|
||||||
#. Disk read
|
#. Disk read
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Read"
|
msgid "Read"
|
||||||
msgstr "خواندن"
|
msgstr "خواندن"
|
||||||
|
|
||||||
#. Network bytes received (download)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Received"
|
msgid "Received"
|
||||||
msgstr "دریافت شد"
|
msgstr "دریافت شد"
|
||||||
|
|
||||||
@@ -653,6 +786,12 @@ msgstr "دریافت شد"
|
|||||||
msgid "Reset Password"
|
msgid "Reset Password"
|
||||||
msgstr "بازنشانی رمز عبور"
|
msgstr "بازنشانی رمز عبور"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Resolved"
|
||||||
|
msgstr "حل شده"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Resume"
|
msgid "Resume"
|
||||||
msgstr "ادامه"
|
msgstr "ادامه"
|
||||||
@@ -661,6 +800,10 @@ msgstr "ادامه"
|
|||||||
msgid "Rotate token"
|
msgid "Rotate token"
|
||||||
msgstr "چرخش توکن"
|
msgstr "چرخش توکن"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Rows per page"
|
||||||
|
msgstr "ردیف در هر صفحه"
|
||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
||||||
msgstr "آدرس را با استفاده از کلید Enter یا کاما ذخیره کنید. برای غیرفعال کردن اعلانهای ایمیلی، خالی بگذارید."
|
msgstr "آدرس را با استفاده از کلید Enter یا کاما ذخیره کنید. برای غیرفعال کردن اعلانهای ایمیلی، خالی بگذارید."
|
||||||
@@ -672,7 +815,7 @@ msgstr "ذخیره تنظیمات"
|
|||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Save system"
|
msgid "Save system"
|
||||||
msgstr ""
|
msgstr "ذخیره سیستم"
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
@@ -686,8 +829,7 @@ msgstr "جستجو برای سیستمها یا تنظیمات..."
|
|||||||
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
||||||
msgstr "برای پیکربندی نحوه دریافت هشدارها، به <0>تنظیمات اعلان</0> مراجعه کنید."
|
msgstr "برای پیکربندی نحوه دریافت هشدارها، به <0>تنظیمات اعلان</0> مراجعه کنید."
|
||||||
|
|
||||||
#. Network bytes sent (upload)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Sent"
|
msgid "Sent"
|
||||||
msgstr "ارسال شد"
|
msgstr "ارسال شد"
|
||||||
|
|
||||||
@@ -718,6 +860,11 @@ msgstr "تنظیمات SMTP"
|
|||||||
msgid "Sort By"
|
msgid "Sort By"
|
||||||
msgstr "مرتبسازی بر اساس"
|
msgstr "مرتبسازی بر اساس"
|
||||||
|
|
||||||
|
#. Context: alert state (active or resolved)
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "State"
|
||||||
|
msgstr "وضعیت"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr "وضعیت"
|
msgstr "وضعیت"
|
||||||
@@ -733,10 +880,16 @@ msgstr "میزان استفاده از Swap"
|
|||||||
#. System theme
|
#. System theme
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "سیستم"
|
msgstr "سیستم"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "System load averages over time"
|
||||||
|
msgstr "میانگین بار سیستم در طول زمان"
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Systems"
|
msgid "Systems"
|
||||||
msgstr "سیستمها"
|
msgstr "سیستمها"
|
||||||
@@ -752,13 +905,17 @@ msgstr "جدول"
|
|||||||
#. Temperature label in systems table
|
#. Temperature label in systems table
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Temp"
|
msgid "Temp"
|
||||||
msgstr ""
|
msgstr "دما"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Temperature"
|
msgid "Temperature"
|
||||||
msgstr "دما"
|
msgstr "دما"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Temperature unit"
|
||||||
|
msgstr "واحد دما"
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Temperatures of system sensors"
|
msgid "Temperatures of system sensors"
|
||||||
msgstr "دمای حسگرهای سیستم"
|
msgstr "دمای حسگرهای سیستم"
|
||||||
@@ -779,6 +936,10 @@ msgstr "سپس وارد بخش پشتیبان شوید و رمز عبور حسا
|
|||||||
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
||||||
msgstr "این عمل قابل برگشت نیست. این کار تمام رکوردهای فعلی {name} را برای همیشه از پایگاه داده حذف خواهد کرد."
|
msgstr "این عمل قابل برگشت نیست. این کار تمام رکوردهای فعلی {name} را برای همیشه از پایگاه داده حذف خواهد کرد."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "This will permanently delete all selected records from the database."
|
||||||
|
msgstr "این کار تمام رکوردهای انتخاب شده را برای همیشه از پایگاه داده حذف خواهد کرد."
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Throughput of {extraFsName}"
|
msgid "Throughput of {extraFsName}"
|
||||||
msgstr "توان عملیاتی {extraFsName}"
|
msgstr "توان عملیاتی {extraFsName}"
|
||||||
@@ -801,6 +962,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "تغییر تم"
|
msgstr "تغییر تم"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr "توکن"
|
msgstr "توکن"
|
||||||
|
|
||||||
@@ -818,6 +980,18 @@ msgstr "توکنها به عاملها اجازه اتصال و ثبت
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr "توکنها و اثرات انگشت برای احراز هویت اتصالات WebSocket به هاب استفاده میشوند."
|
msgstr "توکنها و اثرات انگشت برای احراز هویت اتصالات WebSocket به هاب استفاده میشوند."
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 1 minute load average exceeds a threshold"
|
||||||
|
msgstr "هنگامی که میانگین بار ۱ دقیقهای از یک آستانه فراتر رود، فعال میشود"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr "هنگامی که میانگین بار ۱۵ دقیقهای از یک آستانه فراتر رود، فعال میشود"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr "هنگامی که میانگین بار ۵ دقیقهای از یک آستانه فراتر رود، فعال میشود"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "هنگامی که هر حسگری از یک آستانه فراتر رود، فعال میشود"
|
msgstr "هنگامی که هر حسگری از یک آستانه فراتر رود، فعال میشود"
|
||||||
@@ -842,6 +1016,11 @@ msgstr "هنگامی که وضعیت بین بالا و پایین تغییر م
|
|||||||
msgid "Triggers when usage of any disk exceeds a threshold"
|
msgid "Triggers when usage of any disk exceeds a threshold"
|
||||||
msgstr "هنگامی که استفاده از هر دیسکی از یک آستانه فراتر رود، فعال میشود"
|
msgstr "هنگامی که استفاده از هر دیسکی از یک آستانه فراتر رود، فعال میشود"
|
||||||
|
|
||||||
|
#. Temperature / network units
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Unit preferences"
|
||||||
|
msgstr "تنظیمات واحدها"
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Universal token"
|
msgid "Universal token"
|
||||||
msgstr "توکن جهانی"
|
msgstr "توکن جهانی"
|
||||||
@@ -850,7 +1029,7 @@ msgstr "توکن جهانی"
|
|||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Up"
|
msgid "Up"
|
||||||
msgstr ""
|
msgstr "فعال"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Updated in real time. Click on a system to view information."
|
msgid "Updated in real time. Click on a system to view information."
|
||||||
@@ -862,7 +1041,8 @@ msgstr "آپتایم"
|
|||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
msgid "Usage"
|
msgid "Usage"
|
||||||
msgstr "میزان استفاده"
|
msgstr "میزان استفاده"
|
||||||
|
|
||||||
@@ -872,7 +1052,6 @@ msgstr "میزان استفاده از پارتیشن ریشه"
|
|||||||
|
|
||||||
#: src/components/charts/swap-chart.tsx
|
#: src/components/charts/swap-chart.tsx
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Used"
|
msgid "Used"
|
||||||
msgstr "استفاده شده"
|
msgstr "استفاده شده"
|
||||||
|
|
||||||
@@ -881,10 +1060,18 @@ msgstr "استفاده شده"
|
|||||||
msgid "Users"
|
msgid "Users"
|
||||||
msgstr "کاربران"
|
msgstr "کاربران"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Value"
|
||||||
|
msgstr "مقدار"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "View"
|
msgid "View"
|
||||||
msgstr "مشاهده"
|
msgstr "مشاهده"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "View your 200 most recent alerts."
|
||||||
|
msgstr "۲۰۰ هشدار اخیر خود را مشاهده کنید."
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Visible Fields"
|
msgid "Visible Fields"
|
||||||
msgstr "فیلدهای قابل مشاهده"
|
msgstr "فیلدهای قابل مشاهده"
|
||||||
@@ -906,13 +1093,14 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr "هنگامی که فعال است، این توکن به عاملها اجازه خودثبتنامی بدون ایجاد سیستم قبلی میدهد. پس از یک ساعت یا در راهاندازی مجدد هاب منقضی میشود."
|
msgstr "هنگامی که فعال است، این توکن به عاملها اجازه خودثبتنامی بدون ایجاد سیستم قبلی میدهد. پس از یک ساعت یا در راهاندازی مجدد هاب منقضی میشود."
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "دستور Windows"
|
msgstr "دستور Windows"
|
||||||
|
|
||||||
#. Disk write
|
#. Disk write
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Write"
|
msgid "Write"
|
||||||
msgstr "نوشتن"
|
msgstr "نوشتن"
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ msgstr ""
|
|||||||
"Language: fr\n"
|
"Language: fr\n"
|
||||||
"Project-Id-Version: beszel\n"
|
"Project-Id-Version: beszel\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2025-03-06 07:27\n"
|
"PO-Revision-Date: 2025-07-25 22:44\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: French\n"
|
"Language-Team: French\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||||
@@ -23,6 +23,12 @@ msgstr ""
|
|||||||
msgid "{0, plural, one {# day} other {# days}}"
|
msgid "{0, plural, one {# day} other {# days}}"
|
||||||
msgstr "{0, plural, one {# jour} other {# jours}}"
|
msgstr "{0, plural, one {# jour} other {# jours}}"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
|
||||||
|
#. placeholder {1}: table.getFilteredRowModel().rows.length
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "{0} of {1} row(s) selected."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "{hours, plural, one {# hour} other {# hours}}"
|
msgid "{hours, plural, one {# hour} other {# hours}}"
|
||||||
msgstr "{hours, plural, one {# heure} other {# heures}}"
|
msgstr "{hours, plural, one {# heure} other {# heures}}"
|
||||||
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# heure} other {# heures}}"
|
|||||||
msgid "1 hour"
|
msgid "1 hour"
|
||||||
msgstr "1 heure"
|
msgstr "1 heure"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "1 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "1 week"
|
msgid "1 week"
|
||||||
msgstr "1 semaine"
|
msgstr "1 semaine"
|
||||||
@@ -39,6 +50,11 @@ msgstr "1 semaine"
|
|||||||
msgid "12 hours"
|
msgid "12 hours"
|
||||||
msgstr "12 heures"
|
msgstr "12 heures"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "15 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "24 hours"
|
msgid "24 hours"
|
||||||
msgstr "24 heures"
|
msgstr "24 heures"
|
||||||
@@ -47,19 +63,29 @@ msgstr "24 heures"
|
|||||||
msgid "30 days"
|
msgid "30 days"
|
||||||
msgstr "30 jours"
|
msgstr "30 jours"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "5 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. Table column
|
#. Table column
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "Actions"
|
msgstr "Actions"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Active"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/home.tsx
|
#: src/components/routes/home.tsx
|
||||||
msgid "Active Alerts"
|
msgid "Active Alerts"
|
||||||
msgstr "Alertes actives"
|
msgstr "Alertes actives"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Add <0>System</0>"
|
msgid "Add <0>System</0>"
|
||||||
msgstr "Ajouter <0>Système</0>"
|
msgstr "Ajouter <0>un Système</0>"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Add New System"
|
msgid "Add New System"
|
||||||
@@ -71,7 +97,7 @@ msgstr "Ajouter un système"
|
|||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
msgid "Add URL"
|
msgid "Add URL"
|
||||||
msgstr "Ajouter URL"
|
msgstr "Ajouter l’URL"
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Adjust display options for charts."
|
msgid "Adjust display options for charts."
|
||||||
@@ -86,6 +112,12 @@ msgstr "Admin"
|
|||||||
msgid "Agent"
|
msgid "Agent"
|
||||||
msgstr "Agent"
|
msgstr "Agent"
|
||||||
|
|
||||||
|
#: src/components/command-palette.tsx
|
||||||
|
#: src/components/routes/settings/layout.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Alert History"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
msgid "Alerts"
|
msgid "Alerts"
|
||||||
@@ -100,6 +132,10 @@ msgstr "Tous les systèmes"
|
|||||||
msgid "Are you sure you want to delete {name}?"
|
msgid "Are you sure you want to delete {name}?"
|
||||||
msgstr "Êtes-vous sûr de vouloir supprimer {name} ?"
|
msgstr "Êtes-vous sûr de vouloir supprimer {name} ?"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Are you sure?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Automatic copy requires a secure context."
|
msgid "Automatic copy requires a secure context."
|
||||||
msgstr "La copie automatique nécessite un contexte sécurisé."
|
msgstr "La copie automatique nécessite un contexte sécurisé."
|
||||||
@@ -152,11 +188,22 @@ msgstr "Beszel utilise <0>Shoutrrr</0> pour s'intégrer aux services de notifica
|
|||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
msgstr "Binaire"
|
msgstr "Binaire"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bits (Kbps, Mbps, Gbps)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bytes (KB/s, MB/s, GB/s)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
msgid "Cache / Buffers"
|
msgid "Cache / Buffers"
|
||||||
msgstr "Cache / Tampons"
|
msgstr "Cache / Tampons"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Annuler"
|
msgstr "Annuler"
|
||||||
|
|
||||||
@@ -164,6 +211,14 @@ msgstr "Annuler"
|
|||||||
msgid "Caution - potential data loss"
|
msgid "Caution - potential data loss"
|
||||||
msgstr "Attention - perte de données potentielle"
|
msgstr "Attention - perte de données potentielle"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Celsius (°C)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Change display units for metrics."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Change general application options."
|
msgid "Change general application options."
|
||||||
msgstr "Modifier les options générales de l'application."
|
msgstr "Modifier les options générales de l'application."
|
||||||
@@ -202,7 +257,12 @@ msgstr "Configurez comment vous recevez les notifications d'alerte."
|
|||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr "Confirmer le mot de passe"
|
msgstr "Confirmer le mot de passe"
|
||||||
|
|
||||||
|
#: src/components/routes/home.tsx
|
||||||
|
msgid "Connection is down"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Continue"
|
msgid "Continue"
|
||||||
msgstr "Continuer"
|
msgstr "Continuer"
|
||||||
|
|
||||||
@@ -211,11 +271,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Copié dans le presse-papiers"
|
msgstr "Copié dans le presse-papiers"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Copier docker compose"
|
msgstr "Copier docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Copier docker run"
|
msgstr "Copier docker run"
|
||||||
@@ -230,9 +292,14 @@ msgid "Copy host"
|
|||||||
msgstr "Copier l'hôte"
|
msgstr "Copier l'hôte"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Copier la commande Linux"
|
msgstr "Copier la commande Linux"
|
||||||
|
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Copy name"
|
||||||
|
msgstr "Copier le nom"
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Copy text"
|
msgid "Copy text"
|
||||||
msgstr "Copier le texte"
|
msgstr "Copier le texte"
|
||||||
@@ -255,7 +322,7 @@ msgstr "CPU"
|
|||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "CPU Usage"
|
msgid "CPU Usage"
|
||||||
msgstr "Utilisation du CPU"
|
msgstr "Utilisation du CPU"
|
||||||
|
|
||||||
@@ -263,6 +330,11 @@ msgstr "Utilisation du CPU"
|
|||||||
msgid "Create account"
|
msgid "Create account"
|
||||||
msgstr "Créer un compte"
|
msgstr "Créer un compte"
|
||||||
|
|
||||||
|
#. Context: date created
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Created"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. Dark theme
|
#. Dark theme
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
@@ -278,6 +350,7 @@ msgid "Default time period"
|
|||||||
msgstr "Période par défaut"
|
msgstr "Période par défaut"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Supprimer"
|
msgstr "Supprimer"
|
||||||
|
|
||||||
@@ -293,6 +366,10 @@ msgstr "Disque"
|
|||||||
msgid "Disk I/O"
|
msgid "Disk I/O"
|
||||||
msgstr "Entrée/Sortie disque"
|
msgstr "Entrée/Sortie disque"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Disk unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/disk-chart.tsx
|
#: src/components/charts/disk-chart.tsx
|
||||||
@@ -321,11 +398,16 @@ msgstr "Documentation"
|
|||||||
|
|
||||||
#. Context: System is down
|
#. Context: System is down
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Down"
|
msgid "Down"
|
||||||
msgstr "Injoignable"
|
msgstr "Injoignable"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Duration"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
@@ -351,6 +433,7 @@ msgstr "Entrez l'adresse email..."
|
|||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
#: src/components/login/auth-form.tsx
|
#: src/components/login/auth-form.tsx
|
||||||
msgid "Error"
|
msgid "Error"
|
||||||
msgstr "Erreur"
|
msgstr "Erreur"
|
||||||
@@ -366,6 +449,10 @@ msgstr "Dépasse {0}{1} dans {2, plural, one {la dernière # minute} other {les
|
|||||||
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
||||||
msgstr "Les systèmes existants non définis dans <0>config.yml</0> seront supprimés. Veuillez faire des sauvegardes régulières."
|
msgstr "Les systèmes existants non définis dans <0>config.yml</0> seront supprimés. Veuillez faire des sauvegardes régulières."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Export"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
msgid "Export configuration"
|
msgid "Export configuration"
|
||||||
msgstr "Exporter la configuration"
|
msgstr "Exporter la configuration"
|
||||||
@@ -374,6 +461,10 @@ msgstr "Exporter la configuration"
|
|||||||
msgid "Export your current systems configuration."
|
msgid "Export your current systems configuration."
|
||||||
msgstr "Exportez la configuration actuelle de vos systèmes."
|
msgstr "Exportez la configuration actuelle de vos systèmes."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Fahrenheit (°F)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Failed to authenticate"
|
msgid "Failed to authenticate"
|
||||||
msgstr "Échec de l'authentification"
|
msgstr "Échec de l'authentification"
|
||||||
@@ -393,9 +484,14 @@ msgstr "Échec de la mise à jour de l'alerte"
|
|||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Filtrer..."
|
msgstr "Filtrer..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "Pour <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgstr "Pour <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
@@ -419,6 +515,7 @@ msgid "Grid"
|
|||||||
msgstr "Grille"
|
msgstr "Grille"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Commande Homebrew"
|
msgstr "Commande Homebrew"
|
||||||
@@ -453,6 +550,27 @@ msgstr "Disposition"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Clair"
|
msgstr "Clair"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "Load Average"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 1m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Short label for load average
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Load Avg"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Déconnexion"
|
msgstr "Déconnexion"
|
||||||
@@ -501,6 +619,7 @@ msgstr "Utilisation de la mémoire"
|
|||||||
msgid "Memory usage of docker containers"
|
msgid "Memory usage of docker containers"
|
||||||
msgstr "Utilisation de la mémoire des conteneurs Docker"
|
msgstr "Utilisation de la mémoire des conteneurs Docker"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Nom"
|
msgstr "Nom"
|
||||||
@@ -517,10 +636,19 @@ msgstr "Trafic réseau des conteneurs Docker"
|
|||||||
msgid "Network traffic of public interfaces"
|
msgid "Network traffic of public interfaces"
|
||||||
msgstr "Trafic réseau des interfaces publiques"
|
msgstr "Trafic réseau des interfaces publiques"
|
||||||
|
|
||||||
|
#. Context: Bytes or bits
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Network unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "No results found."
|
msgid "No results found."
|
||||||
msgstr "Aucun résultat trouvé."
|
msgstr "Aucun résultat trouvé."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "No results."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "No systems found."
|
msgid "No systems found."
|
||||||
@@ -558,6 +686,12 @@ msgstr "Écraser les alertes existantes"
|
|||||||
msgid "Page"
|
msgid "Page"
|
||||||
msgstr "Page"
|
msgstr "Page"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getState().pagination.pageIndex + 1
|
||||||
|
#. placeholder {1}: table.getPageCount()
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Page {0} of {1}"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "Pages / Settings"
|
msgid "Pages / Settings"
|
||||||
msgstr "Pages / Paramètres"
|
msgstr "Pages / Paramètres"
|
||||||
@@ -581,7 +715,7 @@ msgstr "Demande de réinitialisation du mot de passe reçue"
|
|||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Pause"
|
msgid "Pause"
|
||||||
msgstr "En pause"
|
msgstr "Pause"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Paused"
|
msgid "Paused"
|
||||||
@@ -639,13 +773,12 @@ msgid "Public Key"
|
|||||||
msgstr "Clé publique"
|
msgstr "Clé publique"
|
||||||
|
|
||||||
#. Disk read
|
#. Disk read
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Read"
|
msgid "Read"
|
||||||
msgstr "Lecture"
|
msgstr "Lecture"
|
||||||
|
|
||||||
#. Network bytes received (download)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Received"
|
msgid "Received"
|
||||||
msgstr "Reçu"
|
msgstr "Reçu"
|
||||||
|
|
||||||
@@ -653,6 +786,12 @@ msgstr "Reçu"
|
|||||||
msgid "Reset Password"
|
msgid "Reset Password"
|
||||||
msgstr "Réinitialiser le mot de passe"
|
msgstr "Réinitialiser le mot de passe"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Resolved"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Resume"
|
msgid "Resume"
|
||||||
msgstr "Reprendre"
|
msgstr "Reprendre"
|
||||||
@@ -661,6 +800,10 @@ msgstr "Reprendre"
|
|||||||
msgid "Rotate token"
|
msgid "Rotate token"
|
||||||
msgstr "Faire tourner le token"
|
msgstr "Faire tourner le token"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Rows per page"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
||||||
msgstr "Enregistrez l'adresse en utilisant la touche Entrée ou la virgule. Laissez vide pour désactiver les notifications par email."
|
msgstr "Enregistrez l'adresse en utilisant la touche Entrée ou la virgule. Laissez vide pour désactiver les notifications par email."
|
||||||
@@ -686,8 +829,7 @@ msgstr "Rechercher des systèmes ou des paramètres..."
|
|||||||
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
||||||
msgstr "Voir les <0>paramètres de notification</0> pour configurer comment vous recevez les alertes."
|
msgstr "Voir les <0>paramètres de notification</0> pour configurer comment vous recevez les alertes."
|
||||||
|
|
||||||
#. Network bytes sent (upload)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Sent"
|
msgid "Sent"
|
||||||
msgstr "Envoyé"
|
msgstr "Envoyé"
|
||||||
|
|
||||||
@@ -718,6 +860,11 @@ msgstr "Paramètres SMTP"
|
|||||||
msgid "Sort By"
|
msgid "Sort By"
|
||||||
msgstr "Trier par"
|
msgstr "Trier par"
|
||||||
|
|
||||||
|
#. Context: alert state (active or resolved)
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "State"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr "Statut"
|
msgstr "Statut"
|
||||||
@@ -733,10 +880,16 @@ msgstr "Utilisation du swap"
|
|||||||
#. System theme
|
#. System theme
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Système"
|
msgstr "Système"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "System load averages over time"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Systems"
|
msgid "Systems"
|
||||||
msgstr "Systèmes"
|
msgstr "Systèmes"
|
||||||
@@ -759,6 +912,10 @@ msgstr "Temp."
|
|||||||
msgid "Temperature"
|
msgid "Temperature"
|
||||||
msgstr "Température"
|
msgstr "Température"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Temperature unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Temperatures of system sensors"
|
msgid "Temperatures of system sensors"
|
||||||
msgstr "Températures des capteurs du système"
|
msgstr "Températures des capteurs du système"
|
||||||
@@ -779,6 +936,10 @@ msgstr "Ensuite, connectez-vous au backend et réinitialisez le mot de passe de
|
|||||||
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
||||||
msgstr "Cette action ne peut pas être annulée. Cela supprimera définitivement tous les enregistrements actuels pour {name} de la base de données."
|
msgstr "Cette action ne peut pas être annulée. Cela supprimera définitivement tous les enregistrements actuels pour {name} de la base de données."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "This will permanently delete all selected records from the database."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Throughput of {extraFsName}"
|
msgid "Throughput of {extraFsName}"
|
||||||
msgstr "Débit de {extraFsName}"
|
msgstr "Débit de {extraFsName}"
|
||||||
@@ -801,8 +962,9 @@ msgid "Toggle theme"
|
|||||||
msgstr "Changer le thème"
|
msgstr "Changer le thème"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr "Token"
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
@@ -818,6 +980,18 @@ msgstr "Les tokens permettent aux agents de se connecter et de s'enregistrer. Le
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr "Les tokens et les empreintes sont utilisés pour authentifier les connexions WebSocket vers le hub."
|
msgstr "Les tokens et les empreintes sont utilisés pour authentifier les connexions WebSocket vers le hub."
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 1 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Déclenchement lorsque tout capteur dépasse un seuil"
|
msgstr "Déclenchement lorsque tout capteur dépasse un seuil"
|
||||||
@@ -842,6 +1016,11 @@ msgstr "Se déclenche lorsque le statut passe de \"Joignable\" à \"Injoignable\
|
|||||||
msgid "Triggers when usage of any disk exceeds a threshold"
|
msgid "Triggers when usage of any disk exceeds a threshold"
|
||||||
msgstr "Déclenchement lorsque l'utilisation de tout disque dépasse un seuil"
|
msgstr "Déclenchement lorsque l'utilisation de tout disque dépasse un seuil"
|
||||||
|
|
||||||
|
#. Temperature / network units
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Unit preferences"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Universal token"
|
msgid "Universal token"
|
||||||
msgstr "Token universel"
|
msgstr "Token universel"
|
||||||
@@ -862,7 +1041,8 @@ msgstr "Temps de fonctionnement"
|
|||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
msgid "Usage"
|
msgid "Usage"
|
||||||
msgstr "Utilisation"
|
msgstr "Utilisation"
|
||||||
|
|
||||||
@@ -872,7 +1052,6 @@ msgstr "Utilisation de la partition racine"
|
|||||||
|
|
||||||
#: src/components/charts/swap-chart.tsx
|
#: src/components/charts/swap-chart.tsx
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Used"
|
msgid "Used"
|
||||||
msgstr "Utilisé"
|
msgstr "Utilisé"
|
||||||
|
|
||||||
@@ -881,10 +1060,18 @@ msgstr "Utilisé"
|
|||||||
msgid "Users"
|
msgid "Users"
|
||||||
msgstr "Utilisateurs"
|
msgstr "Utilisateurs"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Value"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "View"
|
msgid "View"
|
||||||
msgstr "Vue"
|
msgstr "Vue"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "View your 200 most recent alerts."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Visible Fields"
|
msgid "Visible Fields"
|
||||||
msgstr "Colonnes visibles"
|
msgstr "Colonnes visibles"
|
||||||
@@ -906,13 +1093,14 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr "Lorsqu'il est activé, ce token permet aux agents de s'auto-enregistrer sans création préalable du système. Expire après une heure ou au redémarrage du hub."
|
msgstr "Lorsqu'il est activé, ce token permet aux agents de s'auto-enregistrer sans création préalable du système. Expire après une heure ou au redémarrage du hub."
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Commande Windows"
|
msgstr "Commande Windows"
|
||||||
|
|
||||||
#. Disk write
|
#. Disk write
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Write"
|
msgid "Write"
|
||||||
msgstr "Écriture"
|
msgstr "Écriture"
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ msgstr ""
|
|||||||
"Language: hr\n"
|
"Language: hr\n"
|
||||||
"Project-Id-Version: beszel\n"
|
"Project-Id-Version: beszel\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2025-03-06 07:27\n"
|
"PO-Revision-Date: 2025-07-25 22:44\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: Croatian\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"
|
"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"
|
||||||
@@ -23,6 +23,12 @@ msgstr ""
|
|||||||
msgid "{0, plural, one {# day} other {# days}}"
|
msgid "{0, plural, one {# day} other {# days}}"
|
||||||
msgstr "{0, plural, one {# dan} other {# dani}}"
|
msgstr "{0, plural, one {# dan} other {# dani}}"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
|
||||||
|
#. placeholder {1}: table.getFilteredRowModel().rows.length
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "{0} of {1} row(s) selected."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "{hours, plural, one {# hour} other {# hours}}"
|
msgid "{hours, plural, one {# hour} other {# hours}}"
|
||||||
msgstr "{hours, plural, one {# sat} other {# sati}}"
|
msgstr "{hours, plural, one {# sat} other {# sati}}"
|
||||||
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# sat} other {# sati}}"
|
|||||||
msgid "1 hour"
|
msgid "1 hour"
|
||||||
msgstr "1 sat"
|
msgstr "1 sat"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "1 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "1 week"
|
msgid "1 week"
|
||||||
msgstr "1 tjedan"
|
msgstr "1 tjedan"
|
||||||
@@ -39,6 +50,11 @@ msgstr "1 tjedan"
|
|||||||
msgid "12 hours"
|
msgid "12 hours"
|
||||||
msgstr "12 sati"
|
msgstr "12 sati"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "15 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "24 hours"
|
msgid "24 hours"
|
||||||
msgstr "24 sati"
|
msgstr "24 sati"
|
||||||
@@ -47,12 +63,22 @@ msgstr "24 sati"
|
|||||||
msgid "30 days"
|
msgid "30 days"
|
||||||
msgstr "30 dana"
|
msgstr "30 dana"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "5 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. Table column
|
#. Table column
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "Akcije"
|
msgstr "Akcije"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Active"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/home.tsx
|
#: src/components/routes/home.tsx
|
||||||
msgid "Active Alerts"
|
msgid "Active Alerts"
|
||||||
msgstr "Aktivna upozorenja"
|
msgstr "Aktivna upozorenja"
|
||||||
@@ -86,6 +112,12 @@ msgstr "Admin"
|
|||||||
msgid "Agent"
|
msgid "Agent"
|
||||||
msgstr "Agent"
|
msgstr "Agent"
|
||||||
|
|
||||||
|
#: src/components/command-palette.tsx
|
||||||
|
#: src/components/routes/settings/layout.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Alert History"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
msgid "Alerts"
|
msgid "Alerts"
|
||||||
@@ -100,6 +132,10 @@ msgstr "Svi Sistemi"
|
|||||||
msgid "Are you sure you want to delete {name}?"
|
msgid "Are you sure you want to delete {name}?"
|
||||||
msgstr "Jeste li sigurni da želite izbrisati {name}?"
|
msgstr "Jeste li sigurni da želite izbrisati {name}?"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Are you sure?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Automatic copy requires a secure context."
|
msgid "Automatic copy requires a secure context."
|
||||||
msgstr "Automatsko kopiranje zahtijeva siguran kontekst."
|
msgstr "Automatsko kopiranje zahtijeva siguran kontekst."
|
||||||
@@ -152,11 +188,22 @@ msgstr "Beszel koristi <0>Shoutrrr</0> za integraciju sa popularnim servisima za
|
|||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
msgstr "Binarni"
|
msgstr "Binarni"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bits (Kbps, Mbps, Gbps)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bytes (KB/s, MB/s, GB/s)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
msgid "Cache / Buffers"
|
msgid "Cache / Buffers"
|
||||||
msgstr "Predmemorija / Međuspremnici"
|
msgstr "Predmemorija / Međuspremnici"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Otkaži"
|
msgstr "Otkaži"
|
||||||
|
|
||||||
@@ -164,6 +211,14 @@ msgstr "Otkaži"
|
|||||||
msgid "Caution - potential data loss"
|
msgid "Caution - potential data loss"
|
||||||
msgstr "Oprez - mogući gubitak podataka"
|
msgstr "Oprez - mogući gubitak podataka"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Celsius (°C)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Change display units for metrics."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Change general application options."
|
msgid "Change general application options."
|
||||||
msgstr "Promijenite opće opcije aplikacije."
|
msgstr "Promijenite opće opcije aplikacije."
|
||||||
@@ -202,7 +257,12 @@ msgstr "Konfigurirajte način primanja obavijesti upozorenja."
|
|||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr "Potvrdite lozinku"
|
msgstr "Potvrdite lozinku"
|
||||||
|
|
||||||
|
#: src/components/routes/home.tsx
|
||||||
|
msgid "Connection is down"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Continue"
|
msgid "Continue"
|
||||||
msgstr "Nastavite"
|
msgstr "Nastavite"
|
||||||
|
|
||||||
@@ -211,11 +271,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Kopirano u međuspremnik"
|
msgstr "Kopirano u međuspremnik"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Kopiraj docker compose"
|
msgstr "Kopiraj docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Kopiraj docker run"
|
msgstr "Kopiraj docker run"
|
||||||
@@ -230,9 +292,14 @@ msgid "Copy host"
|
|||||||
msgstr "Kopiraj hosta"
|
msgstr "Kopiraj hosta"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Kopiraj Linux komandu"
|
msgstr "Kopiraj Linux komandu"
|
||||||
|
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Copy name"
|
||||||
|
msgstr "Kopiraj naziv"
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Copy text"
|
msgid "Copy text"
|
||||||
msgstr "Kopiraj tekst"
|
msgstr "Kopiraj tekst"
|
||||||
@@ -255,7 +322,7 @@ msgstr "Procesor"
|
|||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "CPU Usage"
|
msgid "CPU Usage"
|
||||||
msgstr "Iskorištenost procesora"
|
msgstr "Iskorištenost procesora"
|
||||||
|
|
||||||
@@ -263,6 +330,11 @@ msgstr "Iskorištenost procesora"
|
|||||||
msgid "Create account"
|
msgid "Create account"
|
||||||
msgstr "Napravite račun"
|
msgstr "Napravite račun"
|
||||||
|
|
||||||
|
#. Context: date created
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Created"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. Dark theme
|
#. Dark theme
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
@@ -278,6 +350,7 @@ msgid "Default time period"
|
|||||||
msgstr "Zadano vremensko razdoblje"
|
msgstr "Zadano vremensko razdoblje"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Izbriši"
|
msgstr "Izbriši"
|
||||||
|
|
||||||
@@ -293,6 +366,10 @@ msgstr "Disk"
|
|||||||
msgid "Disk I/O"
|
msgid "Disk I/O"
|
||||||
msgstr "Disk I/O"
|
msgstr "Disk I/O"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Disk unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/disk-chart.tsx
|
#: src/components/charts/disk-chart.tsx
|
||||||
@@ -321,11 +398,16 @@ msgstr "Dokumentacija"
|
|||||||
|
|
||||||
#. Context: System is down
|
#. Context: System is down
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Down"
|
msgid "Down"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Duration"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
@@ -351,6 +433,7 @@ msgstr "Unesite email adresu..."
|
|||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
#: src/components/login/auth-form.tsx
|
#: src/components/login/auth-form.tsx
|
||||||
msgid "Error"
|
msgid "Error"
|
||||||
msgstr "Greška"
|
msgstr "Greška"
|
||||||
@@ -366,6 +449,10 @@ msgstr "Premašuje {0}{1} u posljednjih {2, plural, one {# minuta} other {# minu
|
|||||||
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
||||||
msgstr "Postojeći sistemi koji nisu definirani u <0>config.yml</0> će biti izbrisani. Molimo Vas napravite redovite sigurnosne kopije."
|
msgstr "Postojeći sistemi koji nisu definirani u <0>config.yml</0> će biti izbrisani. Molimo Vas napravite redovite sigurnosne kopije."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Export"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
msgid "Export configuration"
|
msgid "Export configuration"
|
||||||
msgstr "Izvoz konfiguracije"
|
msgstr "Izvoz konfiguracije"
|
||||||
@@ -374,6 +461,10 @@ msgstr "Izvoz konfiguracije"
|
|||||||
msgid "Export your current systems configuration."
|
msgid "Export your current systems configuration."
|
||||||
msgstr "Izvoz trenutne sistemske konfiguracije."
|
msgstr "Izvoz trenutne sistemske konfiguracije."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Fahrenheit (°F)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Failed to authenticate"
|
msgid "Failed to authenticate"
|
||||||
msgstr "Provjera autentičnosti nije uspjela"
|
msgstr "Provjera autentičnosti nije uspjela"
|
||||||
@@ -393,9 +484,14 @@ msgstr "Ažuriranje upozorenja nije uspjelo"
|
|||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Filter..."
|
msgstr "Filter..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "Za <0>{min}</0> {min, plural, one {minutu} other {minute}}"
|
msgstr "Za <0>{min}</0> {min, plural, one {minutu} other {minute}}"
|
||||||
@@ -419,6 +515,7 @@ msgid "Grid"
|
|||||||
msgstr "Mreža"
|
msgstr "Mreža"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Homebrew naredba"
|
msgstr "Homebrew naredba"
|
||||||
@@ -453,6 +550,27 @@ msgstr "Izgled"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Svijetlo"
|
msgstr "Svijetlo"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "Load Average"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 1m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Short label for load average
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Load Avg"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Odjava"
|
msgstr "Odjava"
|
||||||
@@ -501,6 +619,7 @@ msgstr "Upotreba memorije"
|
|||||||
msgid "Memory usage of docker containers"
|
msgid "Memory usage of docker containers"
|
||||||
msgstr "Upotreba memorije Docker spremnika"
|
msgstr "Upotreba memorije Docker spremnika"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Ime"
|
msgstr "Ime"
|
||||||
@@ -517,10 +636,19 @@ msgstr "Mrežni promet Docker spremnika"
|
|||||||
msgid "Network traffic of public interfaces"
|
msgid "Network traffic of public interfaces"
|
||||||
msgstr "Mrežni promet javnih sučelja"
|
msgstr "Mrežni promet javnih sučelja"
|
||||||
|
|
||||||
|
#. Context: Bytes or bits
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Network unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "No results found."
|
msgid "No results found."
|
||||||
msgstr "Nema rezultata."
|
msgstr "Nema rezultata."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "No results."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "No systems found."
|
msgid "No systems found."
|
||||||
@@ -558,6 +686,12 @@ msgstr "Prebrišite postojeća upozorenja"
|
|||||||
msgid "Page"
|
msgid "Page"
|
||||||
msgstr "Stranica"
|
msgstr "Stranica"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getState().pagination.pageIndex + 1
|
||||||
|
#. placeholder {1}: table.getPageCount()
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Page {0} of {1}"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "Pages / Settings"
|
msgid "Pages / Settings"
|
||||||
msgstr "Stranice / Postavke"
|
msgstr "Stranice / Postavke"
|
||||||
@@ -639,13 +773,12 @@ msgid "Public Key"
|
|||||||
msgstr "Javni Ključ"
|
msgstr "Javni Ključ"
|
||||||
|
|
||||||
#. Disk read
|
#. Disk read
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Read"
|
msgid "Read"
|
||||||
msgstr "Pročitaj"
|
msgstr "Pročitaj"
|
||||||
|
|
||||||
#. Network bytes received (download)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Received"
|
msgid "Received"
|
||||||
msgstr "Primljeno"
|
msgstr "Primljeno"
|
||||||
|
|
||||||
@@ -653,6 +786,12 @@ msgstr "Primljeno"
|
|||||||
msgid "Reset Password"
|
msgid "Reset Password"
|
||||||
msgstr "Resetiraj Lozinku"
|
msgstr "Resetiraj Lozinku"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Resolved"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Resume"
|
msgid "Resume"
|
||||||
msgstr "Nastavi"
|
msgstr "Nastavi"
|
||||||
@@ -661,6 +800,10 @@ msgstr "Nastavi"
|
|||||||
msgid "Rotate token"
|
msgid "Rotate token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Rows per page"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
||||||
msgstr "Spremite adresu pomoću tipke enter ili zareza. Ostavite prazno kako biste onemogućili obavijesti e-poštom."
|
msgstr "Spremite adresu pomoću tipke enter ili zareza. Ostavite prazno kako biste onemogućili obavijesti e-poštom."
|
||||||
@@ -686,8 +829,7 @@ msgstr "Pretraži za sisteme ili postavke..."
|
|||||||
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
||||||
msgstr "Pogledajte <0>postavke obavijesti</0> da biste konfigurirali način primanja upozorenja."
|
msgstr "Pogledajte <0>postavke obavijesti</0> da biste konfigurirali način primanja upozorenja."
|
||||||
|
|
||||||
#. Network bytes sent (upload)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Sent"
|
msgid "Sent"
|
||||||
msgstr "Poslano"
|
msgstr "Poslano"
|
||||||
|
|
||||||
@@ -718,6 +860,11 @@ msgstr "SMTP postavke"
|
|||||||
msgid "Sort By"
|
msgid "Sort By"
|
||||||
msgstr "Sortiraj po"
|
msgstr "Sortiraj po"
|
||||||
|
|
||||||
|
#. Context: alert state (active or resolved)
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "State"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr "Status"
|
msgstr "Status"
|
||||||
@@ -733,10 +880,16 @@ msgstr "Swap Iskorištenost"
|
|||||||
#. System theme
|
#. System theme
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Sistem"
|
msgstr "Sistem"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "System load averages over time"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Systems"
|
msgid "Systems"
|
||||||
msgstr "Sistemi"
|
msgstr "Sistemi"
|
||||||
@@ -759,6 +912,10 @@ msgstr ""
|
|||||||
msgid "Temperature"
|
msgid "Temperature"
|
||||||
msgstr "Temperatura"
|
msgstr "Temperatura"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Temperature unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Temperatures of system sensors"
|
msgid "Temperatures of system sensors"
|
||||||
msgstr "Temperature sistemskih senzora"
|
msgstr "Temperature sistemskih senzora"
|
||||||
@@ -779,6 +936,10 @@ msgstr "Zatim se prijavite u backend i resetirajte lozinku korisničkog računa
|
|||||||
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
||||||
msgstr "Ova radnja se ne može poništiti. Ovo će trajno izbrisati sve trenutne zapise za {name} iz baze podataka."
|
msgstr "Ova radnja se ne može poništiti. Ovo će trajno izbrisati sve trenutne zapise za {name} iz baze podataka."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "This will permanently delete all selected records from the database."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Throughput of {extraFsName}"
|
msgid "Throughput of {extraFsName}"
|
||||||
msgstr "Protok {extraFsName}"
|
msgstr "Protok {extraFsName}"
|
||||||
@@ -801,6 +962,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Uključi/isključi temu"
|
msgstr "Uključi/isključi temu"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -818,6 +980,18 @@ msgstr ""
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 1 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Pokreće se kada bilo koji senzor prijeđe prag"
|
msgstr "Pokreće se kada bilo koji senzor prijeđe prag"
|
||||||
@@ -842,6 +1016,11 @@ msgstr "Pokreće se kada se status sistema promijeni"
|
|||||||
msgid "Triggers when usage of any disk exceeds a threshold"
|
msgid "Triggers when usage of any disk exceeds a threshold"
|
||||||
msgstr "Pokreće se kada iskorištenost bilo kojeg diska premaši prag"
|
msgstr "Pokreće se kada iskorištenost bilo kojeg diska premaši prag"
|
||||||
|
|
||||||
|
#. Temperature / network units
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Unit preferences"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Universal token"
|
msgid "Universal token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -862,7 +1041,8 @@ msgstr "Vrijeme rada"
|
|||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
msgid "Usage"
|
msgid "Usage"
|
||||||
msgstr "Iskorištenost"
|
msgstr "Iskorištenost"
|
||||||
|
|
||||||
@@ -872,7 +1052,6 @@ msgstr "Iskorištenost root datotečnog sustava"
|
|||||||
|
|
||||||
#: src/components/charts/swap-chart.tsx
|
#: src/components/charts/swap-chart.tsx
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Used"
|
msgid "Used"
|
||||||
msgstr "Iskorišteno"
|
msgstr "Iskorišteno"
|
||||||
|
|
||||||
@@ -881,10 +1060,18 @@ msgstr "Iskorišteno"
|
|||||||
msgid "Users"
|
msgid "Users"
|
||||||
msgstr "Korisnici"
|
msgstr "Korisnici"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Value"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "View"
|
msgid "View"
|
||||||
msgstr "Prikaz"
|
msgstr "Prikaz"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "View your 200 most recent alerts."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Visible Fields"
|
msgid "Visible Fields"
|
||||||
msgstr "Vidljiva polja"
|
msgstr "Vidljiva polja"
|
||||||
@@ -906,13 +1093,14 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Windows naredba"
|
msgstr "Windows naredba"
|
||||||
|
|
||||||
#. Disk write
|
#. Disk write
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Write"
|
msgid "Write"
|
||||||
msgstr "Piši"
|
msgstr "Piši"
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ msgstr ""
|
|||||||
"Language: hu\n"
|
"Language: hu\n"
|
||||||
"Project-Id-Version: beszel\n"
|
"Project-Id-Version: beszel\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2025-03-06 07:27\n"
|
"PO-Revision-Date: 2025-07-25 22:44\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: Hungarian\n"
|
"Language-Team: Hungarian\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
@@ -23,6 +23,12 @@ msgstr ""
|
|||||||
msgid "{0, plural, one {# day} other {# days}}"
|
msgid "{0, plural, one {# day} other {# days}}"
|
||||||
msgstr "{0, plural, one {# nap} other {# nap}}"
|
msgstr "{0, plural, one {# nap} other {# nap}}"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
|
||||||
|
#. placeholder {1}: table.getFilteredRowModel().rows.length
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "{0} of {1} row(s) selected."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "{hours, plural, one {# hour} other {# hours}}"
|
msgid "{hours, plural, one {# hour} other {# hours}}"
|
||||||
msgstr "{hours, plural, one {# óra} other {# óra}}"
|
msgstr "{hours, plural, one {# óra} other {# óra}}"
|
||||||
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# óra} other {# óra}}"
|
|||||||
msgid "1 hour"
|
msgid "1 hour"
|
||||||
msgstr "1 óra"
|
msgstr "1 óra"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "1 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "1 week"
|
msgid "1 week"
|
||||||
msgstr "1 hét"
|
msgstr "1 hét"
|
||||||
@@ -39,6 +50,11 @@ msgstr "1 hét"
|
|||||||
msgid "12 hours"
|
msgid "12 hours"
|
||||||
msgstr "12 óra"
|
msgstr "12 óra"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "15 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "24 hours"
|
msgid "24 hours"
|
||||||
msgstr "24 óra"
|
msgstr "24 óra"
|
||||||
@@ -47,12 +63,22 @@ msgstr "24 óra"
|
|||||||
msgid "30 days"
|
msgid "30 days"
|
||||||
msgstr "30 nap"
|
msgstr "30 nap"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "5 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. Table column
|
#. Table column
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "Műveletek"
|
msgstr "Műveletek"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Active"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/home.tsx
|
#: src/components/routes/home.tsx
|
||||||
msgid "Active Alerts"
|
msgid "Active Alerts"
|
||||||
msgstr "Aktív riasztások"
|
msgstr "Aktív riasztások"
|
||||||
@@ -86,6 +112,12 @@ msgstr "Admin"
|
|||||||
msgid "Agent"
|
msgid "Agent"
|
||||||
msgstr "Ügynök"
|
msgstr "Ügynök"
|
||||||
|
|
||||||
|
#: src/components/command-palette.tsx
|
||||||
|
#: src/components/routes/settings/layout.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Alert History"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
msgid "Alerts"
|
msgid "Alerts"
|
||||||
@@ -100,6 +132,10 @@ msgstr "Minden rendszer"
|
|||||||
msgid "Are you sure you want to delete {name}?"
|
msgid "Are you sure you want to delete {name}?"
|
||||||
msgstr "Biztosan törölni szeretnéd {name}-t?"
|
msgstr "Biztosan törölni szeretnéd {name}-t?"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Are you sure?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Automatic copy requires a secure context."
|
msgid "Automatic copy requires a secure context."
|
||||||
msgstr "Az automatikus másolás biztonságos környezetet igényel."
|
msgstr "Az automatikus másolás biztonságos környezetet igényel."
|
||||||
@@ -152,11 +188,22 @@ msgstr "A Beszel a <0>Shoutrrr</0>-t használja a népszerű értesítési szolg
|
|||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
msgstr "Bináris"
|
msgstr "Bináris"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bits (Kbps, Mbps, Gbps)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bytes (KB/s, MB/s, GB/s)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
msgid "Cache / Buffers"
|
msgid "Cache / Buffers"
|
||||||
msgstr "Gyorsítótár / Pufferelések"
|
msgstr "Gyorsítótár / Pufferelések"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Mégsem"
|
msgstr "Mégsem"
|
||||||
|
|
||||||
@@ -164,6 +211,14 @@ msgstr "Mégsem"
|
|||||||
msgid "Caution - potential data loss"
|
msgid "Caution - potential data loss"
|
||||||
msgstr "Figyelem - potenciális adatvesztés"
|
msgstr "Figyelem - potenciális adatvesztés"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Celsius (°C)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Change display units for metrics."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Change general application options."
|
msgid "Change general application options."
|
||||||
msgstr "Általános alkalmazásbeállítások módosítása."
|
msgstr "Általános alkalmazásbeállítások módosítása."
|
||||||
@@ -202,7 +257,12 @@ msgstr "Konfiguráld, hogyan kapod az értesítéseket."
|
|||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr "Jelszó megerősítése"
|
msgstr "Jelszó megerősítése"
|
||||||
|
|
||||||
|
#: src/components/routes/home.tsx
|
||||||
|
msgid "Connection is down"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Continue"
|
msgid "Continue"
|
||||||
msgstr "Tovább"
|
msgstr "Tovább"
|
||||||
|
|
||||||
@@ -211,11 +271,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Vágólapra másolva"
|
msgstr "Vágólapra másolva"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Docker compose másolása"
|
msgstr "Docker compose másolása"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Docker run másolása"
|
msgstr "Docker run másolása"
|
||||||
@@ -230,9 +292,14 @@ msgid "Copy host"
|
|||||||
msgstr "Hoszt másolása"
|
msgstr "Hoszt másolása"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Linux parancs másolása"
|
msgstr "Linux parancs másolása"
|
||||||
|
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Copy name"
|
||||||
|
msgstr "Név másolása"
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Copy text"
|
msgid "Copy text"
|
||||||
msgstr "Szöveg másolása"
|
msgstr "Szöveg másolása"
|
||||||
@@ -255,7 +322,7 @@ msgstr "CPU"
|
|||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "CPU Usage"
|
msgid "CPU Usage"
|
||||||
msgstr "CPU használat"
|
msgstr "CPU használat"
|
||||||
|
|
||||||
@@ -263,6 +330,11 @@ msgstr "CPU használat"
|
|||||||
msgid "Create account"
|
msgid "Create account"
|
||||||
msgstr "Fiók létrehozása"
|
msgstr "Fiók létrehozása"
|
||||||
|
|
||||||
|
#. Context: date created
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Created"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. Dark theme
|
#. Dark theme
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
@@ -278,6 +350,7 @@ msgid "Default time period"
|
|||||||
msgstr "Alapértelmezett időszak"
|
msgstr "Alapértelmezett időszak"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Törlés"
|
msgstr "Törlés"
|
||||||
|
|
||||||
@@ -293,6 +366,10 @@ msgstr "Lemez"
|
|||||||
msgid "Disk I/O"
|
msgid "Disk I/O"
|
||||||
msgstr "Lemez I/O"
|
msgstr "Lemez I/O"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Disk unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/disk-chart.tsx
|
#: src/components/charts/disk-chart.tsx
|
||||||
@@ -321,11 +398,16 @@ msgstr "Dokumentáció"
|
|||||||
|
|
||||||
#. Context: System is down
|
#. Context: System is down
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Down"
|
msgid "Down"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Duration"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
@@ -351,6 +433,7 @@ msgstr "Adja meg az e-mail címet..."
|
|||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
#: src/components/login/auth-form.tsx
|
#: src/components/login/auth-form.tsx
|
||||||
msgid "Error"
|
msgid "Error"
|
||||||
msgstr "Hiba"
|
msgstr "Hiba"
|
||||||
@@ -366,6 +449,10 @@ msgstr "Túllépi a {0}{1} értéket az elmúlt {2, plural, one {# percben} othe
|
|||||||
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
||||||
msgstr "A <0>config.yml</0> fájlban nem definiált meglévő rendszerek törlésre kerülnek. Kérjük, készítsen rendszeres biztonsági mentéseket."
|
msgstr "A <0>config.yml</0> fájlban nem definiált meglévő rendszerek törlésre kerülnek. Kérjük, készítsen rendszeres biztonsági mentéseket."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Export"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
msgid "Export configuration"
|
msgid "Export configuration"
|
||||||
msgstr "Konfiguráció exportálása"
|
msgstr "Konfiguráció exportálása"
|
||||||
@@ -374,6 +461,10 @@ msgstr "Konfiguráció exportálása"
|
|||||||
msgid "Export your current systems configuration."
|
msgid "Export your current systems configuration."
|
||||||
msgstr "Exportálja a jelenlegi rendszerkonfigurációt."
|
msgstr "Exportálja a jelenlegi rendszerkonfigurációt."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Fahrenheit (°F)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Failed to authenticate"
|
msgid "Failed to authenticate"
|
||||||
msgstr "Hitelesítés sikertelen"
|
msgstr "Hitelesítés sikertelen"
|
||||||
@@ -393,9 +484,14 @@ msgstr "Nem sikerült frissíteni a riasztást"
|
|||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Szűrő..."
|
msgstr "Szűrő..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "A <0>{min}</0> {min, plural, one {perc} other {percek}}"
|
msgstr "A <0>{min}</0> {min, plural, one {perc} other {percek}}"
|
||||||
@@ -419,6 +515,7 @@ msgid "Grid"
|
|||||||
msgstr "Rács"
|
msgstr "Rács"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Homebrew parancs"
|
msgstr "Homebrew parancs"
|
||||||
@@ -453,6 +550,27 @@ msgstr "Elrendezés"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Világos"
|
msgstr "Világos"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "Load Average"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 1m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Short label for load average
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Load Avg"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Kijelentkezés"
|
msgstr "Kijelentkezés"
|
||||||
@@ -501,6 +619,7 @@ msgstr "Memóriahasználat"
|
|||||||
msgid "Memory usage of docker containers"
|
msgid "Memory usage of docker containers"
|
||||||
msgstr "Docker konténerek memória használata"
|
msgstr "Docker konténerek memória használata"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Név"
|
msgstr "Név"
|
||||||
@@ -517,10 +636,19 @@ msgstr "Docker konténerek hálózati forgalma"
|
|||||||
msgid "Network traffic of public interfaces"
|
msgid "Network traffic of public interfaces"
|
||||||
msgstr "Nyilvános interfészek hálózati forgalma"
|
msgstr "Nyilvános interfészek hálózati forgalma"
|
||||||
|
|
||||||
|
#. Context: Bytes or bits
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Network unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "No results found."
|
msgid "No results found."
|
||||||
msgstr "Nincs találat."
|
msgstr "Nincs találat."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "No results."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "No systems found."
|
msgid "No systems found."
|
||||||
@@ -558,6 +686,12 @@ msgstr "Felülírja a meglévő riasztásokat"
|
|||||||
msgid "Page"
|
msgid "Page"
|
||||||
msgstr "Oldal"
|
msgstr "Oldal"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getState().pagination.pageIndex + 1
|
||||||
|
#. placeholder {1}: table.getPageCount()
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Page {0} of {1}"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "Pages / Settings"
|
msgid "Pages / Settings"
|
||||||
msgstr "Oldalak / Beállítások"
|
msgstr "Oldalak / Beállítások"
|
||||||
@@ -639,13 +773,12 @@ msgid "Public Key"
|
|||||||
msgstr "Nyilvános kulcs"
|
msgstr "Nyilvános kulcs"
|
||||||
|
|
||||||
#. Disk read
|
#. Disk read
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Read"
|
msgid "Read"
|
||||||
msgstr "Olvasás"
|
msgstr "Olvasás"
|
||||||
|
|
||||||
#. Network bytes received (download)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Received"
|
msgid "Received"
|
||||||
msgstr "Fogadott"
|
msgstr "Fogadott"
|
||||||
|
|
||||||
@@ -653,6 +786,12 @@ msgstr "Fogadott"
|
|||||||
msgid "Reset Password"
|
msgid "Reset Password"
|
||||||
msgstr "Jelszó visszaállítása"
|
msgstr "Jelszó visszaállítása"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Resolved"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Resume"
|
msgid "Resume"
|
||||||
msgstr "Folytatás"
|
msgstr "Folytatás"
|
||||||
@@ -661,6 +800,10 @@ msgstr "Folytatás"
|
|||||||
msgid "Rotate token"
|
msgid "Rotate token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Rows per page"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
||||||
msgstr "Mentse el a címet az Enter billentyű vagy a vessző használatával. Hagyja üresen az e-mail értesítések letiltásához."
|
msgstr "Mentse el a címet az Enter billentyű vagy a vessző használatával. Hagyja üresen az e-mail értesítések letiltásához."
|
||||||
@@ -686,8 +829,7 @@ msgstr "Keresés rendszerek vagy beállítások után..."
|
|||||||
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
||||||
msgstr "Lásd <0>az értesítési beállításokat</0>, hogy konfigurálja, hogyan kap értesítéseket."
|
msgstr "Lásd <0>az értesítési beállításokat</0>, hogy konfigurálja, hogyan kap értesítéseket."
|
||||||
|
|
||||||
#. Network bytes sent (upload)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Sent"
|
msgid "Sent"
|
||||||
msgstr "Elküldve"
|
msgstr "Elküldve"
|
||||||
|
|
||||||
@@ -718,6 +860,11 @@ msgstr "SMTP beállítások"
|
|||||||
msgid "Sort By"
|
msgid "Sort By"
|
||||||
msgstr "Rendezés"
|
msgstr "Rendezés"
|
||||||
|
|
||||||
|
#. Context: alert state (active or resolved)
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "State"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr "Állapot"
|
msgstr "Állapot"
|
||||||
@@ -733,10 +880,16 @@ msgstr "Swap használat"
|
|||||||
#. System theme
|
#. System theme
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Rendszer"
|
msgstr "Rendszer"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "System load averages over time"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Systems"
|
msgid "Systems"
|
||||||
msgstr "Rendszer"
|
msgstr "Rendszer"
|
||||||
@@ -759,6 +912,10 @@ msgstr ""
|
|||||||
msgid "Temperature"
|
msgid "Temperature"
|
||||||
msgstr "Hőmérséklet"
|
msgstr "Hőmérséklet"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Temperature unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Temperatures of system sensors"
|
msgid "Temperatures of system sensors"
|
||||||
msgstr "A rendszer érzékelőinek hőmérséklete"
|
msgstr "A rendszer érzékelőinek hőmérséklete"
|
||||||
@@ -779,6 +936,10 @@ msgstr "Ezután jelentkezzen be a backendbe, és állítsa vissza a felhasznál
|
|||||||
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
||||||
msgstr "Ezt a műveletet nem lehet visszavonni! Véglegesen törli a {name} összes jelenlegi rekordját az adatbázisból!"
|
msgstr "Ezt a műveletet nem lehet visszavonni! Véglegesen törli a {name} összes jelenlegi rekordját az adatbázisból!"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "This will permanently delete all selected records from the database."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Throughput of {extraFsName}"
|
msgid "Throughput of {extraFsName}"
|
||||||
msgstr "A {extraFsName} átviteli teljesítménye"
|
msgstr "A {extraFsName} átviteli teljesítménye"
|
||||||
@@ -801,6 +962,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Téma váltása"
|
msgstr "Téma váltása"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -818,6 +980,18 @@ msgstr ""
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 1 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Bekapcsol, ha bármelyik érzékelő túllép egy küszöbértéket"
|
msgstr "Bekapcsol, ha bármelyik érzékelő túllép egy küszöbértéket"
|
||||||
@@ -842,6 +1016,11 @@ msgstr "Bekapcsol, amikor az állapot fel és le között változik"
|
|||||||
msgid "Triggers when usage of any disk exceeds a threshold"
|
msgid "Triggers when usage of any disk exceeds a threshold"
|
||||||
msgstr "Bekapcsol, ha a lemez érzékelő túllép egy küszöbértéket"
|
msgstr "Bekapcsol, ha a lemez érzékelő túllép egy küszöbértéket"
|
||||||
|
|
||||||
|
#. Temperature / network units
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Unit preferences"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Universal token"
|
msgid "Universal token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -862,7 +1041,8 @@ msgstr "Üzemidő"
|
|||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
msgid "Usage"
|
msgid "Usage"
|
||||||
msgstr "Használat"
|
msgstr "Használat"
|
||||||
|
|
||||||
@@ -872,7 +1052,6 @@ msgstr "Root partíció kihasználtsága"
|
|||||||
|
|
||||||
#: src/components/charts/swap-chart.tsx
|
#: src/components/charts/swap-chart.tsx
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Used"
|
msgid "Used"
|
||||||
msgstr "Felhasznált"
|
msgstr "Felhasznált"
|
||||||
|
|
||||||
@@ -881,10 +1060,18 @@ msgstr "Felhasznált"
|
|||||||
msgid "Users"
|
msgid "Users"
|
||||||
msgstr "Felhasználók"
|
msgstr "Felhasználók"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Value"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "View"
|
msgid "View"
|
||||||
msgstr "Nézet"
|
msgstr "Nézet"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "View your 200 most recent alerts."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Visible Fields"
|
msgid "Visible Fields"
|
||||||
msgstr "Látható mezők"
|
msgstr "Látható mezők"
|
||||||
@@ -906,13 +1093,14 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Windows parancs"
|
msgstr "Windows parancs"
|
||||||
|
|
||||||
#. Disk write
|
#. Disk write
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Write"
|
msgid "Write"
|
||||||
msgstr "Írás"
|
msgstr "Írás"
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ msgstr ""
|
|||||||
"Language: is\n"
|
"Language: is\n"
|
||||||
"Project-Id-Version: beszel\n"
|
"Project-Id-Version: beszel\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2025-03-06 07:27\n"
|
"PO-Revision-Date: 2025-07-25 22:44\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: Icelandic\n"
|
"Language-Team: Icelandic\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
@@ -23,6 +23,12 @@ msgstr ""
|
|||||||
msgid "{0, plural, one {# day} other {# days}}"
|
msgid "{0, plural, one {# day} other {# days}}"
|
||||||
msgstr "{0, plural, one {# dagur} other {# dagar}}"
|
msgstr "{0, plural, one {# dagur} other {# dagar}}"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
|
||||||
|
#. placeholder {1}: table.getFilteredRowModel().rows.length
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "{0} of {1} row(s) selected."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "{hours, plural, one {# hour} other {# hours}}"
|
msgid "{hours, plural, one {# hour} other {# hours}}"
|
||||||
msgstr "{hours, plural, one {# klukkustund} other {# klukkustundir}}"
|
msgstr "{hours, plural, one {# klukkustund} other {# klukkustundir}}"
|
||||||
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# klukkustund} other {# klukkustundir}}"
|
|||||||
msgid "1 hour"
|
msgid "1 hour"
|
||||||
msgstr "1 klukkustund"
|
msgstr "1 klukkustund"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "1 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "1 week"
|
msgid "1 week"
|
||||||
msgstr "1 vika"
|
msgstr "1 vika"
|
||||||
@@ -39,6 +50,11 @@ msgstr "1 vika"
|
|||||||
msgid "12 hours"
|
msgid "12 hours"
|
||||||
msgstr "12 klukkustundir"
|
msgstr "12 klukkustundir"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "15 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "24 hours"
|
msgid "24 hours"
|
||||||
msgstr "24 klukkustundir"
|
msgstr "24 klukkustundir"
|
||||||
@@ -47,12 +63,22 @@ msgstr "24 klukkustundir"
|
|||||||
msgid "30 days"
|
msgid "30 days"
|
||||||
msgstr "30 dagar"
|
msgstr "30 dagar"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "5 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. Table column
|
#. Table column
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "Aðgerðir"
|
msgstr "Aðgerðir"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Active"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/home.tsx
|
#: src/components/routes/home.tsx
|
||||||
msgid "Active Alerts"
|
msgid "Active Alerts"
|
||||||
msgstr "Virkar tilkynningar"
|
msgstr "Virkar tilkynningar"
|
||||||
@@ -86,6 +112,12 @@ msgstr "Admin"
|
|||||||
msgid "Agent"
|
msgid "Agent"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/command-palette.tsx
|
||||||
|
#: src/components/routes/settings/layout.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Alert History"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
msgid "Alerts"
|
msgid "Alerts"
|
||||||
@@ -100,6 +132,10 @@ msgstr "Öll kerfi"
|
|||||||
msgid "Are you sure you want to delete {name}?"
|
msgid "Are you sure you want to delete {name}?"
|
||||||
msgstr "Ertu viss um að þú viljir eyða {name}?"
|
msgstr "Ertu viss um að þú viljir eyða {name}?"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Are you sure?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Automatic copy requires a secure context."
|
msgid "Automatic copy requires a secure context."
|
||||||
msgstr "Sjálfvisk afritun krefst öruggs samhengis."
|
msgstr "Sjálfvisk afritun krefst öruggs samhengis."
|
||||||
@@ -152,11 +188,22 @@ msgstr "Beszel notar <0>Shoutrrr</0> til að tengjast vinsælum tilkynningaþjó
|
|||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
msgstr "Binary"
|
msgstr "Binary"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bits (Kbps, Mbps, Gbps)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bytes (KB/s, MB/s, GB/s)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
msgid "Cache / Buffers"
|
msgid "Cache / Buffers"
|
||||||
msgstr "Skyndiminni / Biðminni"
|
msgstr "Skyndiminni / Biðminni"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Hætta við"
|
msgstr "Hætta við"
|
||||||
|
|
||||||
@@ -164,6 +211,14 @@ msgstr "Hætta við"
|
|||||||
msgid "Caution - potential data loss"
|
msgid "Caution - potential data loss"
|
||||||
msgstr "Aðvörun - möguleiki á gagnatapi"
|
msgstr "Aðvörun - möguleiki á gagnatapi"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Celsius (°C)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Change display units for metrics."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Change general application options."
|
msgid "Change general application options."
|
||||||
msgstr "Breyta almennum stillingum."
|
msgstr "Breyta almennum stillingum."
|
||||||
@@ -202,7 +257,12 @@ msgstr "Stilltu hvernig þú vilt fá tilkynningar."
|
|||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr "Staðfestu lykilorð"
|
msgstr "Staðfestu lykilorð"
|
||||||
|
|
||||||
|
#: src/components/routes/home.tsx
|
||||||
|
msgid "Connection is down"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Continue"
|
msgid "Continue"
|
||||||
msgstr "Halda áfram"
|
msgstr "Halda áfram"
|
||||||
|
|
||||||
@@ -211,11 +271,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Afritað í klippiborð"
|
msgstr "Afritað í klippiborð"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Afrita docker compose"
|
msgstr "Afrita docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Afrita docker run"
|
msgstr "Afrita docker run"
|
||||||
@@ -230,9 +292,14 @@ msgid "Copy host"
|
|||||||
msgstr "Afrita host"
|
msgstr "Afrita host"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Afrita Linux aðgerð"
|
msgstr "Afrita Linux aðgerð"
|
||||||
|
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Copy name"
|
||||||
|
msgstr "Afrita nafn"
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Copy text"
|
msgid "Copy text"
|
||||||
msgstr "Afrita texta"
|
msgstr "Afrita texta"
|
||||||
@@ -255,7 +322,7 @@ msgstr "Örgjörvi"
|
|||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "CPU Usage"
|
msgid "CPU Usage"
|
||||||
msgstr "Örgjörva notkun"
|
msgstr "Örgjörva notkun"
|
||||||
|
|
||||||
@@ -263,6 +330,11 @@ msgstr "Örgjörva notkun"
|
|||||||
msgid "Create account"
|
msgid "Create account"
|
||||||
msgstr "Búa til aðgang"
|
msgstr "Búa til aðgang"
|
||||||
|
|
||||||
|
#. Context: date created
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Created"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. Dark theme
|
#. Dark theme
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
@@ -278,6 +350,7 @@ msgid "Default time period"
|
|||||||
msgstr "Sjálfgefið tímabil"
|
msgstr "Sjálfgefið tímabil"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Eyða"
|
msgstr "Eyða"
|
||||||
|
|
||||||
@@ -293,6 +366,10 @@ msgstr "Diskur"
|
|||||||
msgid "Disk I/O"
|
msgid "Disk I/O"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Disk unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/disk-chart.tsx
|
#: src/components/charts/disk-chart.tsx
|
||||||
@@ -321,11 +398,16 @@ msgstr "Skjal"
|
|||||||
|
|
||||||
#. Context: System is down
|
#. Context: System is down
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Down"
|
msgid "Down"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Duration"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
@@ -351,6 +433,7 @@ msgstr "Settu inn Netfang..."
|
|||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
#: src/components/login/auth-form.tsx
|
#: src/components/login/auth-form.tsx
|
||||||
msgid "Error"
|
msgid "Error"
|
||||||
msgstr "Villa"
|
msgstr "Villa"
|
||||||
@@ -366,6 +449,10 @@ msgstr "Fór yfir {0}{1} á síðustu {2, plural, one {# mínútu} other {# mín
|
|||||||
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Export"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
msgid "Export configuration"
|
msgid "Export configuration"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -374,6 +461,10 @@ msgstr ""
|
|||||||
msgid "Export your current systems configuration."
|
msgid "Export your current systems configuration."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Fahrenheit (°F)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Failed to authenticate"
|
msgid "Failed to authenticate"
|
||||||
msgstr "Villa í auðkenningu"
|
msgstr "Villa í auðkenningu"
|
||||||
@@ -393,9 +484,14 @@ msgstr "Mistókst að uppfæra tilkynningu"
|
|||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Sía..."
|
msgstr "Sía..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -419,6 +515,7 @@ msgid "Grid"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Homebrew skipun"
|
msgstr "Homebrew skipun"
|
||||||
@@ -453,6 +550,27 @@ msgstr ""
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Ljóst"
|
msgstr "Ljóst"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "Load Average"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 1m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Short label for load average
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Load Avg"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Útskrá"
|
msgstr "Útskrá"
|
||||||
@@ -501,6 +619,7 @@ msgstr "Minnisnotkun"
|
|||||||
msgid "Memory usage of docker containers"
|
msgid "Memory usage of docker containers"
|
||||||
msgstr "Minnisnotkun docker kerfa"
|
msgstr "Minnisnotkun docker kerfa"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Nafn"
|
msgstr "Nafn"
|
||||||
@@ -517,10 +636,19 @@ msgstr "Net traffík docker kerfa"
|
|||||||
msgid "Network traffic of public interfaces"
|
msgid "Network traffic of public interfaces"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#. Context: Bytes or bits
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Network unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "No results found."
|
msgid "No results found."
|
||||||
msgstr "Engar niðurstöður fundust."
|
msgstr "Engar niðurstöður fundust."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "No results."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "No systems found."
|
msgid "No systems found."
|
||||||
@@ -558,6 +686,12 @@ msgstr "Yfirskrifa núverandi tilkynningu"
|
|||||||
msgid "Page"
|
msgid "Page"
|
||||||
msgstr "Síða"
|
msgstr "Síða"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getState().pagination.pageIndex + 1
|
||||||
|
#. placeholder {1}: table.getPageCount()
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Page {0} of {1}"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "Pages / Settings"
|
msgid "Pages / Settings"
|
||||||
msgstr "Síða / Stillingar"
|
msgstr "Síða / Stillingar"
|
||||||
@@ -639,13 +773,12 @@ msgid "Public Key"
|
|||||||
msgstr "Dreifilykill"
|
msgstr "Dreifilykill"
|
||||||
|
|
||||||
#. Disk read
|
#. Disk read
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Read"
|
msgid "Read"
|
||||||
msgstr "Lesa"
|
msgstr "Lesa"
|
||||||
|
|
||||||
#. Network bytes received (download)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Received"
|
msgid "Received"
|
||||||
msgstr "Móttekið"
|
msgstr "Móttekið"
|
||||||
|
|
||||||
@@ -653,6 +786,12 @@ msgstr "Móttekið"
|
|||||||
msgid "Reset Password"
|
msgid "Reset Password"
|
||||||
msgstr "Endurstilla lykilorð"
|
msgstr "Endurstilla lykilorð"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Resolved"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Resume"
|
msgid "Resume"
|
||||||
msgstr "Halda áfram"
|
msgstr "Halda áfram"
|
||||||
@@ -661,6 +800,10 @@ msgstr "Halda áfram"
|
|||||||
msgid "Rotate token"
|
msgid "Rotate token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Rows per page"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -686,8 +829,7 @@ msgstr "Leita að kerfum eða stillingum..."
|
|||||||
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. Network bytes sent (upload)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Sent"
|
msgid "Sent"
|
||||||
msgstr "Sent"
|
msgstr "Sent"
|
||||||
|
|
||||||
@@ -718,6 +860,11 @@ msgstr "SMTP stillingar"
|
|||||||
msgid "Sort By"
|
msgid "Sort By"
|
||||||
msgstr "Raða eftir"
|
msgstr "Raða eftir"
|
||||||
|
|
||||||
|
#. Context: alert state (active or resolved)
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "State"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr "Staða"
|
msgstr "Staða"
|
||||||
@@ -733,10 +880,16 @@ msgstr "Skipti minni"
|
|||||||
#. System theme
|
#. System theme
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Kerfi"
|
msgstr "Kerfi"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "System load averages over time"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Systems"
|
msgid "Systems"
|
||||||
msgstr "Kerfi"
|
msgstr "Kerfi"
|
||||||
@@ -759,6 +912,10 @@ msgstr ""
|
|||||||
msgid "Temperature"
|
msgid "Temperature"
|
||||||
msgstr "Hitastig"
|
msgstr "Hitastig"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Temperature unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Temperatures of system sensors"
|
msgid "Temperatures of system sensors"
|
||||||
msgstr "Hitastig kerfa skynjara"
|
msgstr "Hitastig kerfa skynjara"
|
||||||
@@ -779,6 +936,10 @@ msgstr "Skráðu þig þá inní bakendann og endurstilltu lykilorðið þitt in
|
|||||||
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
||||||
msgstr "Þessi aðgerð er óafturkvæmanleg. Þetta mun eyða gögnum fyrir {name} varanlega úr gagnagrunninum."
|
msgstr "Þessi aðgerð er óafturkvæmanleg. Þetta mun eyða gögnum fyrir {name} varanlega úr gagnagrunninum."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "This will permanently delete all selected records from the database."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Throughput of {extraFsName}"
|
msgid "Throughput of {extraFsName}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -801,6 +962,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Velja þema"
|
msgstr "Velja þema"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -818,6 +980,18 @@ msgstr ""
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 1 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Virkjast þegar einhver skynjari fer yfir þröskuld"
|
msgstr "Virkjast þegar einhver skynjari fer yfir þröskuld"
|
||||||
@@ -842,6 +1016,11 @@ msgstr "Virkjast þegar staða breytist milli virkur og óvirkur"
|
|||||||
msgid "Triggers when usage of any disk exceeds a threshold"
|
msgid "Triggers when usage of any disk exceeds a threshold"
|
||||||
msgstr "Virkjast þegar diska notkun fer yfir þröskuld"
|
msgstr "Virkjast þegar diska notkun fer yfir þröskuld"
|
||||||
|
|
||||||
|
#. Temperature / network units
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Unit preferences"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Universal token"
|
msgid "Universal token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -862,7 +1041,8 @@ msgstr ""
|
|||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
msgid "Usage"
|
msgid "Usage"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -872,7 +1052,6 @@ msgstr ""
|
|||||||
|
|
||||||
#: src/components/charts/swap-chart.tsx
|
#: src/components/charts/swap-chart.tsx
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Used"
|
msgid "Used"
|
||||||
msgstr "Notað"
|
msgstr "Notað"
|
||||||
|
|
||||||
@@ -881,10 +1060,18 @@ msgstr "Notað"
|
|||||||
msgid "Users"
|
msgid "Users"
|
||||||
msgstr "Notendur"
|
msgstr "Notendur"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Value"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "View"
|
msgid "View"
|
||||||
msgstr "Skoða"
|
msgstr "Skoða"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "View your 200 most recent alerts."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Visible Fields"
|
msgid "Visible Fields"
|
||||||
msgstr "Sjáanlegir reitir"
|
msgstr "Sjáanlegir reitir"
|
||||||
@@ -906,13 +1093,14 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Windows skipun"
|
msgstr "Windows skipun"
|
||||||
|
|
||||||
#. Disk write
|
#. Disk write
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Write"
|
msgid "Write"
|
||||||
msgstr "Skrifa"
|
msgstr "Skrifa"
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ msgstr ""
|
|||||||
"Language: it\n"
|
"Language: it\n"
|
||||||
"Project-Id-Version: beszel\n"
|
"Project-Id-Version: beszel\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2025-03-06 07:27\n"
|
"PO-Revision-Date: 2025-07-25 22:44\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: Italian\n"
|
"Language-Team: Italian\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
@@ -23,6 +23,12 @@ msgstr ""
|
|||||||
msgid "{0, plural, one {# day} other {# days}}"
|
msgid "{0, plural, one {# day} other {# days}}"
|
||||||
msgstr "{0, plural, one {# giorno} other {# giorni}}"
|
msgstr "{0, plural, one {# giorno} other {# giorni}}"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
|
||||||
|
#. placeholder {1}: table.getFilteredRowModel().rows.length
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "{0} of {1} row(s) selected."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "{hours, plural, one {# hour} other {# hours}}"
|
msgid "{hours, plural, one {# hour} other {# hours}}"
|
||||||
msgstr "{hours, plural, one {# ora} other {# ore}}"
|
msgstr "{hours, plural, one {# ora} other {# ore}}"
|
||||||
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# ora} other {# ore}}"
|
|||||||
msgid "1 hour"
|
msgid "1 hour"
|
||||||
msgstr "1 ora"
|
msgstr "1 ora"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "1 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "1 week"
|
msgid "1 week"
|
||||||
msgstr "1 settimana"
|
msgstr "1 settimana"
|
||||||
@@ -39,6 +50,11 @@ msgstr "1 settimana"
|
|||||||
msgid "12 hours"
|
msgid "12 hours"
|
||||||
msgstr "12 ore"
|
msgstr "12 ore"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "15 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "24 hours"
|
msgid "24 hours"
|
||||||
msgstr "24 ore"
|
msgstr "24 ore"
|
||||||
@@ -47,12 +63,22 @@ msgstr "24 ore"
|
|||||||
msgid "30 days"
|
msgid "30 days"
|
||||||
msgstr "30 giorni"
|
msgstr "30 giorni"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "5 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. Table column
|
#. Table column
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "Azioni"
|
msgstr "Azioni"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Active"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/home.tsx
|
#: src/components/routes/home.tsx
|
||||||
msgid "Active Alerts"
|
msgid "Active Alerts"
|
||||||
msgstr "Avvisi Attivi"
|
msgstr "Avvisi Attivi"
|
||||||
@@ -86,6 +112,12 @@ msgstr "Amministratore"
|
|||||||
msgid "Agent"
|
msgid "Agent"
|
||||||
msgstr "Agente"
|
msgstr "Agente"
|
||||||
|
|
||||||
|
#: src/components/command-palette.tsx
|
||||||
|
#: src/components/routes/settings/layout.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Alert History"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
msgid "Alerts"
|
msgid "Alerts"
|
||||||
@@ -100,6 +132,10 @@ msgstr "Tutti i Sistemi"
|
|||||||
msgid "Are you sure you want to delete {name}?"
|
msgid "Are you sure you want to delete {name}?"
|
||||||
msgstr "Sei sicuro di voler eliminare {name}?"
|
msgstr "Sei sicuro di voler eliminare {name}?"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Are you sure?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Automatic copy requires a secure context."
|
msgid "Automatic copy requires a secure context."
|
||||||
msgstr "La copia automatica richiede un contesto sicuro."
|
msgstr "La copia automatica richiede un contesto sicuro."
|
||||||
@@ -152,11 +188,22 @@ msgstr "Beszel utilizza <0>Shoutrrr</0> per integrarsi con i servizi di notifica
|
|||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
msgstr "Binario"
|
msgstr "Binario"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bits (Kbps, Mbps, Gbps)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bytes (KB/s, MB/s, GB/s)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
msgid "Cache / Buffers"
|
msgid "Cache / Buffers"
|
||||||
msgstr "Cache / Buffer"
|
msgstr "Cache / Buffer"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Annulla"
|
msgstr "Annulla"
|
||||||
|
|
||||||
@@ -164,6 +211,14 @@ msgstr "Annulla"
|
|||||||
msgid "Caution - potential data loss"
|
msgid "Caution - potential data loss"
|
||||||
msgstr "Attenzione - possibile perdita di dati"
|
msgstr "Attenzione - possibile perdita di dati"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Celsius (°C)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Change display units for metrics."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Change general application options."
|
msgid "Change general application options."
|
||||||
msgstr "Modifica le opzioni generali dell'applicazione."
|
msgstr "Modifica le opzioni generali dell'applicazione."
|
||||||
@@ -202,7 +257,12 @@ msgstr "Configura come ricevere le notifiche di avviso."
|
|||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr "Conferma password"
|
msgstr "Conferma password"
|
||||||
|
|
||||||
|
#: src/components/routes/home.tsx
|
||||||
|
msgid "Connection is down"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Continue"
|
msgid "Continue"
|
||||||
msgstr "Continua"
|
msgstr "Continua"
|
||||||
|
|
||||||
@@ -211,11 +271,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Copiato negli appunti"
|
msgstr "Copiato negli appunti"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Copia docker compose"
|
msgstr "Copia docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Copia docker run"
|
msgstr "Copia docker run"
|
||||||
@@ -230,9 +292,14 @@ msgid "Copy host"
|
|||||||
msgstr "Copia host"
|
msgstr "Copia host"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Copia comando Linux"
|
msgstr "Copia comando Linux"
|
||||||
|
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Copy name"
|
||||||
|
msgstr "Copia nome"
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Copy text"
|
msgid "Copy text"
|
||||||
msgstr "Copia testo"
|
msgstr "Copia testo"
|
||||||
@@ -255,7 +322,7 @@ msgstr "CPU"
|
|||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "CPU Usage"
|
msgid "CPU Usage"
|
||||||
msgstr "Utilizzo CPU"
|
msgstr "Utilizzo CPU"
|
||||||
|
|
||||||
@@ -263,6 +330,11 @@ msgstr "Utilizzo CPU"
|
|||||||
msgid "Create account"
|
msgid "Create account"
|
||||||
msgstr "Crea account"
|
msgstr "Crea account"
|
||||||
|
|
||||||
|
#. Context: date created
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Created"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. Dark theme
|
#. Dark theme
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
@@ -278,6 +350,7 @@ msgid "Default time period"
|
|||||||
msgstr "Periodo di tempo predefinito"
|
msgstr "Periodo di tempo predefinito"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Elimina"
|
msgstr "Elimina"
|
||||||
|
|
||||||
@@ -293,6 +366,10 @@ msgstr "Disco"
|
|||||||
msgid "Disk I/O"
|
msgid "Disk I/O"
|
||||||
msgstr "I/O Disco"
|
msgstr "I/O Disco"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Disk unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/disk-chart.tsx
|
#: src/components/charts/disk-chart.tsx
|
||||||
@@ -321,11 +398,16 @@ msgstr "Documentazione"
|
|||||||
|
|
||||||
#. Context: System is down
|
#. Context: System is down
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Down"
|
msgid "Down"
|
||||||
msgstr "Offline"
|
msgstr "Offline"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Duration"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
@@ -351,6 +433,7 @@ msgstr "Inserisci l'indirizzo email..."
|
|||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
#: src/components/login/auth-form.tsx
|
#: src/components/login/auth-form.tsx
|
||||||
msgid "Error"
|
msgid "Error"
|
||||||
msgstr "Errore"
|
msgstr "Errore"
|
||||||
@@ -366,6 +449,10 @@ msgstr "Supera {0}{1} negli ultimi {2, plural, one {# minuto} other {# minuti}}"
|
|||||||
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
||||||
msgstr "I sistemi esistenti non definiti in <0>config.yml</0> verranno eliminati. Si prega di effettuare backup regolari."
|
msgstr "I sistemi esistenti non definiti in <0>config.yml</0> verranno eliminati. Si prega di effettuare backup regolari."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Export"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
msgid "Export configuration"
|
msgid "Export configuration"
|
||||||
msgstr "Esporta configurazione"
|
msgstr "Esporta configurazione"
|
||||||
@@ -374,6 +461,10 @@ msgstr "Esporta configurazione"
|
|||||||
msgid "Export your current systems configuration."
|
msgid "Export your current systems configuration."
|
||||||
msgstr "Esporta la configurazione attuale dei tuoi sistemi."
|
msgstr "Esporta la configurazione attuale dei tuoi sistemi."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Fahrenheit (°F)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Failed to authenticate"
|
msgid "Failed to authenticate"
|
||||||
msgstr "Autenticazione fallita"
|
msgstr "Autenticazione fallita"
|
||||||
@@ -393,9 +484,14 @@ msgstr "Aggiornamento dell'avviso fallito"
|
|||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Filtra..."
|
msgstr "Filtra..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "Per <0>{min}</0> {min, plural, one {minuto} other {minuti}}"
|
msgstr "Per <0>{min}</0> {min, plural, one {minuto} other {minuti}}"
|
||||||
@@ -419,6 +515,7 @@ msgid "Grid"
|
|||||||
msgstr "Griglia"
|
msgstr "Griglia"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Comando Homebrew"
|
msgstr "Comando Homebrew"
|
||||||
@@ -453,6 +550,27 @@ msgstr "Aspetto"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Chiaro"
|
msgstr "Chiaro"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "Load Average"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr "Caricamento medio 15m"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 1m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr "Caricamento medio 5m"
|
||||||
|
|
||||||
|
#. Short label for load average
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Load Avg"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Disconnetti"
|
msgstr "Disconnetti"
|
||||||
@@ -501,6 +619,7 @@ msgstr "Utilizzo Memoria"
|
|||||||
msgid "Memory usage of docker containers"
|
msgid "Memory usage of docker containers"
|
||||||
msgstr "Utilizzo della memoria dei container Docker"
|
msgstr "Utilizzo della memoria dei container Docker"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Nome"
|
msgstr "Nome"
|
||||||
@@ -517,10 +636,19 @@ msgstr "Traffico di rete dei container Docker"
|
|||||||
msgid "Network traffic of public interfaces"
|
msgid "Network traffic of public interfaces"
|
||||||
msgstr "Traffico di rete delle interfacce pubbliche"
|
msgstr "Traffico di rete delle interfacce pubbliche"
|
||||||
|
|
||||||
|
#. Context: Bytes or bits
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Network unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "No results found."
|
msgid "No results found."
|
||||||
msgstr "Nessun risultato trovato."
|
msgstr "Nessun risultato trovato."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "No results."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "No systems found."
|
msgid "No systems found."
|
||||||
@@ -558,6 +686,12 @@ msgstr "Sovrascrivi avvisi esistenti"
|
|||||||
msgid "Page"
|
msgid "Page"
|
||||||
msgstr "Pagina"
|
msgstr "Pagina"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getState().pagination.pageIndex + 1
|
||||||
|
#. placeholder {1}: table.getPageCount()
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Page {0} of {1}"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "Pages / Settings"
|
msgid "Pages / Settings"
|
||||||
msgstr "Pagine / Impostazioni"
|
msgstr "Pagine / Impostazioni"
|
||||||
@@ -639,13 +773,12 @@ msgid "Public Key"
|
|||||||
msgstr "Chiave Pub"
|
msgstr "Chiave Pub"
|
||||||
|
|
||||||
#. Disk read
|
#. Disk read
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Read"
|
msgid "Read"
|
||||||
msgstr "Lettura"
|
msgstr "Lettura"
|
||||||
|
|
||||||
#. Network bytes received (download)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Received"
|
msgid "Received"
|
||||||
msgstr "Ricevuto"
|
msgstr "Ricevuto"
|
||||||
|
|
||||||
@@ -653,6 +786,12 @@ msgstr "Ricevuto"
|
|||||||
msgid "Reset Password"
|
msgid "Reset Password"
|
||||||
msgstr "Reimposta Password"
|
msgstr "Reimposta Password"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Resolved"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Resume"
|
msgid "Resume"
|
||||||
msgstr "Riprendi"
|
msgstr "Riprendi"
|
||||||
@@ -661,6 +800,10 @@ msgstr "Riprendi"
|
|||||||
msgid "Rotate token"
|
msgid "Rotate token"
|
||||||
msgstr "Ruota token"
|
msgstr "Ruota token"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Rows per page"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
||||||
msgstr "Salva l'indirizzo usando il tasto invio o la virgola. Lascia vuoto per disabilitare le notifiche email."
|
msgstr "Salva l'indirizzo usando il tasto invio o la virgola. Lascia vuoto per disabilitare le notifiche email."
|
||||||
@@ -686,8 +829,7 @@ msgstr "Cerca sistemi o impostazioni..."
|
|||||||
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
||||||
msgstr "Vedi <0>impostazioni di notifica</0> per configurare come ricevere gli avvisi."
|
msgstr "Vedi <0>impostazioni di notifica</0> per configurare come ricevere gli avvisi."
|
||||||
|
|
||||||
#. Network bytes sent (upload)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Sent"
|
msgid "Sent"
|
||||||
msgstr "Inviato"
|
msgstr "Inviato"
|
||||||
|
|
||||||
@@ -718,6 +860,11 @@ msgstr "Impostazioni SMTP"
|
|||||||
msgid "Sort By"
|
msgid "Sort By"
|
||||||
msgstr "Ordina per"
|
msgstr "Ordina per"
|
||||||
|
|
||||||
|
#. Context: alert state (active or resolved)
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "State"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr "Stato"
|
msgstr "Stato"
|
||||||
@@ -733,10 +880,16 @@ msgstr "Utilizzo Swap"
|
|||||||
#. System theme
|
#. System theme
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Sistema"
|
msgstr "Sistema"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "System load averages over time"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Systems"
|
msgid "Systems"
|
||||||
msgstr "Sistemi"
|
msgstr "Sistemi"
|
||||||
@@ -759,6 +912,10 @@ msgstr "Temperatura"
|
|||||||
msgid "Temperature"
|
msgid "Temperature"
|
||||||
msgstr "Temperatura"
|
msgstr "Temperatura"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Temperature unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Temperatures of system sensors"
|
msgid "Temperatures of system sensors"
|
||||||
msgstr "Temperature dei sensori di sistema"
|
msgstr "Temperature dei sensori di sistema"
|
||||||
@@ -779,6 +936,10 @@ msgstr "Quindi accedi al backend e reimposta la password del tuo account utente
|
|||||||
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
||||||
msgstr "Questa azione non può essere annullata. Questo eliminerà permanentemente tutti i record attuali per {name} dal database."
|
msgstr "Questa azione non può essere annullata. Questo eliminerà permanentemente tutti i record attuali per {name} dal database."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "This will permanently delete all selected records from the database."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Throughput of {extraFsName}"
|
msgid "Throughput of {extraFsName}"
|
||||||
msgstr "Throughput di {extraFsName}"
|
msgstr "Throughput di {extraFsName}"
|
||||||
@@ -801,6 +962,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Attiva/disattiva tema"
|
msgstr "Attiva/disattiva tema"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr "Token"
|
msgstr "Token"
|
||||||
|
|
||||||
@@ -818,6 +980,18 @@ msgstr "I token consentono agli agenti di connettersi e registrarsi. Le impronte
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr "I token e le impronte digitali vengono utilizzati per autenticare le connessioni WebSocket all'hub."
|
msgstr "I token e le impronte digitali vengono utilizzati per autenticare le connessioni WebSocket all'hub."
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 1 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Attiva quando un sensore supera una soglia"
|
msgstr "Attiva quando un sensore supera una soglia"
|
||||||
@@ -842,6 +1016,11 @@ msgstr "Attiva quando lo stato passa tra up e down"
|
|||||||
msgid "Triggers when usage of any disk exceeds a threshold"
|
msgid "Triggers when usage of any disk exceeds a threshold"
|
||||||
msgstr "Attiva quando l'utilizzo di un disco supera una soglia"
|
msgstr "Attiva quando l'utilizzo di un disco supera una soglia"
|
||||||
|
|
||||||
|
#. Temperature / network units
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Unit preferences"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Universal token"
|
msgid "Universal token"
|
||||||
msgstr "Token universale"
|
msgstr "Token universale"
|
||||||
@@ -862,7 +1041,8 @@ msgstr "Tempo di attività"
|
|||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
msgid "Usage"
|
msgid "Usage"
|
||||||
msgstr "Utilizzo"
|
msgstr "Utilizzo"
|
||||||
|
|
||||||
@@ -872,7 +1052,6 @@ msgstr "Utilizzo della partizione root"
|
|||||||
|
|
||||||
#: src/components/charts/swap-chart.tsx
|
#: src/components/charts/swap-chart.tsx
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Used"
|
msgid "Used"
|
||||||
msgstr "Utilizzato"
|
msgstr "Utilizzato"
|
||||||
|
|
||||||
@@ -881,10 +1060,18 @@ msgstr "Utilizzato"
|
|||||||
msgid "Users"
|
msgid "Users"
|
||||||
msgstr "Utenti"
|
msgstr "Utenti"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Value"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "View"
|
msgid "View"
|
||||||
msgstr "Vista"
|
msgstr "Vista"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "View your 200 most recent alerts."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Visible Fields"
|
msgid "Visible Fields"
|
||||||
msgstr "Colonne visibili"
|
msgstr "Colonne visibili"
|
||||||
@@ -906,13 +1093,14 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr "Quando abilitato, questo token consente agli agenti di auto-registrarsi senza creazione preventiva del sistema. Scade dopo un'ora o al riavvio dell'hub."
|
msgstr "Quando abilitato, questo token consente agli agenti di auto-registrarsi senza creazione preventiva del sistema. Scade dopo un'ora o al riavvio dell'hub."
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Comando Windows"
|
msgstr "Comando Windows"
|
||||||
|
|
||||||
#. Disk write
|
#. Disk write
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Write"
|
msgid "Write"
|
||||||
msgstr "Scrittura"
|
msgstr "Scrittura"
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ msgstr ""
|
|||||||
"Language: ja\n"
|
"Language: ja\n"
|
||||||
"Project-Id-Version: beszel\n"
|
"Project-Id-Version: beszel\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2025-03-13 10:13\n"
|
"PO-Revision-Date: 2025-07-25 22:44\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: Japanese\n"
|
"Language-Team: Japanese\n"
|
||||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||||
@@ -23,6 +23,12 @@ msgstr ""
|
|||||||
msgid "{0, plural, one {# day} other {# days}}"
|
msgid "{0, plural, one {# day} other {# days}}"
|
||||||
msgstr "{0, plural, one {# 日} other {# 日}}"
|
msgstr "{0, plural, one {# 日} other {# 日}}"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
|
||||||
|
#. placeholder {1}: table.getFilteredRowModel().rows.length
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "{0} of {1} row(s) selected."
|
||||||
|
msgstr "{1}行のうち{0}行が選択されました。"
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "{hours, plural, one {# hour} other {# hours}}"
|
msgid "{hours, plural, one {# hour} other {# hours}}"
|
||||||
msgstr "{hours, plural, one {# 時間} other {# 時間}}"
|
msgstr "{hours, plural, one {# 時間} other {# 時間}}"
|
||||||
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# 時間} other {# 時間}}"
|
|||||||
msgid "1 hour"
|
msgid "1 hour"
|
||||||
msgstr "1時間"
|
msgstr "1時間"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "1 min"
|
||||||
|
msgstr "1分"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "1 week"
|
msgid "1 week"
|
||||||
msgstr "1週間"
|
msgstr "1週間"
|
||||||
@@ -39,6 +50,11 @@ msgstr "1週間"
|
|||||||
msgid "12 hours"
|
msgid "12 hours"
|
||||||
msgstr "12時間"
|
msgstr "12時間"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "15 min"
|
||||||
|
msgstr "15分"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "24 hours"
|
msgid "24 hours"
|
||||||
msgstr "24時間"
|
msgstr "24時間"
|
||||||
@@ -47,12 +63,22 @@ msgstr "24時間"
|
|||||||
msgid "30 days"
|
msgid "30 days"
|
||||||
msgstr "30日間"
|
msgstr "30日間"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "5 min"
|
||||||
|
msgstr "5分"
|
||||||
|
|
||||||
#. Table column
|
#. Table column
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "アクション"
|
msgstr "アクション"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Active"
|
||||||
|
msgstr "アクティブ"
|
||||||
|
|
||||||
#: src/components/routes/home.tsx
|
#: src/components/routes/home.tsx
|
||||||
msgid "Active Alerts"
|
msgid "Active Alerts"
|
||||||
msgstr "アクティブなアラート"
|
msgstr "アクティブなアラート"
|
||||||
@@ -86,6 +112,12 @@ msgstr "管理者"
|
|||||||
msgid "Agent"
|
msgid "Agent"
|
||||||
msgstr "エージェント"
|
msgstr "エージェント"
|
||||||
|
|
||||||
|
#: src/components/command-palette.tsx
|
||||||
|
#: src/components/routes/settings/layout.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Alert History"
|
||||||
|
msgstr "アラート履歴"
|
||||||
|
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
msgid "Alerts"
|
msgid "Alerts"
|
||||||
@@ -100,6 +132,10 @@ msgstr "すべてのシステム"
|
|||||||
msgid "Are you sure you want to delete {name}?"
|
msgid "Are you sure you want to delete {name}?"
|
||||||
msgstr "{name}を削除してもよろしいですか?"
|
msgstr "{name}を削除してもよろしいですか?"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Are you sure?"
|
||||||
|
msgstr "よろしいですか?"
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Automatic copy requires a secure context."
|
msgid "Automatic copy requires a secure context."
|
||||||
msgstr "自動コピーには安全なコンテキストが必要です。"
|
msgstr "自動コピーには安全なコンテキストが必要です。"
|
||||||
@@ -152,11 +188,22 @@ msgstr "Beszelは<0>Shoutrrr</0>を使用して、人気のある通知サービ
|
|||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
msgstr "バイナリ"
|
msgstr "バイナリ"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bits (Kbps, Mbps, Gbps)"
|
||||||
|
msgstr "ビット (Kbps, Mbps, Gbps)"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bytes (KB/s, MB/s, GB/s)"
|
||||||
|
msgstr "バイト (KB/s, MB/s, GB/s)"
|
||||||
|
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
msgid "Cache / Buffers"
|
msgid "Cache / Buffers"
|
||||||
msgstr "キャッシュ / バッファ"
|
msgstr "キャッシュ / バッファ"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "キャンセル"
|
msgstr "キャンセル"
|
||||||
|
|
||||||
@@ -164,6 +211,14 @@ msgstr "キャンセル"
|
|||||||
msgid "Caution - potential data loss"
|
msgid "Caution - potential data loss"
|
||||||
msgstr "注意 - データ損失の可能性"
|
msgstr "注意 - データ損失の可能性"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Celsius (°C)"
|
||||||
|
msgstr "セルシウス (°C)"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Change display units for metrics."
|
||||||
|
msgstr "メトリックの表示単位を変更します。"
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Change general application options."
|
msgid "Change general application options."
|
||||||
msgstr "一般的なアプリケーションオプションを変更します。"
|
msgstr "一般的なアプリケーションオプションを変更します。"
|
||||||
@@ -202,7 +257,12 @@ msgstr "アラート通知の受信方法を設定します。"
|
|||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr "パスワードを確認"
|
msgstr "パスワードを確認"
|
||||||
|
|
||||||
|
#: src/components/routes/home.tsx
|
||||||
|
msgid "Connection is down"
|
||||||
|
msgstr "接続が切断されました"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Continue"
|
msgid "Continue"
|
||||||
msgstr "続行"
|
msgstr "続行"
|
||||||
|
|
||||||
@@ -211,11 +271,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "クリップボードにコピーされました"
|
msgstr "クリップボードにコピーされました"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "docker compose をコピー"
|
msgstr "docker compose をコピー"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "docker run をコピー"
|
msgstr "docker run をコピー"
|
||||||
@@ -230,9 +292,14 @@ msgid "Copy host"
|
|||||||
msgstr "ホストをコピー"
|
msgstr "ホストをコピー"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Linuxコマンドをコピー"
|
msgstr "Linuxコマンドをコピー"
|
||||||
|
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Copy name"
|
||||||
|
msgstr "名前をコピー"
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Copy text"
|
msgid "Copy text"
|
||||||
msgstr "テキストをコピー"
|
msgstr "テキストをコピー"
|
||||||
@@ -255,7 +322,7 @@ msgstr "CPU"
|
|||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "CPU Usage"
|
msgid "CPU Usage"
|
||||||
msgstr "CPU使用率"
|
msgstr "CPU使用率"
|
||||||
|
|
||||||
@@ -263,6 +330,11 @@ msgstr "CPU使用率"
|
|||||||
msgid "Create account"
|
msgid "Create account"
|
||||||
msgstr "アカウントを作成"
|
msgstr "アカウントを作成"
|
||||||
|
|
||||||
|
#. Context: date created
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Created"
|
||||||
|
msgstr "作成日"
|
||||||
|
|
||||||
#. Dark theme
|
#. Dark theme
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
@@ -278,6 +350,7 @@ msgid "Default time period"
|
|||||||
msgstr "デフォルトの期間"
|
msgstr "デフォルトの期間"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "削除"
|
msgstr "削除"
|
||||||
|
|
||||||
@@ -293,6 +366,10 @@ msgstr "ディスク"
|
|||||||
msgid "Disk I/O"
|
msgid "Disk I/O"
|
||||||
msgstr "ディスクI/O"
|
msgstr "ディスクI/O"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Disk unit"
|
||||||
|
msgstr "ディスク単位"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/disk-chart.tsx
|
#: src/components/charts/disk-chart.tsx
|
||||||
@@ -321,11 +398,16 @@ msgstr "ドキュメント"
|
|||||||
|
|
||||||
#. Context: System is down
|
#. Context: System is down
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Down"
|
msgid "Down"
|
||||||
msgstr "停止"
|
msgstr "停止"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Duration"
|
||||||
|
msgstr "期間"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
@@ -351,6 +433,7 @@ msgstr "メールアドレスを入力..."
|
|||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
#: src/components/login/auth-form.tsx
|
#: src/components/login/auth-form.tsx
|
||||||
msgid "Error"
|
msgid "Error"
|
||||||
msgstr "エラー"
|
msgstr "エラー"
|
||||||
@@ -366,6 +449,10 @@ msgstr "過去{2, plural, one {# 分} other {# 分}}で{0}{1}を超えていま
|
|||||||
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
||||||
msgstr "<0>config.yml</0>に定義されていない既存のシステムは削除されます。定期的にバックアップを作成してください。"
|
msgstr "<0>config.yml</0>に定義されていない既存のシステムは削除されます。定期的にバックアップを作成してください。"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Export"
|
||||||
|
msgstr "エクスポート"
|
||||||
|
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
msgid "Export configuration"
|
msgid "Export configuration"
|
||||||
msgstr "設定をエクスポート"
|
msgstr "設定をエクスポート"
|
||||||
@@ -374,6 +461,10 @@ msgstr "設定をエクスポート"
|
|||||||
msgid "Export your current systems configuration."
|
msgid "Export your current systems configuration."
|
||||||
msgstr "現在のシステム設定をエクスポートします。"
|
msgstr "現在のシステム設定をエクスポートします。"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Fahrenheit (°F)"
|
||||||
|
msgstr "華氏 (°F)"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Failed to authenticate"
|
msgid "Failed to authenticate"
|
||||||
msgstr "認証に失敗しました"
|
msgstr "認証に失敗しました"
|
||||||
@@ -393,9 +484,14 @@ msgstr "アラートの更新に失敗しました"
|
|||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "フィルター..."
|
msgstr "フィルター..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr "フィンガープリント"
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "<0>{min}</0> {min, plural, one {分} other {分}}の間"
|
msgstr "<0>{min}</0> {min, plural, one {分} other {分}}の間"
|
||||||
@@ -419,6 +515,7 @@ msgid "Grid"
|
|||||||
msgstr "グリッド"
|
msgstr "グリッド"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Homebrew コマンド"
|
msgstr "Homebrew コマンド"
|
||||||
@@ -453,6 +550,27 @@ msgstr "レイアウト"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "ライト"
|
msgstr "ライト"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "Load Average"
|
||||||
|
msgstr "ロードアベレージ"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr "ロードアベレージ (15分)"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 1m"
|
||||||
|
msgstr "ロードアベレージ (1分)"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr "ロードアベレージ (5分)"
|
||||||
|
|
||||||
|
#. Short label for load average
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Load Avg"
|
||||||
|
msgstr "ロードアベレージ"
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "ログアウト"
|
msgstr "ログアウト"
|
||||||
@@ -501,6 +619,7 @@ msgstr "メモリ使用率"
|
|||||||
msgid "Memory usage of docker containers"
|
msgid "Memory usage of docker containers"
|
||||||
msgstr "Dockerコンテナのメモリ使用率"
|
msgstr "Dockerコンテナのメモリ使用率"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "名前"
|
msgstr "名前"
|
||||||
@@ -517,10 +636,19 @@ msgstr "Dockerコンテナのネットワークトラフィック"
|
|||||||
msgid "Network traffic of public interfaces"
|
msgid "Network traffic of public interfaces"
|
||||||
msgstr "パブリックインターフェースのネットワークトラフィック"
|
msgstr "パブリックインターフェースのネットワークトラフィック"
|
||||||
|
|
||||||
|
#. Context: Bytes or bits
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Network unit"
|
||||||
|
msgstr "ネットワーク単位"
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "No results found."
|
msgid "No results found."
|
||||||
msgstr "結果が見つかりませんでした。"
|
msgstr "結果が見つかりませんでした。"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "No results."
|
||||||
|
msgstr "結果がありません。"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "No systems found."
|
msgid "No systems found."
|
||||||
@@ -558,6 +686,12 @@ msgstr "既存のアラートを上書き"
|
|||||||
msgid "Page"
|
msgid "Page"
|
||||||
msgstr "ページ"
|
msgstr "ページ"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getState().pagination.pageIndex + 1
|
||||||
|
#. placeholder {1}: table.getPageCount()
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Page {0} of {1}"
|
||||||
|
msgstr "{1}ページ中{0}ページ目"
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "Pages / Settings"
|
msgid "Pages / Settings"
|
||||||
msgstr "ページ / 設定"
|
msgstr "ページ / 設定"
|
||||||
@@ -639,13 +773,12 @@ msgid "Public Key"
|
|||||||
msgstr "公開鍵"
|
msgstr "公開鍵"
|
||||||
|
|
||||||
#. Disk read
|
#. Disk read
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Read"
|
msgid "Read"
|
||||||
msgstr "読み取り"
|
msgstr "読み取り"
|
||||||
|
|
||||||
#. Network bytes received (download)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Received"
|
msgid "Received"
|
||||||
msgstr "受信"
|
msgstr "受信"
|
||||||
|
|
||||||
@@ -653,6 +786,12 @@ msgstr "受信"
|
|||||||
msgid "Reset Password"
|
msgid "Reset Password"
|
||||||
msgstr "パスワードをリセット"
|
msgstr "パスワードをリセット"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Resolved"
|
||||||
|
msgstr "解決済み"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Resume"
|
msgid "Resume"
|
||||||
msgstr "再開"
|
msgstr "再開"
|
||||||
@@ -661,6 +800,10 @@ msgstr "再開"
|
|||||||
msgid "Rotate token"
|
msgid "Rotate token"
|
||||||
msgstr "トークンをローテート"
|
msgstr "トークンをローテート"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Rows per page"
|
||||||
|
msgstr "ページあたりの行数"
|
||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
||||||
msgstr "Enterキーまたはカンマを使用してアドレスを保存します。空白のままにするとメール通知が無効になります。"
|
msgstr "Enterキーまたはカンマを使用してアドレスを保存します。空白のままにするとメール通知が無効になります。"
|
||||||
@@ -686,8 +829,7 @@ msgstr "システムまたは設定を検索..."
|
|||||||
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
||||||
msgstr "アラートの受信方法を設定するには<0>通知設定</0>を参照してください。"
|
msgstr "アラートの受信方法を設定するには<0>通知設定</0>を参照してください。"
|
||||||
|
|
||||||
#. Network bytes sent (upload)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Sent"
|
msgid "Sent"
|
||||||
msgstr "送信"
|
msgstr "送信"
|
||||||
|
|
||||||
@@ -718,6 +860,11 @@ msgstr "SMTP設定"
|
|||||||
msgid "Sort By"
|
msgid "Sort By"
|
||||||
msgstr "並び替え基準"
|
msgstr "並び替え基準"
|
||||||
|
|
||||||
|
#. Context: alert state (active or resolved)
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "State"
|
||||||
|
msgstr "状態"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr "ステータス"
|
msgstr "ステータス"
|
||||||
@@ -733,10 +880,16 @@ msgstr "スワップ使用量"
|
|||||||
#. System theme
|
#. System theme
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "システム"
|
msgstr "システム"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "System load averages over time"
|
||||||
|
msgstr "システムのロードアベレージの推移"
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Systems"
|
msgid "Systems"
|
||||||
msgstr "システム"
|
msgstr "システム"
|
||||||
@@ -759,6 +912,10 @@ msgstr "温度"
|
|||||||
msgid "Temperature"
|
msgid "Temperature"
|
||||||
msgstr "温度"
|
msgstr "温度"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Temperature unit"
|
||||||
|
msgstr "温度単位"
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Temperatures of system sensors"
|
msgid "Temperatures of system sensors"
|
||||||
msgstr "システムセンサーの温度"
|
msgstr "システムセンサーの温度"
|
||||||
@@ -779,6 +936,10 @@ msgstr "その後、バックエンドにログインして、ユーザーテー
|
|||||||
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
||||||
msgstr "この操作は元に戻せません。これにより、データベースから{name}のすべての現在のレコードが永久に削除されます。"
|
msgstr "この操作は元に戻せません。これにより、データベースから{name}のすべての現在のレコードが永久に削除されます。"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "This will permanently delete all selected records from the database."
|
||||||
|
msgstr "これにより、選択したすべてのレコードがデータベースから完全に削除されます。"
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Throughput of {extraFsName}"
|
msgid "Throughput of {extraFsName}"
|
||||||
msgstr "{extraFsName}のスループット"
|
msgstr "{extraFsName}のスループット"
|
||||||
@@ -801,6 +962,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "テーマを切り替え"
|
msgstr "テーマを切り替え"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr "トークン"
|
msgstr "トークン"
|
||||||
|
|
||||||
@@ -818,6 +980,18 @@ msgstr "トークンはエージェントの接続と登録を可能にします
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr "トークンとフィンガープリントは、ハブへのWebSocket接続の認証に使用されます。"
|
msgstr "トークンとフィンガープリントは、ハブへのWebSocket接続の認証に使用されます。"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 1 minute load average exceeds a threshold"
|
||||||
|
msgstr "1分間のロードアベレージがしきい値を超えたときにトリガーされます"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr "15分間のロードアベレージがしきい値を超えたときにトリガーされます"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr "5分間のロードアベレージがしきい値を超えたときにトリガーされます"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "センサーがしきい値を超えたときにトリガーされます"
|
msgstr "センサーがしきい値を超えたときにトリガーされます"
|
||||||
@@ -842,6 +1016,11 @@ msgstr "ステータスが上から下に切り替わるときにトリガーさ
|
|||||||
msgid "Triggers when usage of any disk exceeds a threshold"
|
msgid "Triggers when usage of any disk exceeds a threshold"
|
||||||
msgstr "ディスクの使用量がしきい値を超えたときにトリガーされます"
|
msgstr "ディスクの使用量がしきい値を超えたときにトリガーされます"
|
||||||
|
|
||||||
|
#. Temperature / network units
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Unit preferences"
|
||||||
|
msgstr "単位の設定"
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Universal token"
|
msgid "Universal token"
|
||||||
msgstr "ユニバーサルトークン"
|
msgstr "ユニバーサルトークン"
|
||||||
@@ -862,7 +1041,8 @@ msgstr "稼働時間"
|
|||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
msgid "Usage"
|
msgid "Usage"
|
||||||
msgstr "使用量"
|
msgstr "使用量"
|
||||||
|
|
||||||
@@ -872,7 +1052,6 @@ msgstr "ルートパーティションの使用量"
|
|||||||
|
|
||||||
#: src/components/charts/swap-chart.tsx
|
#: src/components/charts/swap-chart.tsx
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Used"
|
msgid "Used"
|
||||||
msgstr "使用中"
|
msgstr "使用中"
|
||||||
|
|
||||||
@@ -881,10 +1060,18 @@ msgstr "使用中"
|
|||||||
msgid "Users"
|
msgid "Users"
|
||||||
msgstr "ユーザー"
|
msgstr "ユーザー"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Value"
|
||||||
|
msgstr "値"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "View"
|
msgid "View"
|
||||||
msgstr "表示"
|
msgstr "表示"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "View your 200 most recent alerts."
|
||||||
|
msgstr "直近200件のアラートを表示します。"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Visible Fields"
|
msgid "Visible Fields"
|
||||||
msgstr "表示列"
|
msgstr "表示列"
|
||||||
@@ -895,7 +1082,7 @@ msgstr "表示するのに十分なレコードを待っています"
|
|||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Want to help improve our translations? Check <0>Crowdin</0> for details."
|
msgid "Want to help improve our translations? Check <0>Crowdin</0> for details."
|
||||||
msgstr "翻訳をさらに良くするためにご協力いただけますか?詳細については<0>Crowdin</0>をご覧ください。"
|
msgstr "翻訳をさらに良くするためにご協力をお願いします。詳細については<0>Crowdin</0>をご覧ください。"
|
||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
msgid "Webhook / Push notifications"
|
msgid "Webhook / Push notifications"
|
||||||
@@ -906,13 +1093,14 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr "有効にすると、このトークンはエージェントが事前のシステム作成なしに自己登録することを可能にします。1時間後またはハブの再起動時に期限切れになります。"
|
msgstr "有効にすると、このトークンはエージェントが事前のシステム作成なしに自己登録することを可能にします。1時間後またはハブの再起動時に期限切れになります。"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Windows コマンド"
|
msgstr "Windows コマンド"
|
||||||
|
|
||||||
#. Disk write
|
#. Disk write
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Write"
|
msgid "Write"
|
||||||
msgstr "書き込み"
|
msgstr "書き込み"
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ msgstr ""
|
|||||||
"Language: ko\n"
|
"Language: ko\n"
|
||||||
"Project-Id-Version: beszel\n"
|
"Project-Id-Version: beszel\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2025-03-07 10:06\n"
|
"PO-Revision-Date: 2025-07-25 22:44\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: Korean\n"
|
"Language-Team: Korean\n"
|
||||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||||
@@ -23,6 +23,12 @@ msgstr ""
|
|||||||
msgid "{0, plural, one {# day} other {# days}}"
|
msgid "{0, plural, one {# day} other {# days}}"
|
||||||
msgstr "{0, plural, one {# 일} other {# 일}}"
|
msgstr "{0, plural, one {# 일} other {# 일}}"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
|
||||||
|
#. placeholder {1}: table.getFilteredRowModel().rows.length
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "{0} of {1} row(s) selected."
|
||||||
|
msgstr "{1}개의 행 중 {0}개가 선택되었습니다."
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "{hours, plural, one {# hour} other {# hours}}"
|
msgid "{hours, plural, one {# hour} other {# hours}}"
|
||||||
msgstr "{hours, plural, one {# 시간} other {# 시간}}"
|
msgstr "{hours, plural, one {# 시간} other {# 시간}}"
|
||||||
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# 시간} other {# 시간}}"
|
|||||||
msgid "1 hour"
|
msgid "1 hour"
|
||||||
msgstr "1시간"
|
msgstr "1시간"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "1 min"
|
||||||
|
msgstr "1분"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "1 week"
|
msgid "1 week"
|
||||||
msgstr "1주"
|
msgstr "1주"
|
||||||
@@ -39,6 +50,11 @@ msgstr "1주"
|
|||||||
msgid "12 hours"
|
msgid "12 hours"
|
||||||
msgstr "12시간"
|
msgstr "12시간"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "15 min"
|
||||||
|
msgstr "15분"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "24 hours"
|
msgid "24 hours"
|
||||||
msgstr "24시간"
|
msgstr "24시간"
|
||||||
@@ -47,12 +63,22 @@ msgstr "24시간"
|
|||||||
msgid "30 days"
|
msgid "30 days"
|
||||||
msgstr "30일"
|
msgstr "30일"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "5 min"
|
||||||
|
msgstr "5분"
|
||||||
|
|
||||||
#. Table column
|
#. Table column
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "작업"
|
msgstr "작업"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Active"
|
||||||
|
msgstr "활성"
|
||||||
|
|
||||||
#: src/components/routes/home.tsx
|
#: src/components/routes/home.tsx
|
||||||
msgid "Active Alerts"
|
msgid "Active Alerts"
|
||||||
msgstr "활성화된 알림들"
|
msgstr "활성화된 알림들"
|
||||||
@@ -86,6 +112,12 @@ msgstr "관리자"
|
|||||||
msgid "Agent"
|
msgid "Agent"
|
||||||
msgstr "에이전트"
|
msgstr "에이전트"
|
||||||
|
|
||||||
|
#: src/components/command-palette.tsx
|
||||||
|
#: src/components/routes/settings/layout.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Alert History"
|
||||||
|
msgstr "알림 기록"
|
||||||
|
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
msgid "Alerts"
|
msgid "Alerts"
|
||||||
@@ -100,6 +132,10 @@ msgstr "모든 시스템"
|
|||||||
msgid "Are you sure you want to delete {name}?"
|
msgid "Are you sure you want to delete {name}?"
|
||||||
msgstr "{name}을(를) 삭제하시겠습니까?"
|
msgstr "{name}을(를) 삭제하시겠습니까?"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Are you sure?"
|
||||||
|
msgstr "확실합니까?"
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Automatic copy requires a secure context."
|
msgid "Automatic copy requires a secure context."
|
||||||
msgstr "자동 복사는 안전한 컨텍스트가 필요합니다."
|
msgstr "자동 복사는 안전한 컨텍스트가 필요합니다."
|
||||||
@@ -110,7 +146,7 @@ msgstr "평균"
|
|||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Average CPU utilization of containers"
|
msgid "Average CPU utilization of containers"
|
||||||
msgstr "컨테이너의 평균 CPU 사용량"
|
msgstr "Docker 컨테이너의 평균 CPU 사용량"
|
||||||
|
|
||||||
#. placeholder {0}: data.alert.unit
|
#. placeholder {0}: data.alert.unit
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
@@ -152,11 +188,22 @@ msgstr "Beszel은 여러 인기 있는 알림 서비스와 연동하기 위해 <
|
|||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
msgstr "실행 파일"
|
msgstr "실행 파일"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bits (Kbps, Mbps, Gbps)"
|
||||||
|
msgstr "비트 (Kbps, Mbps, Gbps)"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bytes (KB/s, MB/s, GB/s)"
|
||||||
|
msgstr "바이트 (KB/s, MB/s, GB/s)"
|
||||||
|
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
msgid "Cache / Buffers"
|
msgid "Cache / Buffers"
|
||||||
msgstr "캐시 / 버퍼"
|
msgstr "캐시 / 버퍼"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "취소"
|
msgstr "취소"
|
||||||
|
|
||||||
@@ -164,6 +211,14 @@ msgstr "취소"
|
|||||||
msgid "Caution - potential data loss"
|
msgid "Caution - potential data loss"
|
||||||
msgstr "주의 - 데이터 손실 가능성"
|
msgstr "주의 - 데이터 손실 가능성"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Celsius (°C)"
|
||||||
|
msgstr "섭씨 (°C)"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Change display units for metrics."
|
||||||
|
msgstr "메트릭의 표시 단위를 변경합니다."
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Change general application options."
|
msgid "Change general application options."
|
||||||
msgstr "일반 애플리케이션 옵션 변경."
|
msgstr "일반 애플리케이션 옵션 변경."
|
||||||
@@ -202,7 +257,12 @@ msgstr "알림을 수신할 방법을 설정하세요."
|
|||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr "비밀번호 확인"
|
msgstr "비밀번호 확인"
|
||||||
|
|
||||||
|
#: src/components/routes/home.tsx
|
||||||
|
msgid "Connection is down"
|
||||||
|
msgstr "연결이 끊겼습니다"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Continue"
|
msgid "Continue"
|
||||||
msgstr "계속"
|
msgstr "계속"
|
||||||
|
|
||||||
@@ -211,43 +271,50 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "클립보드에 복사됨"
|
msgstr "클립보드에 복사됨"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "docker compose 복사"
|
msgstr "docker compose 내용 복사"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "docker run 복사"
|
msgstr "docker run 명령어 복사"
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Environment variables"
|
msgctxt "Environment variables"
|
||||||
msgid "Copy env"
|
msgid "Copy env"
|
||||||
msgstr ""
|
msgstr "환경 복사"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Copy host"
|
msgid "Copy host"
|
||||||
msgstr "호스트 복사"
|
msgstr "호스트 복사"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "리눅스 명령어 복사"
|
msgstr "리눅스 명령어 복사"
|
||||||
|
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Copy name"
|
||||||
|
msgstr "이름 복사"
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Copy text"
|
msgid "Copy text"
|
||||||
msgstr "텍스트 복사"
|
msgstr "텍스트 복사"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Copy the installation command for the agent below, or register agents automatically with a <0>universal token</0>."
|
msgid "Copy the installation command for the agent below, or register agents automatically with a <0>universal token</0>."
|
||||||
msgstr ""
|
msgstr "아래 에이전트의 설치 명령을 복사하거나 <0>범용 토큰</0>으로 에이전트를 자동으로 등록하세요."
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Copy the<0>docker-compose.yml</0> content for the agent below, or register agents automatically with a <1>universal token</1>."
|
msgid "Copy the<0>docker-compose.yml</0> content for the agent below, or register agents automatically with a <1>universal token</1>."
|
||||||
msgstr ""
|
msgstr "아래 에이전트의 <0>docker-compose.yml</0> 내용을 복사하거나 <1>범용 토큰</1>으로 에이전트를 자동으로 등록하세요."
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy YAML"
|
msgid "Copy YAML"
|
||||||
msgstr ""
|
msgstr "YAML 복사"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "CPU"
|
msgid "CPU"
|
||||||
@@ -255,7 +322,7 @@ msgstr "CPU"
|
|||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "CPU Usage"
|
msgid "CPU Usage"
|
||||||
msgstr "CPU 사용량"
|
msgstr "CPU 사용량"
|
||||||
|
|
||||||
@@ -263,6 +330,11 @@ msgstr "CPU 사용량"
|
|||||||
msgid "Create account"
|
msgid "Create account"
|
||||||
msgstr "계정 생성"
|
msgstr "계정 생성"
|
||||||
|
|
||||||
|
#. Context: date created
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Created"
|
||||||
|
msgstr "생성됨"
|
||||||
|
|
||||||
#. Dark theme
|
#. Dark theme
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
@@ -278,12 +350,13 @@ msgid "Default time period"
|
|||||||
msgstr "기본 기간"
|
msgstr "기본 기간"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "삭제"
|
msgstr "삭제"
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Delete fingerprint"
|
msgid "Delete fingerprint"
|
||||||
msgstr ""
|
msgstr "지문 삭제"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Disk"
|
msgid "Disk"
|
||||||
@@ -293,6 +366,10 @@ msgstr "디스크"
|
|||||||
msgid "Disk I/O"
|
msgid "Disk I/O"
|
||||||
msgstr "디스크 I/O"
|
msgstr "디스크 I/O"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Disk unit"
|
||||||
|
msgstr "디스크 단위"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/disk-chart.tsx
|
#: src/components/charts/disk-chart.tsx
|
||||||
@@ -321,11 +398,16 @@ msgstr "문서"
|
|||||||
|
|
||||||
#. Context: System is down
|
#. Context: System is down
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Down"
|
msgid "Down"
|
||||||
msgstr "오프라인"
|
msgstr "오프라인"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Duration"
|
||||||
|
msgstr "기간"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
@@ -351,6 +433,7 @@ msgstr "이메일 주소 입력..."
|
|||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
#: src/components/login/auth-form.tsx
|
#: src/components/login/auth-form.tsx
|
||||||
msgid "Error"
|
msgid "Error"
|
||||||
msgstr "오류"
|
msgstr "오류"
|
||||||
@@ -366,6 +449,10 @@ msgstr "마지막 {2, plural, one {# 분} other {# 분}} 동안 {0}{1} 초과"
|
|||||||
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
||||||
msgstr "<0>config.yml</0>에 정의되지 않은 기존 시스템은 삭제됩니다. 정기적으로 백업을 하세요."
|
msgstr "<0>config.yml</0>에 정의되지 않은 기존 시스템은 삭제됩니다. 정기적으로 백업을 하세요."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Export"
|
||||||
|
msgstr "내보내기"
|
||||||
|
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
msgid "Export configuration"
|
msgid "Export configuration"
|
||||||
msgstr "구성 내보내기"
|
msgstr "구성 내보내기"
|
||||||
@@ -374,6 +461,10 @@ msgstr "구성 내보내기"
|
|||||||
msgid "Export your current systems configuration."
|
msgid "Export your current systems configuration."
|
||||||
msgstr "현재 시스템 구성 내보내기"
|
msgstr "현재 시스템 구성 내보내기"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Fahrenheit (°F)"
|
||||||
|
msgstr "화씨 (°F)"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Failed to authenticate"
|
msgid "Failed to authenticate"
|
||||||
msgstr "인증 실패"
|
msgstr "인증 실패"
|
||||||
@@ -393,9 +484,14 @@ msgstr "알림 수정 실패"
|
|||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "필터..."
|
msgstr "필터..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr "지문"
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "<0>{min}</0> {min, plural, one {분} other {분}} 동안"
|
msgstr "<0>{min}</0> {min, plural, one {분} other {분}} 동안"
|
||||||
@@ -419,6 +515,7 @@ msgid "Grid"
|
|||||||
msgstr "그리드"
|
msgstr "그리드"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Homebrew 명령어"
|
msgstr "Homebrew 명령어"
|
||||||
@@ -453,6 +550,27 @@ msgstr "레이아웃"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "밝게"
|
msgstr "밝게"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "Load Average"
|
||||||
|
msgstr "부하 평균"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr "부하 평균 15분"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 1m"
|
||||||
|
msgstr "부하 평균 1분"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr "부하 평균 5분"
|
||||||
|
|
||||||
|
#. Short label for load average
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Load Avg"
|
||||||
|
msgstr "부하 평균"
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "로그아웃"
|
msgstr "로그아웃"
|
||||||
@@ -501,6 +619,7 @@ msgstr "메모리 사용량"
|
|||||||
msgid "Memory usage of docker containers"
|
msgid "Memory usage of docker containers"
|
||||||
msgstr "Docker 컨테이너의 메모리 사용량"
|
msgstr "Docker 컨테이너의 메모리 사용량"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "이름"
|
msgstr "이름"
|
||||||
@@ -517,10 +636,19 @@ msgstr "Docker 컨테이너의 네트워크 트래픽"
|
|||||||
msgid "Network traffic of public interfaces"
|
msgid "Network traffic of public interfaces"
|
||||||
msgstr "공용 인터페이스의 네트워크 트래픽"
|
msgstr "공용 인터페이스의 네트워크 트래픽"
|
||||||
|
|
||||||
|
#. Context: Bytes or bits
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Network unit"
|
||||||
|
msgstr "네트워크 단위"
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "No results found."
|
msgid "No results found."
|
||||||
msgstr "결과가 없습니다."
|
msgstr "결과가 없습니다."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "No results."
|
||||||
|
msgstr "결과 없음."
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "No systems found."
|
msgid "No systems found."
|
||||||
@@ -558,6 +686,12 @@ msgstr "기존 알림 덮어쓰기"
|
|||||||
msgid "Page"
|
msgid "Page"
|
||||||
msgstr "페이지"
|
msgstr "페이지"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getState().pagination.pageIndex + 1
|
||||||
|
#. placeholder {1}: table.getPageCount()
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Page {0} of {1}"
|
||||||
|
msgstr "{1}페이지 중 {0}페이지"
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "Pages / Settings"
|
msgid "Pages / Settings"
|
||||||
msgstr "페이지 / 설정"
|
msgstr "페이지 / 설정"
|
||||||
@@ -585,7 +719,7 @@ msgstr "일시 중지"
|
|||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Paused"
|
msgid "Paused"
|
||||||
msgstr "일시정지됨"
|
msgstr "일시 정지됨"
|
||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
|
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
|
||||||
@@ -639,13 +773,12 @@ msgid "Public Key"
|
|||||||
msgstr "공개 키"
|
msgstr "공개 키"
|
||||||
|
|
||||||
#. Disk read
|
#. Disk read
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Read"
|
msgid "Read"
|
||||||
msgstr "읽기"
|
msgstr "읽기"
|
||||||
|
|
||||||
#. Network bytes received (download)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Received"
|
msgid "Received"
|
||||||
msgstr "수신됨"
|
msgstr "수신됨"
|
||||||
|
|
||||||
@@ -653,13 +786,23 @@ msgstr "수신됨"
|
|||||||
msgid "Reset Password"
|
msgid "Reset Password"
|
||||||
msgstr "비밀번호 재설정"
|
msgstr "비밀번호 재설정"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Resolved"
|
||||||
|
msgstr "해결됨"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Resume"
|
msgid "Resume"
|
||||||
msgstr "재개"
|
msgstr "재개"
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Rotate token"
|
msgid "Rotate token"
|
||||||
msgstr ""
|
msgstr "토큰 회전"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Rows per page"
|
||||||
|
msgstr "페이지당 행 수"
|
||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
||||||
@@ -686,8 +829,7 @@ msgstr "시스템 또는 설정 검색..."
|
|||||||
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
||||||
msgstr "알림을 받는 방법을 구성하려면 <0>알림 설정</0>을 참조하세요."
|
msgstr "알림을 받는 방법을 구성하려면 <0>알림 설정</0>을 참조하세요."
|
||||||
|
|
||||||
#. Network bytes sent (upload)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Sent"
|
msgid "Sent"
|
||||||
msgstr "보냄"
|
msgstr "보냄"
|
||||||
|
|
||||||
@@ -718,6 +860,11 @@ msgstr "SMTP 설정"
|
|||||||
msgid "Sort By"
|
msgid "Sort By"
|
||||||
msgstr "정렬 기준"
|
msgstr "정렬 기준"
|
||||||
|
|
||||||
|
#. Context: alert state (active or resolved)
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "State"
|
||||||
|
msgstr "상태"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr "상태"
|
msgstr "상태"
|
||||||
@@ -733,10 +880,16 @@ msgstr "스왑 사용량"
|
|||||||
#. System theme
|
#. System theme
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "시스템"
|
msgstr "시스템"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "System load averages over time"
|
||||||
|
msgstr "시간에 따른 시스템 부하 평균"
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Systems"
|
msgid "Systems"
|
||||||
msgstr "시스템"
|
msgstr "시스템"
|
||||||
@@ -759,6 +912,10 @@ msgstr "온도"
|
|||||||
msgid "Temperature"
|
msgid "Temperature"
|
||||||
msgstr "온도"
|
msgstr "온도"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Temperature unit"
|
||||||
|
msgstr "온도 단위"
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Temperatures of system sensors"
|
msgid "Temperatures of system sensors"
|
||||||
msgstr "시스템 센서의 온도"
|
msgstr "시스템 센서의 온도"
|
||||||
@@ -779,6 +936,10 @@ msgstr "그런 다음 백엔드에 로그인하여 사용자 테이블에서 사
|
|||||||
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
||||||
msgstr "이 작업은 되돌릴 수 없습니다. 데이터베이스에서 {name}에 대한 모든 현재 기록이 영구적으로 삭제됩니다."
|
msgstr "이 작업은 되돌릴 수 없습니다. 데이터베이스에서 {name}에 대한 모든 현재 기록이 영구적으로 삭제됩니다."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "This will permanently delete all selected records from the database."
|
||||||
|
msgstr "선택한 모든 레코드를 데이터베이스에서 영구적으로 삭제합니다."
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Throughput of {extraFsName}"
|
msgid "Throughput of {extraFsName}"
|
||||||
msgstr "{extraFsName}의 처리량"
|
msgstr "{extraFsName}의 처리량"
|
||||||
@@ -801,22 +962,35 @@ msgid "Toggle theme"
|
|||||||
msgstr "테마 전환"
|
msgstr "테마 전환"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr ""
|
msgstr "토큰"
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
#: src/components/routes/settings/layout.tsx
|
#: src/components/routes/settings/layout.tsx
|
||||||
msgid "Tokens & Fingerprints"
|
msgid "Tokens & Fingerprints"
|
||||||
msgstr ""
|
msgstr "토큰 및 지문"
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Tokens allow agents to connect and register. Fingerprints are stable identifiers unique to each system, set on first connection."
|
msgid "Tokens allow agents to connect and register. Fingerprints are stable identifiers unique to each system, set on first connection."
|
||||||
msgstr ""
|
msgstr "토큰은 에이전트가 연결하고 등록할 수 있도록 합니다. 지문은 첫 연결 시 설정되는 각 시스템의 고유한 안정적인 식별자입니다."
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr ""
|
msgstr "토큰과 지문은 허브에 대한 WebSocket 연결을 인증하는 데 사용됩니다."
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 1 minute load average exceeds a threshold"
|
||||||
|
msgstr "1분 부하 평균이 임계값을 초과하면 트리거됩니다."
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr "15분 부하 평균이 임계값을 초과하면 트리거됩니다."
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr "5분 부하 평균이 임계값을 초과하면 트리거됩니다."
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
@@ -842,9 +1016,14 @@ msgstr "시스템의 전원이 켜지거나 꺼질때 트리거됩니다."
|
|||||||
msgid "Triggers when usage of any disk exceeds a threshold"
|
msgid "Triggers when usage of any disk exceeds a threshold"
|
||||||
msgstr "디스크 사용량이 임계값을 초과할 때 트리거됩니다."
|
msgstr "디스크 사용량이 임계값을 초과할 때 트리거됩니다."
|
||||||
|
|
||||||
|
#. Temperature / network units
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Unit preferences"
|
||||||
|
msgstr "단위 기본 설정"
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Universal token"
|
msgid "Universal token"
|
||||||
msgstr ""
|
msgstr "범용 토큰"
|
||||||
|
|
||||||
#. Context: System is up
|
#. Context: System is up
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
@@ -862,7 +1041,8 @@ msgstr "가동 시간"
|
|||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
msgid "Usage"
|
msgid "Usage"
|
||||||
msgstr "사용량"
|
msgstr "사용량"
|
||||||
|
|
||||||
@@ -872,7 +1052,6 @@ msgstr "루트 파티션의 사용량"
|
|||||||
|
|
||||||
#: src/components/charts/swap-chart.tsx
|
#: src/components/charts/swap-chart.tsx
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Used"
|
msgid "Used"
|
||||||
msgstr "사용됨"
|
msgstr "사용됨"
|
||||||
|
|
||||||
@@ -881,10 +1060,18 @@ msgstr "사용됨"
|
|||||||
msgid "Users"
|
msgid "Users"
|
||||||
msgstr "사용자"
|
msgstr "사용자"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Value"
|
||||||
|
msgstr "값"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "View"
|
msgid "View"
|
||||||
msgstr "보기"
|
msgstr "보기"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "View your 200 most recent alerts."
|
||||||
|
msgstr "최근 200개의 알림을 봅니다."
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Visible Fields"
|
msgid "Visible Fields"
|
||||||
msgstr "표시할 열"
|
msgstr "표시할 열"
|
||||||
@@ -895,7 +1082,7 @@ msgstr "표시할 충분한 기록을 기다리는 중"
|
|||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Want to help improve our translations? Check <0>Crowdin</0> for details."
|
msgid "Want to help improve our translations? Check <0>Crowdin</0> for details."
|
||||||
msgstr "번역을 더 좋게 만드는 데 도움을 주시겠습니까? 자세한 내용은 <0>Crowdin</0>을 확인하세요."
|
msgstr "번역을 개선하는데 도움을 주시겠습니까? 자세한 내용은 <0>Crowdin</0>을 확인해 주세요."
|
||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
msgid "Webhook / Push notifications"
|
msgid "Webhook / Push notifications"
|
||||||
@@ -903,16 +1090,17 @@ msgstr "Webhook / 푸시 알림"
|
|||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "When enabled, this token allows agents to self-register without prior system creation. Expires after one hour or on hub restart."
|
msgid "When enabled, this token allows agents to self-register without prior system creation. Expires after one hour or on hub restart."
|
||||||
msgstr ""
|
msgstr "활성화하면 이 토큰을 통해 에이전트가 사전 시스템 생성 없이 자체 등록할 수 있습니다. 1시간 후 또는 허브 재시작 시 만료됩니다."
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Windows 명령어"
|
msgstr "Windows 명령어"
|
||||||
|
|
||||||
#. Disk write
|
#. Disk write
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Write"
|
msgid "Write"
|
||||||
msgstr "쓰기"
|
msgstr "쓰기"
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ msgstr ""
|
|||||||
"Language: nl\n"
|
"Language: nl\n"
|
||||||
"Project-Id-Version: beszel\n"
|
"Project-Id-Version: beszel\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2025-03-06 07:27\n"
|
"PO-Revision-Date: 2025-07-25 22:44\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: Dutch\n"
|
"Language-Team: Dutch\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
@@ -23,6 +23,12 @@ msgstr ""
|
|||||||
msgid "{0, plural, one {# day} other {# days}}"
|
msgid "{0, plural, one {# day} other {# days}}"
|
||||||
msgstr "{0, plural, one {# dag} other {# dagen}}"
|
msgstr "{0, plural, one {# dag} other {# dagen}}"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
|
||||||
|
#. placeholder {1}: table.getFilteredRowModel().rows.length
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "{0} of {1} row(s) selected."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "{hours, plural, one {# hour} other {# hours}}"
|
msgid "{hours, plural, one {# hour} other {# hours}}"
|
||||||
msgstr "{hours, plural, one {# uur} other {# uren}}"
|
msgstr "{hours, plural, one {# uur} other {# uren}}"
|
||||||
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# uur} other {# uren}}"
|
|||||||
msgid "1 hour"
|
msgid "1 hour"
|
||||||
msgstr "1 uur"
|
msgstr "1 uur"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "1 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "1 week"
|
msgid "1 week"
|
||||||
msgstr "1 week"
|
msgstr "1 week"
|
||||||
@@ -39,6 +50,11 @@ msgstr "1 week"
|
|||||||
msgid "12 hours"
|
msgid "12 hours"
|
||||||
msgstr "12 uren"
|
msgstr "12 uren"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "15 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "24 hours"
|
msgid "24 hours"
|
||||||
msgstr "24 uren"
|
msgstr "24 uren"
|
||||||
@@ -47,12 +63,22 @@ msgstr "24 uren"
|
|||||||
msgid "30 days"
|
msgid "30 days"
|
||||||
msgstr "30 dagen"
|
msgstr "30 dagen"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "5 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. Table column
|
#. Table column
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "Acties"
|
msgstr "Acties"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Active"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/home.tsx
|
#: src/components/routes/home.tsx
|
||||||
msgid "Active Alerts"
|
msgid "Active Alerts"
|
||||||
msgstr "Actieve waarschuwingen"
|
msgstr "Actieve waarschuwingen"
|
||||||
@@ -86,6 +112,12 @@ msgstr "Admin"
|
|||||||
msgid "Agent"
|
msgid "Agent"
|
||||||
msgstr "Agent"
|
msgstr "Agent"
|
||||||
|
|
||||||
|
#: src/components/command-palette.tsx
|
||||||
|
#: src/components/routes/settings/layout.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Alert History"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
msgid "Alerts"
|
msgid "Alerts"
|
||||||
@@ -100,6 +132,10 @@ msgstr "Alle systemen"
|
|||||||
msgid "Are you sure you want to delete {name}?"
|
msgid "Are you sure you want to delete {name}?"
|
||||||
msgstr "Weet je zeker dat je {name} wilt verwijderen?"
|
msgstr "Weet je zeker dat je {name} wilt verwijderen?"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Are you sure?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Automatic copy requires a secure context."
|
msgid "Automatic copy requires a secure context."
|
||||||
msgstr "Automatisch kopiëren vereist een veilige context."
|
msgstr "Automatisch kopiëren vereist een veilige context."
|
||||||
@@ -152,11 +188,22 @@ msgstr "Beszel gebruikt <0>Shoutrr</0> om te integreren met populaire meldingsdi
|
|||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
msgstr "Binair"
|
msgstr "Binair"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bits (Kbps, Mbps, Gbps)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bytes (KB/s, MB/s, GB/s)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
msgid "Cache / Buffers"
|
msgid "Cache / Buffers"
|
||||||
msgstr "Cache / Buffers"
|
msgstr "Cache / Buffers"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Annuleren"
|
msgstr "Annuleren"
|
||||||
|
|
||||||
@@ -164,6 +211,14 @@ msgstr "Annuleren"
|
|||||||
msgid "Caution - potential data loss"
|
msgid "Caution - potential data loss"
|
||||||
msgstr "Opgelet - potentieel gegevensverlies"
|
msgstr "Opgelet - potentieel gegevensverlies"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Celsius (°C)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Change display units for metrics."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Change general application options."
|
msgid "Change general application options."
|
||||||
msgstr "Wijzig algemene applicatie opties."
|
msgstr "Wijzig algemene applicatie opties."
|
||||||
@@ -202,7 +257,12 @@ msgstr "Configureer hoe je waarschuwingsmeldingen ontvangt."
|
|||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr "Bevestig wachtwoord"
|
msgstr "Bevestig wachtwoord"
|
||||||
|
|
||||||
|
#: src/components/routes/home.tsx
|
||||||
|
msgid "Connection is down"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Continue"
|
msgid "Continue"
|
||||||
msgstr "Volgende"
|
msgstr "Volgende"
|
||||||
|
|
||||||
@@ -211,11 +271,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Gekopieerd naar het klembord"
|
msgstr "Gekopieerd naar het klembord"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Docker compose kopiëren"
|
msgstr "Docker compose kopiëren"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Docker run kopiëren"
|
msgstr "Docker run kopiëren"
|
||||||
@@ -223,31 +285,36 @@ msgstr "Docker run kopiëren"
|
|||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Environment variables"
|
msgctxt "Environment variables"
|
||||||
msgid "Copy env"
|
msgid "Copy env"
|
||||||
msgstr ""
|
msgstr "Env kopiëren"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Copy host"
|
msgid "Copy host"
|
||||||
msgstr "Kopieer host"
|
msgstr "Kopieer host"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Kopieer Linux-opdracht"
|
msgstr "Kopieer Linux-opdracht"
|
||||||
|
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Copy name"
|
||||||
|
msgstr "Kopieer naam"
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Copy text"
|
msgid "Copy text"
|
||||||
msgstr "Kopieer tekst"
|
msgstr "Kopieer tekst"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Copy the installation command for the agent below, or register agents automatically with a <0>universal token</0>."
|
msgid "Copy the installation command for the agent below, or register agents automatically with a <0>universal token</0>."
|
||||||
msgstr ""
|
msgstr "Kopieer de installatie opdracht voor de agent hieronder, of registreer agenten automatisch met een <0>universele token</0>."
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Copy the<0>docker-compose.yml</0> content for the agent below, or register agents automatically with a <1>universal token</1>."
|
msgid "Copy the<0>docker-compose.yml</0> content for the agent below, or register agents automatically with a <1>universal token</1>."
|
||||||
msgstr ""
|
msgstr "Kopieer de<0>docker-compose.yml</0> inhoud voor de agent hieronder, of registreer agenten automatisch met een <1>universele token</1>."
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy YAML"
|
msgid "Copy YAML"
|
||||||
msgstr ""
|
msgstr "YAML kopiëren"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "CPU"
|
msgid "CPU"
|
||||||
@@ -255,7 +322,7 @@ msgstr "CPU"
|
|||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "CPU Usage"
|
msgid "CPU Usage"
|
||||||
msgstr "Processorgebruik"
|
msgstr "Processorgebruik"
|
||||||
|
|
||||||
@@ -263,6 +330,11 @@ msgstr "Processorgebruik"
|
|||||||
msgid "Create account"
|
msgid "Create account"
|
||||||
msgstr "Account aanmaken"
|
msgstr "Account aanmaken"
|
||||||
|
|
||||||
|
#. Context: date created
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Created"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. Dark theme
|
#. Dark theme
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
@@ -278,12 +350,13 @@ msgid "Default time period"
|
|||||||
msgstr "Standaard tijdsduur"
|
msgstr "Standaard tijdsduur"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Verwijderen"
|
msgstr "Verwijderen"
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Delete fingerprint"
|
msgid "Delete fingerprint"
|
||||||
msgstr ""
|
msgstr "Vingerafdruk verwijderen"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Disk"
|
msgid "Disk"
|
||||||
@@ -293,6 +366,10 @@ msgstr "Schijf"
|
|||||||
msgid "Disk I/O"
|
msgid "Disk I/O"
|
||||||
msgstr "Schijf I/O"
|
msgstr "Schijf I/O"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Disk unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/disk-chart.tsx
|
#: src/components/charts/disk-chart.tsx
|
||||||
@@ -321,11 +398,16 @@ msgstr "Documentatie"
|
|||||||
|
|
||||||
#. Context: System is down
|
#. Context: System is down
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Down"
|
msgid "Down"
|
||||||
msgstr "Offline"
|
msgstr "Offline"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Duration"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
@@ -351,6 +433,7 @@ msgstr "Voer een e-mailadres in..."
|
|||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
#: src/components/login/auth-form.tsx
|
#: src/components/login/auth-form.tsx
|
||||||
msgid "Error"
|
msgid "Error"
|
||||||
msgstr "Fout"
|
msgstr "Fout"
|
||||||
@@ -366,6 +449,10 @@ msgstr "Overschrijdt {0}{1} in de laatste {2, plural, one {# minuut} other {# mi
|
|||||||
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
||||||
msgstr "Bestaande systemen die niet gedefinieerd zijn in <0>config.yml</0> zullen worden verwijderd. Maak regelmatige backups."
|
msgstr "Bestaande systemen die niet gedefinieerd zijn in <0>config.yml</0> zullen worden verwijderd. Maak regelmatige backups."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Export"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
msgid "Export configuration"
|
msgid "Export configuration"
|
||||||
msgstr "Configuratie exporteren"
|
msgstr "Configuratie exporteren"
|
||||||
@@ -374,6 +461,10 @@ msgstr "Configuratie exporteren"
|
|||||||
msgid "Export your current systems configuration."
|
msgid "Export your current systems configuration."
|
||||||
msgstr "Exporteer je huidige systeemconfiguratie."
|
msgstr "Exporteer je huidige systeemconfiguratie."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Fahrenheit (°F)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Failed to authenticate"
|
msgid "Failed to authenticate"
|
||||||
msgstr "Authenticatie mislukt"
|
msgstr "Authenticatie mislukt"
|
||||||
@@ -393,9 +484,14 @@ msgstr "Bijwerken waarschuwing mislukt"
|
|||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Filter..."
|
msgstr "Filter..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr "Vingerafdruk"
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "Voor <0>{min}</0> {min, plural, one {minuut} other {minuten}}"
|
msgstr "Voor <0>{min}</0> {min, plural, one {minuut} other {minuten}}"
|
||||||
@@ -419,6 +515,7 @@ msgid "Grid"
|
|||||||
msgstr "Raster"
|
msgstr "Raster"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Homebrew-commando"
|
msgstr "Homebrew-commando"
|
||||||
@@ -453,6 +550,27 @@ msgstr "Indeling"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Licht"
|
msgstr "Licht"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "Load Average"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr "Gemiddelde Belasting 15m"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 1m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr "Gemiddelde Belasting 5m"
|
||||||
|
|
||||||
|
#. Short label for load average
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Load Avg"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Afmelden"
|
msgstr "Afmelden"
|
||||||
@@ -501,6 +619,7 @@ msgstr "Geheugengebruik"
|
|||||||
msgid "Memory usage of docker containers"
|
msgid "Memory usage of docker containers"
|
||||||
msgstr "Geheugengebruik van docker containers"
|
msgstr "Geheugengebruik van docker containers"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Naam"
|
msgstr "Naam"
|
||||||
@@ -517,10 +636,19 @@ msgstr "Netwerkverkeer van docker containers"
|
|||||||
msgid "Network traffic of public interfaces"
|
msgid "Network traffic of public interfaces"
|
||||||
msgstr "Netwerkverkeer van publieke interfaces"
|
msgstr "Netwerkverkeer van publieke interfaces"
|
||||||
|
|
||||||
|
#. Context: Bytes or bits
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Network unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "No results found."
|
msgid "No results found."
|
||||||
msgstr "Geen resultaten gevonden."
|
msgstr "Geen resultaten gevonden."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "No results."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "No systems found."
|
msgid "No systems found."
|
||||||
@@ -558,6 +686,12 @@ msgstr "Overschrijf bestaande waarschuwingen"
|
|||||||
msgid "Page"
|
msgid "Page"
|
||||||
msgstr "Pagina"
|
msgstr "Pagina"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getState().pagination.pageIndex + 1
|
||||||
|
#. placeholder {1}: table.getPageCount()
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Page {0} of {1}"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "Pages / Settings"
|
msgid "Pages / Settings"
|
||||||
msgstr "Pagina's / Instellingen"
|
msgstr "Pagina's / Instellingen"
|
||||||
@@ -639,13 +773,12 @@ msgid "Public Key"
|
|||||||
msgstr "Publieke sleutel"
|
msgstr "Publieke sleutel"
|
||||||
|
|
||||||
#. Disk read
|
#. Disk read
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Read"
|
msgid "Read"
|
||||||
msgstr "Lezen"
|
msgstr "Lezen"
|
||||||
|
|
||||||
#. Network bytes received (download)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Received"
|
msgid "Received"
|
||||||
msgstr "Ontvangen"
|
msgstr "Ontvangen"
|
||||||
|
|
||||||
@@ -653,12 +786,22 @@ msgstr "Ontvangen"
|
|||||||
msgid "Reset Password"
|
msgid "Reset Password"
|
||||||
msgstr "Wachtwoord resetten"
|
msgstr "Wachtwoord resetten"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Resolved"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Resume"
|
msgid "Resume"
|
||||||
msgstr "Hervatten"
|
msgstr "Hervatten"
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Rotate token"
|
msgid "Rotate token"
|
||||||
|
msgstr "Roteer Token"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Rows per page"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
@@ -686,8 +829,7 @@ msgstr "Zoek naar systemen of instellingen..."
|
|||||||
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
||||||
msgstr "Zie <0>notificatie-instellingen</0> om te configureren hoe je meldingen ontvangt."
|
msgstr "Zie <0>notificatie-instellingen</0> om te configureren hoe je meldingen ontvangt."
|
||||||
|
|
||||||
#. Network bytes sent (upload)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Sent"
|
msgid "Sent"
|
||||||
msgstr "Verzonden"
|
msgstr "Verzonden"
|
||||||
|
|
||||||
@@ -718,6 +860,11 @@ msgstr "SMTP-instellingen"
|
|||||||
msgid "Sort By"
|
msgid "Sort By"
|
||||||
msgstr "Sorteren op"
|
msgstr "Sorteren op"
|
||||||
|
|
||||||
|
#. Context: alert state (active or resolved)
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "State"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr "Status"
|
msgstr "Status"
|
||||||
@@ -733,10 +880,16 @@ msgstr "Swap gebruik"
|
|||||||
#. System theme
|
#. System theme
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Systeem"
|
msgstr "Systeem"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "System load averages over time"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Systems"
|
msgid "Systems"
|
||||||
msgstr "Systemen"
|
msgstr "Systemen"
|
||||||
@@ -759,6 +912,10 @@ msgstr "Temperatuur"
|
|||||||
msgid "Temperature"
|
msgid "Temperature"
|
||||||
msgstr "Temperatuur"
|
msgstr "Temperatuur"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Temperature unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Temperatures of system sensors"
|
msgid "Temperatures of system sensors"
|
||||||
msgstr "Temperatuur van systeem sensoren"
|
msgstr "Temperatuur van systeem sensoren"
|
||||||
@@ -779,6 +936,10 @@ msgstr "Log vervolgens in op de backend en reset het wachtwoord van je gebruiker
|
|||||||
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
||||||
msgstr "Deze actie kan niet ongedaan worden gemaakt. Dit zal alle huidige records voor {name} permanent verwijderen uit de database."
|
msgstr "Deze actie kan niet ongedaan worden gemaakt. Dit zal alle huidige records voor {name} permanent verwijderen uit de database."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "This will permanently delete all selected records from the database."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Throughput of {extraFsName}"
|
msgid "Throughput of {extraFsName}"
|
||||||
msgstr "Doorvoer van {extraFsName}"
|
msgstr "Doorvoer van {extraFsName}"
|
||||||
@@ -801,23 +962,36 @@ msgid "Toggle theme"
|
|||||||
msgstr "Schakel thema"
|
msgstr "Schakel thema"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr ""
|
msgstr "Token"
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
#: src/components/routes/settings/layout.tsx
|
#: src/components/routes/settings/layout.tsx
|
||||||
msgid "Tokens & Fingerprints"
|
msgid "Tokens & Fingerprints"
|
||||||
msgstr ""
|
msgstr "Tokens & Vingerafdrukken"
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Tokens allow agents to connect and register. Fingerprints are stable identifiers unique to each system, set on first connection."
|
msgid "Tokens allow agents to connect and register. Fingerprints are stable identifiers unique to each system, set on first connection."
|
||||||
msgstr ""
|
msgstr "Tokens staan agenten toe om verbinding te maken met en te registreren. Vingerafdrukken zijn stabiele Ids deze zijn uniek voor elk systeem, ingesteld bij eerste verbinding."
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
|
msgstr "Tokens en vingerafdrukken worden gebruikt om WebSocket verbindingen te verifiëren naar de hub."
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 1 minute load average exceeds a threshold"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr "Triggert wanneer de 15 minuten gemiddelde belasting een drempelwaarde overschrijdt"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr "Triggert wanneer de 5 minuten gemiddelde belasting een drempelwaarde overschrijdt"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Triggert wanneer een sensor een drempelwaarde overschrijdt"
|
msgstr "Triggert wanneer een sensor een drempelwaarde overschrijdt"
|
||||||
@@ -842,9 +1016,14 @@ msgstr "Triggert wanneer de status schakelt tussen up en down"
|
|||||||
msgid "Triggers when usage of any disk exceeds a threshold"
|
msgid "Triggers when usage of any disk exceeds a threshold"
|
||||||
msgstr "Triggert wanneer het gebruik van een schijf een drempelwaarde overschrijdt"
|
msgstr "Triggert wanneer het gebruik van een schijf een drempelwaarde overschrijdt"
|
||||||
|
|
||||||
|
#. Temperature / network units
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Unit preferences"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Universal token"
|
msgid "Universal token"
|
||||||
msgstr ""
|
msgstr "Universele token"
|
||||||
|
|
||||||
#. Context: System is up
|
#. Context: System is up
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
@@ -862,7 +1041,8 @@ msgstr "Actief"
|
|||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
msgid "Usage"
|
msgid "Usage"
|
||||||
msgstr "Gebruik"
|
msgstr "Gebruik"
|
||||||
|
|
||||||
@@ -872,7 +1052,6 @@ msgstr "Gebruik van root-partitie"
|
|||||||
|
|
||||||
#: src/components/charts/swap-chart.tsx
|
#: src/components/charts/swap-chart.tsx
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Used"
|
msgid "Used"
|
||||||
msgstr "Gebruikt"
|
msgstr "Gebruikt"
|
||||||
|
|
||||||
@@ -881,10 +1060,18 @@ msgstr "Gebruikt"
|
|||||||
msgid "Users"
|
msgid "Users"
|
||||||
msgstr "Gebruikers"
|
msgstr "Gebruikers"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Value"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "View"
|
msgid "View"
|
||||||
msgstr "Weergave"
|
msgstr "Weergave"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "View your 200 most recent alerts."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Visible Fields"
|
msgid "Visible Fields"
|
||||||
msgstr "Zichtbare kolommen"
|
msgstr "Zichtbare kolommen"
|
||||||
@@ -903,16 +1090,17 @@ msgstr "Webhook / Pushmeldingen"
|
|||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "When enabled, this token allows agents to self-register without prior system creation. Expires after one hour or on hub restart."
|
msgid "When enabled, this token allows agents to self-register without prior system creation. Expires after one hour or on hub restart."
|
||||||
msgstr ""
|
msgstr "Wanneer ingeschakeld kunnen agenten zich met dit token registreren zonder dat er vooraf een systeem aangemaakt hoeft te worden. Het token verloopt na één uur of bij herstart van de hub."
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Windows-commando"
|
msgstr "Windows-commando"
|
||||||
|
|
||||||
#. Disk write
|
#. Disk write
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Write"
|
msgid "Write"
|
||||||
msgstr "Schrijven"
|
msgstr "Schrijven"
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ msgstr ""
|
|||||||
"Language: no\n"
|
"Language: no\n"
|
||||||
"Project-Id-Version: beszel\n"
|
"Project-Id-Version: beszel\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2025-03-06 07:27\n"
|
"PO-Revision-Date: 2025-07-25 22:44\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: Norwegian\n"
|
"Language-Team: Norwegian\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
@@ -23,6 +23,12 @@ msgstr ""
|
|||||||
msgid "{0, plural, one {# day} other {# days}}"
|
msgid "{0, plural, one {# day} other {# days}}"
|
||||||
msgstr "{0, plural, one {# dag} other {# dager}}"
|
msgstr "{0, plural, one {# dag} other {# dager}}"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
|
||||||
|
#. placeholder {1}: table.getFilteredRowModel().rows.length
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "{0} of {1} row(s) selected."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "{hours, plural, one {# hour} other {# hours}}"
|
msgid "{hours, plural, one {# hour} other {# hours}}"
|
||||||
msgstr "{hours, plural, one {# time} other {# timer}}"
|
msgstr "{hours, plural, one {# time} other {# timer}}"
|
||||||
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# time} other {# timer}}"
|
|||||||
msgid "1 hour"
|
msgid "1 hour"
|
||||||
msgstr "1 time"
|
msgstr "1 time"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "1 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "1 week"
|
msgid "1 week"
|
||||||
msgstr "1 uke"
|
msgstr "1 uke"
|
||||||
@@ -39,6 +50,11 @@ msgstr "1 uke"
|
|||||||
msgid "12 hours"
|
msgid "12 hours"
|
||||||
msgstr "12 timer"
|
msgstr "12 timer"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "15 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "24 hours"
|
msgid "24 hours"
|
||||||
msgstr "24 timer"
|
msgstr "24 timer"
|
||||||
@@ -47,12 +63,22 @@ msgstr "24 timer"
|
|||||||
msgid "30 days"
|
msgid "30 days"
|
||||||
msgstr "30 dager"
|
msgstr "30 dager"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "5 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. Table column
|
#. Table column
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "Handlinger"
|
msgstr "Handlinger"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Active"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/home.tsx
|
#: src/components/routes/home.tsx
|
||||||
msgid "Active Alerts"
|
msgid "Active Alerts"
|
||||||
msgstr "Aktive Alarmer"
|
msgstr "Aktive Alarmer"
|
||||||
@@ -86,6 +112,12 @@ msgstr "Admin"
|
|||||||
msgid "Agent"
|
msgid "Agent"
|
||||||
msgstr "Agent"
|
msgstr "Agent"
|
||||||
|
|
||||||
|
#: src/components/command-palette.tsx
|
||||||
|
#: src/components/routes/settings/layout.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Alert History"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
msgid "Alerts"
|
msgid "Alerts"
|
||||||
@@ -100,6 +132,10 @@ msgstr "Alle Systemer"
|
|||||||
msgid "Are you sure you want to delete {name}?"
|
msgid "Are you sure you want to delete {name}?"
|
||||||
msgstr "Er du sikker på at du vil slette {name}?"
|
msgstr "Er du sikker på at du vil slette {name}?"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Are you sure?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Automatic copy requires a secure context."
|
msgid "Automatic copy requires a secure context."
|
||||||
msgstr "Automatisk kopiering krever en sikker kontekst."
|
msgstr "Automatisk kopiering krever en sikker kontekst."
|
||||||
@@ -152,11 +188,22 @@ msgstr "Beszel bruker <0>Shoutrrr</0> for integrering mot populære meldingstjen
|
|||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
msgstr "Binær"
|
msgstr "Binær"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bits (Kbps, Mbps, Gbps)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bytes (KB/s, MB/s, GB/s)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
msgid "Cache / Buffers"
|
msgid "Cache / Buffers"
|
||||||
msgstr "Cache / Buffere"
|
msgstr "Cache / Buffere"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Avbryt"
|
msgstr "Avbryt"
|
||||||
|
|
||||||
@@ -164,6 +211,14 @@ msgstr "Avbryt"
|
|||||||
msgid "Caution - potential data loss"
|
msgid "Caution - potential data loss"
|
||||||
msgstr "Advarsel - potensielt tap av data"
|
msgstr "Advarsel - potensielt tap av data"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Celsius (°C)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Change display units for metrics."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Change general application options."
|
msgid "Change general application options."
|
||||||
msgstr "Endre generelle program-innstillinger."
|
msgstr "Endre generelle program-innstillinger."
|
||||||
@@ -202,7 +257,12 @@ msgstr "Konfigurer hvordan du vil motta alarmvarsler."
|
|||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr "Bekreft passord"
|
msgstr "Bekreft passord"
|
||||||
|
|
||||||
|
#: src/components/routes/home.tsx
|
||||||
|
msgid "Connection is down"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Continue"
|
msgid "Continue"
|
||||||
msgstr "Fortsett"
|
msgstr "Fortsett"
|
||||||
|
|
||||||
@@ -211,11 +271,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Kopiert til utklippstavlen"
|
msgstr "Kopiert til utklippstavlen"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Kopier docker compose"
|
msgstr "Kopier docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Kopier docker run"
|
msgstr "Kopier docker run"
|
||||||
@@ -230,9 +292,14 @@ msgid "Copy host"
|
|||||||
msgstr "Kopier vert"
|
msgstr "Kopier vert"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Kopier Linux-kommando"
|
msgstr "Kopier Linux-kommando"
|
||||||
|
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Copy name"
|
||||||
|
msgstr "Kopier navn"
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Copy text"
|
msgid "Copy text"
|
||||||
msgstr "Kopier tekst"
|
msgstr "Kopier tekst"
|
||||||
@@ -255,7 +322,7 @@ msgstr "CPU"
|
|||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "CPU Usage"
|
msgid "CPU Usage"
|
||||||
msgstr "CPU-bruk"
|
msgstr "CPU-bruk"
|
||||||
|
|
||||||
@@ -263,6 +330,11 @@ msgstr "CPU-bruk"
|
|||||||
msgid "Create account"
|
msgid "Create account"
|
||||||
msgstr "Opprett konto"
|
msgstr "Opprett konto"
|
||||||
|
|
||||||
|
#. Context: date created
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Created"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. Dark theme
|
#. Dark theme
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
@@ -278,6 +350,7 @@ msgid "Default time period"
|
|||||||
msgstr "Standard tidsperiode"
|
msgstr "Standard tidsperiode"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Slett"
|
msgstr "Slett"
|
||||||
|
|
||||||
@@ -293,6 +366,10 @@ msgstr "Disk"
|
|||||||
msgid "Disk I/O"
|
msgid "Disk I/O"
|
||||||
msgstr "Disk I/O"
|
msgstr "Disk I/O"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Disk unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/disk-chart.tsx
|
#: src/components/charts/disk-chart.tsx
|
||||||
@@ -321,11 +398,16 @@ msgstr "Dokumentasjon"
|
|||||||
|
|
||||||
#. Context: System is down
|
#. Context: System is down
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Down"
|
msgid "Down"
|
||||||
msgstr "Nede"
|
msgstr "Nede"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Duration"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
@@ -351,6 +433,7 @@ msgstr "Skriv inn e-postadresse..."
|
|||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
#: src/components/login/auth-form.tsx
|
#: src/components/login/auth-form.tsx
|
||||||
msgid "Error"
|
msgid "Error"
|
||||||
msgstr "Feil"
|
msgstr "Feil"
|
||||||
@@ -366,6 +449,10 @@ msgstr "Overstiger {0}{1} {2, plural, one {det siste minuttet} other {de siste #
|
|||||||
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
||||||
msgstr "Eksisterende systemer som ikke er er definert i <0>config.yml</0> vil bli slettet. Vennligst ta jevnlige sikkerhetskopier."
|
msgstr "Eksisterende systemer som ikke er er definert i <0>config.yml</0> vil bli slettet. Vennligst ta jevnlige sikkerhetskopier."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Export"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
msgid "Export configuration"
|
msgid "Export configuration"
|
||||||
msgstr "Eksporter konfigurasjon"
|
msgstr "Eksporter konfigurasjon"
|
||||||
@@ -374,6 +461,10 @@ msgstr "Eksporter konfigurasjon"
|
|||||||
msgid "Export your current systems configuration."
|
msgid "Export your current systems configuration."
|
||||||
msgstr "Eksporter din nåværende systemkonfigurasjon"
|
msgstr "Eksporter din nåværende systemkonfigurasjon"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Fahrenheit (°F)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Failed to authenticate"
|
msgid "Failed to authenticate"
|
||||||
msgstr "Autentisering mislyktes"
|
msgstr "Autentisering mislyktes"
|
||||||
@@ -393,9 +484,14 @@ msgstr "Kunne ikke oppdatere alarm"
|
|||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Filter..."
|
msgstr "Filter..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "I <0>{min}</0> {min, plural, one {minutt} other {minutter}}"
|
msgstr "I <0>{min}</0> {min, plural, one {minutt} other {minutter}}"
|
||||||
@@ -419,6 +515,7 @@ msgid "Grid"
|
|||||||
msgstr "Rutenett"
|
msgstr "Rutenett"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Homebrew-kommando"
|
msgstr "Homebrew-kommando"
|
||||||
@@ -453,6 +550,27 @@ msgstr "Layout"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Lyst"
|
msgstr "Lyst"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "Load Average"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 1m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Short label for load average
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Load Avg"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Logg Ut"
|
msgstr "Logg Ut"
|
||||||
@@ -501,6 +619,7 @@ msgstr "Minnebruk"
|
|||||||
msgid "Memory usage of docker containers"
|
msgid "Memory usage of docker containers"
|
||||||
msgstr "Minnebruk av docker-konteinere"
|
msgstr "Minnebruk av docker-konteinere"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Navn"
|
msgstr "Navn"
|
||||||
@@ -517,10 +636,19 @@ msgstr "Nettverkstrafikk av docker-konteinere"
|
|||||||
msgid "Network traffic of public interfaces"
|
msgid "Network traffic of public interfaces"
|
||||||
msgstr "Nettverkstrafikk av eksterne nettverksgrensesnitt"
|
msgstr "Nettverkstrafikk av eksterne nettverksgrensesnitt"
|
||||||
|
|
||||||
|
#. Context: Bytes or bits
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Network unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "No results found."
|
msgid "No results found."
|
||||||
msgstr "Ingen resultater funnet."
|
msgstr "Ingen resultater funnet."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "No results."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "No systems found."
|
msgid "No systems found."
|
||||||
@@ -558,6 +686,12 @@ msgstr "Overskriv eksisterende alarmer"
|
|||||||
msgid "Page"
|
msgid "Page"
|
||||||
msgstr "Side"
|
msgstr "Side"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getState().pagination.pageIndex + 1
|
||||||
|
#. placeholder {1}: table.getPageCount()
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Page {0} of {1}"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "Pages / Settings"
|
msgid "Pages / Settings"
|
||||||
msgstr "Sider / Innstillinger"
|
msgstr "Sider / Innstillinger"
|
||||||
@@ -585,7 +719,7 @@ msgstr "Pause"
|
|||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Paused"
|
msgid "Paused"
|
||||||
msgstr "Pauset"
|
msgstr "Satt på Pause"
|
||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
|
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
|
||||||
@@ -639,13 +773,12 @@ msgid "Public Key"
|
|||||||
msgstr "Offentlig Nøkkel"
|
msgstr "Offentlig Nøkkel"
|
||||||
|
|
||||||
#. Disk read
|
#. Disk read
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Read"
|
msgid "Read"
|
||||||
msgstr "Lesing"
|
msgstr "Lesing"
|
||||||
|
|
||||||
#. Network bytes received (download)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Received"
|
msgid "Received"
|
||||||
msgstr "Mottatt"
|
msgstr "Mottatt"
|
||||||
|
|
||||||
@@ -653,6 +786,12 @@ msgstr "Mottatt"
|
|||||||
msgid "Reset Password"
|
msgid "Reset Password"
|
||||||
msgstr "Nullstill Passord"
|
msgstr "Nullstill Passord"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Resolved"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Resume"
|
msgid "Resume"
|
||||||
msgstr "Gjenoppta"
|
msgstr "Gjenoppta"
|
||||||
@@ -661,6 +800,10 @@ msgstr "Gjenoppta"
|
|||||||
msgid "Rotate token"
|
msgid "Rotate token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Rows per page"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
||||||
msgstr "Lagre adressen med Enter-tasten eller komma. La feltet være tomt for å deaktivere e-postvarsler."
|
msgstr "Lagre adressen med Enter-tasten eller komma. La feltet være tomt for å deaktivere e-postvarsler."
|
||||||
@@ -686,8 +829,7 @@ msgstr "Søk etter systemer eller innstillinger..."
|
|||||||
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
||||||
msgstr "Se <0>varslingsinnstillingene</0> for å konfigurere hvordan du vil motta varsler."
|
msgstr "Se <0>varslingsinnstillingene</0> for å konfigurere hvordan du vil motta varsler."
|
||||||
|
|
||||||
#. Network bytes sent (upload)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Sent"
|
msgid "Sent"
|
||||||
msgstr "Sendt"
|
msgstr "Sendt"
|
||||||
|
|
||||||
@@ -718,6 +860,11 @@ msgstr "SMTP-innstillinger"
|
|||||||
msgid "Sort By"
|
msgid "Sort By"
|
||||||
msgstr "Sorter Etter"
|
msgstr "Sorter Etter"
|
||||||
|
|
||||||
|
#. Context: alert state (active or resolved)
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "State"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr "Status"
|
msgstr "Status"
|
||||||
@@ -733,10 +880,16 @@ msgstr "Swap-bruk"
|
|||||||
#. System theme
|
#. System theme
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "System"
|
msgstr "System"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "System load averages over time"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Systems"
|
msgid "Systems"
|
||||||
msgstr "Systemer"
|
msgstr "Systemer"
|
||||||
@@ -759,6 +912,10 @@ msgstr "Temp"
|
|||||||
msgid "Temperature"
|
msgid "Temperature"
|
||||||
msgstr "Temperatur"
|
msgstr "Temperatur"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Temperature unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Temperatures of system sensors"
|
msgid "Temperatures of system sensors"
|
||||||
msgstr "Temperaturer på system-sensorer"
|
msgstr "Temperaturer på system-sensorer"
|
||||||
@@ -779,6 +936,10 @@ msgstr "Logg deretter inn i backend og nullstill passordet på din konto i users
|
|||||||
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
||||||
msgstr "Denne handlingen kan ikke omgjøres. Dette vil slette alle poster for {name} permanent fra databasen."
|
msgstr "Denne handlingen kan ikke omgjøres. Dette vil slette alle poster for {name} permanent fra databasen."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "This will permanently delete all selected records from the database."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Throughput of {extraFsName}"
|
msgid "Throughput of {extraFsName}"
|
||||||
msgstr "Gjennomstrømning av {extraFsName}"
|
msgstr "Gjennomstrømning av {extraFsName}"
|
||||||
@@ -801,6 +962,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Tema av/på"
|
msgstr "Tema av/på"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -818,6 +980,18 @@ msgstr ""
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 1 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Slår inn når enhver sensor overstiger en grenseverdi"
|
msgstr "Slår inn når enhver sensor overstiger en grenseverdi"
|
||||||
@@ -842,6 +1016,11 @@ msgstr "Slår inn når statusen veksler mellom oppe og nede"
|
|||||||
msgid "Triggers when usage of any disk exceeds a threshold"
|
msgid "Triggers when usage of any disk exceeds a threshold"
|
||||||
msgstr "Slår inn når forbruk av hvilken som helst disk overstiger en grenseverdi"
|
msgstr "Slår inn når forbruk av hvilken som helst disk overstiger en grenseverdi"
|
||||||
|
|
||||||
|
#. Temperature / network units
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Unit preferences"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Universal token"
|
msgid "Universal token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -862,7 +1041,8 @@ msgstr "Oppetid"
|
|||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
msgid "Usage"
|
msgid "Usage"
|
||||||
msgstr "Forbruk"
|
msgstr "Forbruk"
|
||||||
|
|
||||||
@@ -872,7 +1052,6 @@ msgstr "Forbruk av rot-partisjon"
|
|||||||
|
|
||||||
#: src/components/charts/swap-chart.tsx
|
#: src/components/charts/swap-chart.tsx
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Used"
|
msgid "Used"
|
||||||
msgstr "Brukt"
|
msgstr "Brukt"
|
||||||
|
|
||||||
@@ -881,10 +1060,18 @@ msgstr "Brukt"
|
|||||||
msgid "Users"
|
msgid "Users"
|
||||||
msgstr "Brukere"
|
msgstr "Brukere"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Value"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "View"
|
msgid "View"
|
||||||
msgstr "Visning"
|
msgstr "Visning"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "View your 200 most recent alerts."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Visible Fields"
|
msgid "Visible Fields"
|
||||||
msgstr "Synlige Felter"
|
msgstr "Synlige Felter"
|
||||||
@@ -906,13 +1093,14 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Windows-kommando"
|
msgstr "Windows-kommando"
|
||||||
|
|
||||||
#. Disk write
|
#. Disk write
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Write"
|
msgid "Write"
|
||||||
msgstr "Skriving"
|
msgstr "Skriving"
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ msgstr ""
|
|||||||
"Language: pl\n"
|
"Language: pl\n"
|
||||||
"Project-Id-Version: beszel\n"
|
"Project-Id-Version: beszel\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2025-03-06 07:27\n"
|
"PO-Revision-Date: 2025-07-25 22:44\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: Polish\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"
|
"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"
|
||||||
@@ -23,6 +23,12 @@ msgstr ""
|
|||||||
msgid "{0, plural, one {# day} other {# days}}"
|
msgid "{0, plural, one {# day} other {# days}}"
|
||||||
msgstr "{0, plural, one {# dzień} few {# dni} many {# dni} other {# dni}}"
|
msgstr "{0, plural, one {# dzień} few {# dni} many {# dni} other {# dni}}"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
|
||||||
|
#. placeholder {1}: table.getFilteredRowModel().rows.length
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "{0} of {1} row(s) selected."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "{hours, plural, one {# hour} other {# hours}}"
|
msgid "{hours, plural, one {# hour} other {# hours}}"
|
||||||
msgstr "{hours, plural, one {godzinę} few {# godziny} many {# godzin} other {# godziny}}"
|
msgstr "{hours, plural, one {godzinę} few {# godziny} many {# godzin} other {# godziny}}"
|
||||||
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {godzinę} few {# godziny} many {# godzin} other {#
|
|||||||
msgid "1 hour"
|
msgid "1 hour"
|
||||||
msgstr "1 godzina"
|
msgstr "1 godzina"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "1 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "1 week"
|
msgid "1 week"
|
||||||
msgstr "1 tydzień"
|
msgstr "1 tydzień"
|
||||||
@@ -39,6 +50,11 @@ msgstr "1 tydzień"
|
|||||||
msgid "12 hours"
|
msgid "12 hours"
|
||||||
msgstr "12 godzin"
|
msgstr "12 godzin"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "15 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "24 hours"
|
msgid "24 hours"
|
||||||
msgstr "24 godziny"
|
msgstr "24 godziny"
|
||||||
@@ -47,12 +63,22 @@ msgstr "24 godziny"
|
|||||||
msgid "30 days"
|
msgid "30 days"
|
||||||
msgstr "30 dni"
|
msgstr "30 dni"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "5 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. Table column
|
#. Table column
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "Akcje"
|
msgstr "Akcje"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Active"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/home.tsx
|
#: src/components/routes/home.tsx
|
||||||
msgid "Active Alerts"
|
msgid "Active Alerts"
|
||||||
msgstr "Aktywne alerty"
|
msgstr "Aktywne alerty"
|
||||||
@@ -86,6 +112,12 @@ msgstr "Admin"
|
|||||||
msgid "Agent"
|
msgid "Agent"
|
||||||
msgstr "Agent"
|
msgstr "Agent"
|
||||||
|
|
||||||
|
#: src/components/command-palette.tsx
|
||||||
|
#: src/components/routes/settings/layout.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Alert History"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
msgid "Alerts"
|
msgid "Alerts"
|
||||||
@@ -100,6 +132,10 @@ msgstr "Wszystkie systemy"
|
|||||||
msgid "Are you sure you want to delete {name}?"
|
msgid "Are you sure you want to delete {name}?"
|
||||||
msgstr "Czy na pewno chcesz usunąć {name}?"
|
msgstr "Czy na pewno chcesz usunąć {name}?"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Are you sure?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Automatic copy requires a secure context."
|
msgid "Automatic copy requires a secure context."
|
||||||
msgstr "Automatyczne kopiowanie wymaga bezpiecznego kontekstu."
|
msgstr "Automatyczne kopiowanie wymaga bezpiecznego kontekstu."
|
||||||
@@ -152,11 +188,22 @@ msgstr "Beszel używa <0>Shoutrrr</0> do integracji z popularnych serwisami powi
|
|||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
msgstr "Plik binarny"
|
msgstr "Plik binarny"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bits (Kbps, Mbps, Gbps)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bytes (KB/s, MB/s, GB/s)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
msgid "Cache / Buffers"
|
msgid "Cache / Buffers"
|
||||||
msgstr "Pamięć podręczna / Bufory"
|
msgstr "Pamięć podręczna / Bufory"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Anuluj"
|
msgstr "Anuluj"
|
||||||
|
|
||||||
@@ -164,6 +211,14 @@ msgstr "Anuluj"
|
|||||||
msgid "Caution - potential data loss"
|
msgid "Caution - potential data loss"
|
||||||
msgstr "Uwaga- potencjalna utrata danych."
|
msgstr "Uwaga- potencjalna utrata danych."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Celsius (°C)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Change display units for metrics."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Change general application options."
|
msgid "Change general application options."
|
||||||
msgstr "Zmiana ogólnych ustawień aplikacji."
|
msgstr "Zmiana ogólnych ustawień aplikacji."
|
||||||
@@ -202,7 +257,12 @@ msgstr "Skonfiguruj sposób otrzymywania powiadomień."
|
|||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr "Potwierdź hasło"
|
msgstr "Potwierdź hasło"
|
||||||
|
|
||||||
|
#: src/components/routes/home.tsx
|
||||||
|
msgid "Connection is down"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Continue"
|
msgid "Continue"
|
||||||
msgstr "Kontynuuj"
|
msgstr "Kontynuuj"
|
||||||
|
|
||||||
@@ -211,11 +271,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Skopiowano do schowka"
|
msgstr "Skopiowano do schowka"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Skopiuj docker compose"
|
msgstr "Skopiuj docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Skopiuj docker run"
|
msgstr "Skopiuj docker run"
|
||||||
@@ -230,9 +292,14 @@ msgid "Copy host"
|
|||||||
msgstr "Kopiuj host"
|
msgstr "Kopiuj host"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Kopiuj polecenie Linux"
|
msgstr "Kopiuj polecenie Linux"
|
||||||
|
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Copy name"
|
||||||
|
msgstr "Kopiuj nazwę"
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Copy text"
|
msgid "Copy text"
|
||||||
msgstr "Kopiuj tekst"
|
msgstr "Kopiuj tekst"
|
||||||
@@ -255,7 +322,7 @@ msgstr "Procesor"
|
|||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "CPU Usage"
|
msgid "CPU Usage"
|
||||||
msgstr "Użycie procesora"
|
msgstr "Użycie procesora"
|
||||||
|
|
||||||
@@ -263,6 +330,11 @@ msgstr "Użycie procesora"
|
|||||||
msgid "Create account"
|
msgid "Create account"
|
||||||
msgstr "Utwórz konto"
|
msgstr "Utwórz konto"
|
||||||
|
|
||||||
|
#. Context: date created
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Created"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. Dark theme
|
#. Dark theme
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
@@ -278,6 +350,7 @@ msgid "Default time period"
|
|||||||
msgstr "Domyślny przedział czasu"
|
msgstr "Domyślny przedział czasu"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Usuń"
|
msgstr "Usuń"
|
||||||
|
|
||||||
@@ -293,6 +366,10 @@ msgstr "Dysk"
|
|||||||
msgid "Disk I/O"
|
msgid "Disk I/O"
|
||||||
msgstr "Dysk I/O"
|
msgstr "Dysk I/O"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Disk unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/disk-chart.tsx
|
#: src/components/charts/disk-chart.tsx
|
||||||
@@ -321,15 +398,20 @@ msgstr "Dokumentacja"
|
|||||||
|
|
||||||
#. Context: System is down
|
#. Context: System is down
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Down"
|
msgid "Down"
|
||||||
|
msgstr "Nie działa"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Duration"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
msgstr ""
|
msgstr "Edytuj"
|
||||||
|
|
||||||
#: src/components/login/forgot-pass-form.tsx
|
#: src/components/login/forgot-pass-form.tsx
|
||||||
#: src/components/login/auth-form.tsx
|
#: src/components/login/auth-form.tsx
|
||||||
@@ -351,6 +433,7 @@ msgstr "Wprowadź adres e-mail..."
|
|||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
#: src/components/login/auth-form.tsx
|
#: src/components/login/auth-form.tsx
|
||||||
msgid "Error"
|
msgid "Error"
|
||||||
msgstr "Błąd"
|
msgstr "Błąd"
|
||||||
@@ -366,6 +449,10 @@ msgstr "Przekracza {0}{1} w ciągu ostatnich {2, plural, one {# minuty} other {#
|
|||||||
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
||||||
msgstr "Istniejące systemy, które nie są zdefiniowane w <0>config.yml</0>, zostaną usunięte. Proszę regularnie tworzyć kopie zapasowe."
|
msgstr "Istniejące systemy, które nie są zdefiniowane w <0>config.yml</0>, zostaną usunięte. Proszę regularnie tworzyć kopie zapasowe."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Export"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
msgid "Export configuration"
|
msgid "Export configuration"
|
||||||
msgstr "Eksportuj konfigurację"
|
msgstr "Eksportuj konfigurację"
|
||||||
@@ -374,6 +461,10 @@ msgstr "Eksportuj konfigurację"
|
|||||||
msgid "Export your current systems configuration."
|
msgid "Export your current systems configuration."
|
||||||
msgstr "Eksportuj aktualną konfigurację systemów."
|
msgstr "Eksportuj aktualną konfigurację systemów."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Fahrenheit (°F)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Failed to authenticate"
|
msgid "Failed to authenticate"
|
||||||
msgstr "Błąd autoryzacji"
|
msgstr "Błąd autoryzacji"
|
||||||
@@ -393,9 +484,14 @@ msgstr "Nie udało się zaktualizować powiadomienia"
|
|||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Filtruj..."
|
msgstr "Filtruj..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "Na <0>{min}</0> {min, plural, one {minutę} other {minut}}"
|
msgstr "Na <0>{min}</0> {min, plural, one {minutę} other {minut}}"
|
||||||
@@ -419,6 +515,7 @@ msgid "Grid"
|
|||||||
msgstr "Siatka"
|
msgstr "Siatka"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Polecenie Homebrew"
|
msgstr "Polecenie Homebrew"
|
||||||
@@ -453,6 +550,27 @@ msgstr "Układ"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Jasny"
|
msgstr "Jasny"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "Load Average"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 1m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Short label for load average
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Load Avg"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Wyloguj"
|
msgstr "Wyloguj"
|
||||||
@@ -481,7 +599,7 @@ msgstr "Zarządzaj preferencjami wyświetlania i powiadomień."
|
|||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Manual setup instructions"
|
msgid "Manual setup instructions"
|
||||||
msgstr ""
|
msgstr "Instrukcja ręcznej konfiguracji"
|
||||||
|
|
||||||
#. Chart select field. Please try to keep this short.
|
#. Chart select field. Please try to keep this short.
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
@@ -501,6 +619,7 @@ msgstr "Wykorzystanie pamięci"
|
|||||||
msgid "Memory usage of docker containers"
|
msgid "Memory usage of docker containers"
|
||||||
msgstr "Użycie pamięci przez kontenery Docker."
|
msgstr "Użycie pamięci przez kontenery Docker."
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Nazwa"
|
msgstr "Nazwa"
|
||||||
@@ -517,10 +636,19 @@ msgstr "Ruch sieciowy kontenerów Docker."
|
|||||||
msgid "Network traffic of public interfaces"
|
msgid "Network traffic of public interfaces"
|
||||||
msgstr "Ruch sieciowy interfejsów publicznych"
|
msgstr "Ruch sieciowy interfejsów publicznych"
|
||||||
|
|
||||||
|
#. Context: Bytes or bits
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Network unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "No results found."
|
msgid "No results found."
|
||||||
msgstr "Brak wyników."
|
msgstr "Brak wyników."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "No results."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "No systems found."
|
msgid "No systems found."
|
||||||
@@ -558,6 +686,12 @@ msgstr "Nadpisz istniejące alerty"
|
|||||||
msgid "Page"
|
msgid "Page"
|
||||||
msgstr "Strona"
|
msgstr "Strona"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getState().pagination.pageIndex + 1
|
||||||
|
#. placeholder {1}: table.getPageCount()
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Page {0} of {1}"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "Pages / Settings"
|
msgid "Pages / Settings"
|
||||||
msgstr "Strony / Ustawienia"
|
msgstr "Strony / Ustawienia"
|
||||||
@@ -573,7 +707,7 @@ msgstr "Hasło musi mieć co najmniej 8 znaków."
|
|||||||
|
|
||||||
#: src/components/login/auth-form.tsx
|
#: src/components/login/auth-form.tsx
|
||||||
msgid "Password must be less than 72 bytes."
|
msgid "Password must be less than 72 bytes."
|
||||||
msgstr ""
|
msgstr "Hasło musi być mniejsze niż 72 bajty."
|
||||||
|
|
||||||
#: src/components/login/forgot-pass-form.tsx
|
#: src/components/login/forgot-pass-form.tsx
|
||||||
msgid "Password reset request received"
|
msgid "Password reset request received"
|
||||||
@@ -639,13 +773,12 @@ msgid "Public Key"
|
|||||||
msgstr "Klucz publiczny"
|
msgstr "Klucz publiczny"
|
||||||
|
|
||||||
#. Disk read
|
#. Disk read
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Read"
|
msgid "Read"
|
||||||
msgstr "Czytaj"
|
msgstr "Czytaj"
|
||||||
|
|
||||||
#. Network bytes received (download)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Received"
|
msgid "Received"
|
||||||
msgstr "Otrzymane"
|
msgstr "Otrzymane"
|
||||||
|
|
||||||
@@ -653,6 +786,12 @@ msgstr "Otrzymane"
|
|||||||
msgid "Reset Password"
|
msgid "Reset Password"
|
||||||
msgstr "Resetuj hasło"
|
msgstr "Resetuj hasło"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Resolved"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Resume"
|
msgid "Resume"
|
||||||
msgstr "Wznów"
|
msgstr "Wznów"
|
||||||
@@ -661,6 +800,10 @@ msgstr "Wznów"
|
|||||||
msgid "Rotate token"
|
msgid "Rotate token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Rows per page"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
||||||
msgstr "Zapisz adres, używając klawisza enter lub przecinka. Pozostaw puste, aby wyłączyć powiadomienia e-mail."
|
msgstr "Zapisz adres, używając klawisza enter lub przecinka. Pozostaw puste, aby wyłączyć powiadomienia e-mail."
|
||||||
@@ -672,7 +815,7 @@ msgstr "Zapisz ustawienia"
|
|||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Save system"
|
msgid "Save system"
|
||||||
msgstr ""
|
msgstr "Zapisz system"
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
@@ -686,8 +829,7 @@ msgstr "Szukaj systemów lub ustawień..."
|
|||||||
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
||||||
msgstr "Zobacz <0>ustawienia powiadomień</0>, aby skonfigurować sposób, w jaki otrzymujesz powiadomienia."
|
msgstr "Zobacz <0>ustawienia powiadomień</0>, aby skonfigurować sposób, w jaki otrzymujesz powiadomienia."
|
||||||
|
|
||||||
#. Network bytes sent (upload)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Sent"
|
msgid "Sent"
|
||||||
msgstr "Wysłane"
|
msgstr "Wysłane"
|
||||||
|
|
||||||
@@ -718,6 +860,11 @@ msgstr "Ustawienia SMTP"
|
|||||||
msgid "Sort By"
|
msgid "Sort By"
|
||||||
msgstr "Sortuj według"
|
msgstr "Sortuj według"
|
||||||
|
|
||||||
|
#. Context: alert state (active or resolved)
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "State"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr "Status"
|
msgstr "Status"
|
||||||
@@ -733,10 +880,16 @@ msgstr "Użycie pamięci wymiany"
|
|||||||
#. System theme
|
#. System theme
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "System"
|
msgstr "System"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "System load averages over time"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Systems"
|
msgid "Systems"
|
||||||
msgstr "Systemy"
|
msgstr "Systemy"
|
||||||
@@ -752,13 +905,17 @@ msgstr "Tabela"
|
|||||||
#. Temperature label in systems table
|
#. Temperature label in systems table
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Temp"
|
msgid "Temp"
|
||||||
msgstr ""
|
msgstr "Temperatura"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Temperature"
|
msgid "Temperature"
|
||||||
msgstr "Temperatura"
|
msgstr "Temperatura"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Temperature unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Temperatures of system sensors"
|
msgid "Temperatures of system sensors"
|
||||||
msgstr "Temperatury czujników systemowych."
|
msgstr "Temperatury czujników systemowych."
|
||||||
@@ -779,6 +936,10 @@ msgstr "Następnie zaloguj się do panelu administracyjnego i zresetuj hasło d
|
|||||||
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
||||||
msgstr "Tej akcji nie można cofnąć. Spowoduje to trwałe usunięcie wszystkich bieżących rekordów dla {name} z bazy danych."
|
msgstr "Tej akcji nie można cofnąć. Spowoduje to trwałe usunięcie wszystkich bieżących rekordów dla {name} z bazy danych."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "This will permanently delete all selected records from the database."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Throughput of {extraFsName}"
|
msgid "Throughput of {extraFsName}"
|
||||||
msgstr "Przepustowość {extraFsName}"
|
msgstr "Przepustowość {extraFsName}"
|
||||||
@@ -801,6 +962,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Zmień motyw"
|
msgstr "Zmień motyw"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -818,6 +980,18 @@ msgstr ""
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 1 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Wyzwalane, gdy jakikolwiek czujnik przekroczy ustalony próg."
|
msgstr "Wyzwalane, gdy jakikolwiek czujnik przekroczy ustalony próg."
|
||||||
@@ -842,6 +1016,11 @@ msgstr "Wyzwalane, gdy status przełącza się między stanem aktywnym a nieakty
|
|||||||
msgid "Triggers when usage of any disk exceeds a threshold"
|
msgid "Triggers when usage of any disk exceeds a threshold"
|
||||||
msgstr "Wyzwalane, gdy wykorzystanie któregokolwiek dysku przekroczy ustalony próg"
|
msgstr "Wyzwalane, gdy wykorzystanie któregokolwiek dysku przekroczy ustalony próg"
|
||||||
|
|
||||||
|
#. Temperature / network units
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Unit preferences"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Universal token"
|
msgid "Universal token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -850,7 +1029,7 @@ msgstr ""
|
|||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Up"
|
msgid "Up"
|
||||||
msgstr ""
|
msgstr "Działa"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Updated in real time. Click on a system to view information."
|
msgid "Updated in real time. Click on a system to view information."
|
||||||
@@ -862,7 +1041,8 @@ msgstr "Czas pracy"
|
|||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
msgid "Usage"
|
msgid "Usage"
|
||||||
msgstr "Wykorzystanie"
|
msgstr "Wykorzystanie"
|
||||||
|
|
||||||
@@ -872,7 +1052,6 @@ msgstr "Użycie partycji głównej"
|
|||||||
|
|
||||||
#: src/components/charts/swap-chart.tsx
|
#: src/components/charts/swap-chart.tsx
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Used"
|
msgid "Used"
|
||||||
msgstr "Używane"
|
msgstr "Używane"
|
||||||
|
|
||||||
@@ -881,10 +1060,18 @@ msgstr "Używane"
|
|||||||
msgid "Users"
|
msgid "Users"
|
||||||
msgstr "Użytkownicy"
|
msgstr "Użytkownicy"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Value"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "View"
|
msgid "View"
|
||||||
msgstr "Widok"
|
msgstr "Widok"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "View your 200 most recent alerts."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Visible Fields"
|
msgid "Visible Fields"
|
||||||
msgstr "Widoczne kolumny"
|
msgstr "Widoczne kolumny"
|
||||||
@@ -906,13 +1093,14 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Polecenie Windows"
|
msgstr "Polecenie Windows"
|
||||||
|
|
||||||
#. Disk write
|
#. Disk write
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Write"
|
msgid "Write"
|
||||||
msgstr "Napisz"
|
msgstr "Napisz"
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ msgstr ""
|
|||||||
"Language: pt\n"
|
"Language: pt\n"
|
||||||
"Project-Id-Version: beszel\n"
|
"Project-Id-Version: beszel\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2025-03-06 07:27\n"
|
"PO-Revision-Date: 2025-07-25 22:44\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: Portuguese\n"
|
"Language-Team: Portuguese\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
@@ -23,6 +23,12 @@ msgstr ""
|
|||||||
msgid "{0, plural, one {# day} other {# days}}"
|
msgid "{0, plural, one {# day} other {# days}}"
|
||||||
msgstr "{0, plural, one {# dia} other {# dias}}"
|
msgstr "{0, plural, one {# dia} other {# dias}}"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
|
||||||
|
#. placeholder {1}: table.getFilteredRowModel().rows.length
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "{0} of {1} row(s) selected."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "{hours, plural, one {# hour} other {# hours}}"
|
msgid "{hours, plural, one {# hour} other {# hours}}"
|
||||||
msgstr "{hours, plural, one {# hora} other {# horas}}"
|
msgstr "{hours, plural, one {# hora} other {# horas}}"
|
||||||
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# hora} other {# horas}}"
|
|||||||
msgid "1 hour"
|
msgid "1 hour"
|
||||||
msgstr "1 hora"
|
msgstr "1 hora"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "1 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "1 week"
|
msgid "1 week"
|
||||||
msgstr "1 semana"
|
msgstr "1 semana"
|
||||||
@@ -39,6 +50,11 @@ msgstr "1 semana"
|
|||||||
msgid "12 hours"
|
msgid "12 hours"
|
||||||
msgstr "12 horas"
|
msgstr "12 horas"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "15 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "24 hours"
|
msgid "24 hours"
|
||||||
msgstr "24 horas"
|
msgstr "24 horas"
|
||||||
@@ -47,12 +63,22 @@ msgstr "24 horas"
|
|||||||
msgid "30 days"
|
msgid "30 days"
|
||||||
msgstr "30 dias"
|
msgstr "30 dias"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "5 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. Table column
|
#. Table column
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "Ações"
|
msgstr "Ações"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Active"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/home.tsx
|
#: src/components/routes/home.tsx
|
||||||
msgid "Active Alerts"
|
msgid "Active Alerts"
|
||||||
msgstr "Alertas Ativos"
|
msgstr "Alertas Ativos"
|
||||||
@@ -86,6 +112,12 @@ msgstr "Admin"
|
|||||||
msgid "Agent"
|
msgid "Agent"
|
||||||
msgstr "Agente"
|
msgstr "Agente"
|
||||||
|
|
||||||
|
#: src/components/command-palette.tsx
|
||||||
|
#: src/components/routes/settings/layout.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Alert History"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
msgid "Alerts"
|
msgid "Alerts"
|
||||||
@@ -100,6 +132,10 @@ msgstr "Todos os Sistemas"
|
|||||||
msgid "Are you sure you want to delete {name}?"
|
msgid "Are you sure you want to delete {name}?"
|
||||||
msgstr "Tem certeza de que deseja excluir {name}?"
|
msgstr "Tem certeza de que deseja excluir {name}?"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Are you sure?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Automatic copy requires a secure context."
|
msgid "Automatic copy requires a secure context."
|
||||||
msgstr "A cópia automática requer um contexto seguro."
|
msgstr "A cópia automática requer um contexto seguro."
|
||||||
@@ -152,11 +188,22 @@ msgstr "Beszel usa <0>Shoutrrr</0> para integrar com serviços de notificação
|
|||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
msgstr "Binário"
|
msgstr "Binário"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bits (Kbps, Mbps, Gbps)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bytes (KB/s, MB/s, GB/s)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
msgid "Cache / Buffers"
|
msgid "Cache / Buffers"
|
||||||
msgstr "Cache / Buffers"
|
msgstr "Cache / Buffers"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Cancelar"
|
msgstr "Cancelar"
|
||||||
|
|
||||||
@@ -164,6 +211,14 @@ msgstr "Cancelar"
|
|||||||
msgid "Caution - potential data loss"
|
msgid "Caution - potential data loss"
|
||||||
msgstr "Cuidado - possível perda de dados"
|
msgstr "Cuidado - possível perda de dados"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Celsius (°C)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Change display units for metrics."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Change general application options."
|
msgid "Change general application options."
|
||||||
msgstr "Alterar opções gerais do aplicativo."
|
msgstr "Alterar opções gerais do aplicativo."
|
||||||
@@ -202,7 +257,12 @@ msgstr "Configure como você recebe notificações de alerta."
|
|||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr "Confirmar senha"
|
msgstr "Confirmar senha"
|
||||||
|
|
||||||
|
#: src/components/routes/home.tsx
|
||||||
|
msgid "Connection is down"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Continue"
|
msgid "Continue"
|
||||||
msgstr "Continuar"
|
msgstr "Continuar"
|
||||||
|
|
||||||
@@ -211,11 +271,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Copiado para a área de transferência"
|
msgstr "Copiado para a área de transferência"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Copiar docker compose"
|
msgstr "Copiar docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Copiar docker run"
|
msgstr "Copiar docker run"
|
||||||
@@ -230,9 +292,14 @@ msgid "Copy host"
|
|||||||
msgstr "Copiar host"
|
msgstr "Copiar host"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Copiar comando Linux"
|
msgstr "Copiar comando Linux"
|
||||||
|
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Copy name"
|
||||||
|
msgstr "Copiar nome"
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Copy text"
|
msgid "Copy text"
|
||||||
msgstr "Copiar texto"
|
msgstr "Copiar texto"
|
||||||
@@ -255,7 +322,7 @@ msgstr "CPU"
|
|||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "CPU Usage"
|
msgid "CPU Usage"
|
||||||
msgstr "Uso de CPU"
|
msgstr "Uso de CPU"
|
||||||
|
|
||||||
@@ -263,6 +330,11 @@ msgstr "Uso de CPU"
|
|||||||
msgid "Create account"
|
msgid "Create account"
|
||||||
msgstr "Criar conta"
|
msgstr "Criar conta"
|
||||||
|
|
||||||
|
#. Context: date created
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Created"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. Dark theme
|
#. Dark theme
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
@@ -278,6 +350,7 @@ msgid "Default time period"
|
|||||||
msgstr "Período de tempo padrão"
|
msgstr "Período de tempo padrão"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Excluir"
|
msgstr "Excluir"
|
||||||
|
|
||||||
@@ -293,6 +366,10 @@ msgstr "Disco"
|
|||||||
msgid "Disk I/O"
|
msgid "Disk I/O"
|
||||||
msgstr "E/S de Disco"
|
msgstr "E/S de Disco"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Disk unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/disk-chart.tsx
|
#: src/components/charts/disk-chart.tsx
|
||||||
@@ -321,9 +398,14 @@ msgstr "Documentação"
|
|||||||
|
|
||||||
#. Context: System is down
|
#. Context: System is down
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Down"
|
msgid "Down"
|
||||||
|
msgstr "“Desligado”"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Duration"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
@@ -351,6 +433,7 @@ msgstr "Digite o endereço de email..."
|
|||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
#: src/components/login/auth-form.tsx
|
#: src/components/login/auth-form.tsx
|
||||||
msgid "Error"
|
msgid "Error"
|
||||||
msgstr "Erro"
|
msgstr "Erro"
|
||||||
@@ -366,6 +449,10 @@ msgstr "Excede {0}{1} no último {2, plural, one {# minuto} other {# minutos}}"
|
|||||||
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
||||||
msgstr "Sistemas existentes não definidos em <0>config.yml</0> serão excluídos. Faça backups regulares."
|
msgstr "Sistemas existentes não definidos em <0>config.yml</0> serão excluídos. Faça backups regulares."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Export"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
msgid "Export configuration"
|
msgid "Export configuration"
|
||||||
msgstr "Exportar configuração"
|
msgstr "Exportar configuração"
|
||||||
@@ -374,6 +461,10 @@ msgstr "Exportar configuração"
|
|||||||
msgid "Export your current systems configuration."
|
msgid "Export your current systems configuration."
|
||||||
msgstr "Exporte a configuração atual dos seus sistemas."
|
msgstr "Exporte a configuração atual dos seus sistemas."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Fahrenheit (°F)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Failed to authenticate"
|
msgid "Failed to authenticate"
|
||||||
msgstr "Falha na autenticação"
|
msgstr "Falha na autenticação"
|
||||||
@@ -393,9 +484,14 @@ msgstr "Falha ao atualizar alerta"
|
|||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Filtrar..."
|
msgstr "Filtrar..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "Por <0>{min}</0> {min, plural, one {minuto} other {minutos}}"
|
msgstr "Por <0>{min}</0> {min, plural, one {minuto} other {minutos}}"
|
||||||
@@ -419,6 +515,7 @@ msgid "Grid"
|
|||||||
msgstr "Grade"
|
msgstr "Grade"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Comando Homebrew"
|
msgstr "Comando Homebrew"
|
||||||
@@ -453,6 +550,27 @@ msgstr "Aspeto"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Claro"
|
msgstr "Claro"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "Load Average"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 1m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Short label for load average
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Load Avg"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Sair"
|
msgstr "Sair"
|
||||||
@@ -481,7 +599,7 @@ msgstr "Gerenciar preferências de exibição e notificação."
|
|||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Manual setup instructions"
|
msgid "Manual setup instructions"
|
||||||
msgstr ""
|
msgstr "Instruções de configuração manual"
|
||||||
|
|
||||||
#. Chart select field. Please try to keep this short.
|
#. Chart select field. Please try to keep this short.
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
@@ -501,6 +619,7 @@ msgstr "Uso de Memória"
|
|||||||
msgid "Memory usage of docker containers"
|
msgid "Memory usage of docker containers"
|
||||||
msgstr "Uso de memória dos contêineres Docker"
|
msgstr "Uso de memória dos contêineres Docker"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Nome"
|
msgstr "Nome"
|
||||||
@@ -517,10 +636,19 @@ msgstr "Tráfego de rede dos contêineres Docker"
|
|||||||
msgid "Network traffic of public interfaces"
|
msgid "Network traffic of public interfaces"
|
||||||
msgstr "Tráfego de rede das interfaces públicas"
|
msgstr "Tráfego de rede das interfaces públicas"
|
||||||
|
|
||||||
|
#. Context: Bytes or bits
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Network unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "No results found."
|
msgid "No results found."
|
||||||
msgstr "Nenhum resultado encontrado."
|
msgstr "Nenhum resultado encontrado."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "No results."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "No systems found."
|
msgid "No systems found."
|
||||||
@@ -558,6 +686,12 @@ msgstr "Sobrescrever alertas existentes"
|
|||||||
msgid "Page"
|
msgid "Page"
|
||||||
msgstr "Página"
|
msgstr "Página"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getState().pagination.pageIndex + 1
|
||||||
|
#. placeholder {1}: table.getPageCount()
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Page {0} of {1}"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "Pages / Settings"
|
msgid "Pages / Settings"
|
||||||
msgstr "Páginas / Configurações"
|
msgstr "Páginas / Configurações"
|
||||||
@@ -639,13 +773,12 @@ msgid "Public Key"
|
|||||||
msgstr "Chave Pública"
|
msgstr "Chave Pública"
|
||||||
|
|
||||||
#. Disk read
|
#. Disk read
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Read"
|
msgid "Read"
|
||||||
msgstr "Ler"
|
msgstr "Ler"
|
||||||
|
|
||||||
#. Network bytes received (download)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Received"
|
msgid "Received"
|
||||||
msgstr "Recebido"
|
msgstr "Recebido"
|
||||||
|
|
||||||
@@ -653,6 +786,12 @@ msgstr "Recebido"
|
|||||||
msgid "Reset Password"
|
msgid "Reset Password"
|
||||||
msgstr "Redefinir Senha"
|
msgstr "Redefinir Senha"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Resolved"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Resume"
|
msgid "Resume"
|
||||||
msgstr "Retomar"
|
msgstr "Retomar"
|
||||||
@@ -661,6 +800,10 @@ msgstr "Retomar"
|
|||||||
msgid "Rotate token"
|
msgid "Rotate token"
|
||||||
msgstr "Rotacionar token"
|
msgstr "Rotacionar token"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Rows per page"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
||||||
msgstr "Salve o endereço usando a tecla enter ou vírgula. Deixe em branco para desativar notificações por email."
|
msgstr "Salve o endereço usando a tecla enter ou vírgula. Deixe em branco para desativar notificações por email."
|
||||||
@@ -686,8 +829,7 @@ msgstr "Pesquisar por sistemas ou configurações..."
|
|||||||
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
||||||
msgstr "Veja <0>configurações de notificação</0> para configurar como você recebe alertas."
|
msgstr "Veja <0>configurações de notificação</0> para configurar como você recebe alertas."
|
||||||
|
|
||||||
#. Network bytes sent (upload)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Sent"
|
msgid "Sent"
|
||||||
msgstr "Enviado"
|
msgstr "Enviado"
|
||||||
|
|
||||||
@@ -718,6 +860,11 @@ msgstr "Configurações SMTP"
|
|||||||
msgid "Sort By"
|
msgid "Sort By"
|
||||||
msgstr "Ordenar Por"
|
msgstr "Ordenar Por"
|
||||||
|
|
||||||
|
#. Context: alert state (active or resolved)
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "State"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr "Status"
|
msgstr "Status"
|
||||||
@@ -733,10 +880,16 @@ msgstr "Uso de Swap"
|
|||||||
#. System theme
|
#. System theme
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Sistema"
|
msgstr "Sistema"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "System load averages over time"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Systems"
|
msgid "Systems"
|
||||||
msgstr "Sistemas"
|
msgstr "Sistemas"
|
||||||
@@ -759,6 +912,10 @@ msgstr "Temp"
|
|||||||
msgid "Temperature"
|
msgid "Temperature"
|
||||||
msgstr "Temperatura"
|
msgstr "Temperatura"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Temperature unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Temperatures of system sensors"
|
msgid "Temperatures of system sensors"
|
||||||
msgstr "Temperaturas dos sensores do sistema"
|
msgstr "Temperaturas dos sensores do sistema"
|
||||||
@@ -779,6 +936,10 @@ msgstr "Em seguida, faça login no backend e redefina a senha da sua conta de us
|
|||||||
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
||||||
msgstr "Esta ação não pode ser desfeita. Isso excluirá permanentemente todos os registros atuais de {name} do banco de dados."
|
msgstr "Esta ação não pode ser desfeita. Isso excluirá permanentemente todos os registros atuais de {name} do banco de dados."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "This will permanently delete all selected records from the database."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Throughput of {extraFsName}"
|
msgid "Throughput of {extraFsName}"
|
||||||
msgstr "Taxa de transferência de {extraFsName}"
|
msgstr "Taxa de transferência de {extraFsName}"
|
||||||
@@ -801,8 +962,9 @@ msgid "Toggle theme"
|
|||||||
msgstr "Alternar tema"
|
msgstr "Alternar tema"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr "Token"
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
@@ -818,6 +980,18 @@ msgstr "Os tokens permitem que os agentes se conectem e registrem. As impressõe
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr "Tokens e impressões digitais são usados para autenticar conexões WebSocket ao hub."
|
msgstr "Tokens e impressões digitais são usados para autenticar conexões WebSocket ao hub."
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 1 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Dispara quando qualquer sensor excede um limite"
|
msgstr "Dispara quando qualquer sensor excede um limite"
|
||||||
@@ -842,6 +1016,11 @@ msgstr "Dispara quando o status alterna entre ativo e inativo"
|
|||||||
msgid "Triggers when usage of any disk exceeds a threshold"
|
msgid "Triggers when usage of any disk exceeds a threshold"
|
||||||
msgstr "Dispara quando o uso de qualquer disco excede um limite"
|
msgstr "Dispara quando o uso de qualquer disco excede um limite"
|
||||||
|
|
||||||
|
#. Temperature / network units
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Unit preferences"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Universal token"
|
msgid "Universal token"
|
||||||
msgstr "Token universal"
|
msgstr "Token universal"
|
||||||
@@ -850,7 +1029,7 @@ msgstr "Token universal"
|
|||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Up"
|
msgid "Up"
|
||||||
msgstr ""
|
msgstr "“Ligado”"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Updated in real time. Click on a system to view information."
|
msgid "Updated in real time. Click on a system to view information."
|
||||||
@@ -862,7 +1041,8 @@ msgstr "Tempo de Atividade"
|
|||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
msgid "Usage"
|
msgid "Usage"
|
||||||
msgstr "Uso"
|
msgstr "Uso"
|
||||||
|
|
||||||
@@ -872,7 +1052,6 @@ msgstr "Uso da partição raiz"
|
|||||||
|
|
||||||
#: src/components/charts/swap-chart.tsx
|
#: src/components/charts/swap-chart.tsx
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Used"
|
msgid "Used"
|
||||||
msgstr "Usado"
|
msgstr "Usado"
|
||||||
|
|
||||||
@@ -881,10 +1060,18 @@ msgstr "Usado"
|
|||||||
msgid "Users"
|
msgid "Users"
|
||||||
msgstr "Usuários"
|
msgstr "Usuários"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Value"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "View"
|
msgid "View"
|
||||||
msgstr "Visual"
|
msgstr "Visual"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "View your 200 most recent alerts."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Visible Fields"
|
msgid "Visible Fields"
|
||||||
msgstr "Campos Visíveis"
|
msgstr "Campos Visíveis"
|
||||||
@@ -906,13 +1093,14 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr "Quando habilitado, este token permite que os agentes se registrem automaticamente sem criação prévia do sistema. Expira após uma hora ou na reinicialização do hub."
|
msgstr "Quando habilitado, este token permite que os agentes se registrem automaticamente sem criação prévia do sistema. Expira após uma hora ou na reinicialização do hub."
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Comando Windows"
|
msgstr "Comando Windows"
|
||||||
|
|
||||||
#. Disk write
|
#. Disk write
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Write"
|
msgid "Write"
|
||||||
msgstr "Escrever"
|
msgstr "Escrever"
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ msgstr ""
|
|||||||
"Language: ru\n"
|
"Language: ru\n"
|
||||||
"Project-Id-Version: beszel\n"
|
"Project-Id-Version: beszel\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2025-03-06 07:27\n"
|
"PO-Revision-Date: 2025-07-25 22:44\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: Russian\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"
|
"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"
|
||||||
@@ -23,6 +23,12 @@ msgstr ""
|
|||||||
msgid "{0, plural, one {# day} other {# days}}"
|
msgid "{0, plural, one {# day} other {# days}}"
|
||||||
msgstr "{0, plural, one {# день} other {# дней}}"
|
msgstr "{0, plural, one {# день} other {# дней}}"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
|
||||||
|
#. placeholder {1}: table.getFilteredRowModel().rows.length
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "{0} of {1} row(s) selected."
|
||||||
|
msgstr "Выбрано {0} из {1} строк."
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "{hours, plural, one {# hour} other {# hours}}"
|
msgid "{hours, plural, one {# hour} other {# hours}}"
|
||||||
msgstr "{hours, plural, one {# час} other {# часов}}"
|
msgstr "{hours, plural, one {# час} other {# часов}}"
|
||||||
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# час} other {# часов}}"
|
|||||||
msgid "1 hour"
|
msgid "1 hour"
|
||||||
msgstr "1 час"
|
msgstr "1 час"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "1 min"
|
||||||
|
msgstr "1 мин"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "1 week"
|
msgid "1 week"
|
||||||
msgstr "1 неделя"
|
msgstr "1 неделя"
|
||||||
@@ -39,6 +50,11 @@ msgstr "1 неделя"
|
|||||||
msgid "12 hours"
|
msgid "12 hours"
|
||||||
msgstr "12 часов"
|
msgstr "12 часов"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "15 min"
|
||||||
|
msgstr "15 мин"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "24 hours"
|
msgid "24 hours"
|
||||||
msgstr "24 часа"
|
msgstr "24 часа"
|
||||||
@@ -47,12 +63,22 @@ msgstr "24 часа"
|
|||||||
msgid "30 days"
|
msgid "30 days"
|
||||||
msgstr "30 дней"
|
msgstr "30 дней"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "5 min"
|
||||||
|
msgstr "5 мин"
|
||||||
|
|
||||||
#. Table column
|
#. Table column
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "Действия"
|
msgstr "Действия"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Active"
|
||||||
|
msgstr "Активно"
|
||||||
|
|
||||||
#: src/components/routes/home.tsx
|
#: src/components/routes/home.tsx
|
||||||
msgid "Active Alerts"
|
msgid "Active Alerts"
|
||||||
msgstr "Активные оповещения"
|
msgstr "Активные оповещения"
|
||||||
@@ -86,6 +112,12 @@ msgstr "Администратор"
|
|||||||
msgid "Agent"
|
msgid "Agent"
|
||||||
msgstr "Агент"
|
msgstr "Агент"
|
||||||
|
|
||||||
|
#: src/components/command-palette.tsx
|
||||||
|
#: src/components/routes/settings/layout.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Alert History"
|
||||||
|
msgstr "История оповещений"
|
||||||
|
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
msgid "Alerts"
|
msgid "Alerts"
|
||||||
@@ -100,6 +132,10 @@ msgstr "Все системы"
|
|||||||
msgid "Are you sure you want to delete {name}?"
|
msgid "Are you sure you want to delete {name}?"
|
||||||
msgstr "Вы уверены, что хотите удалить {name}?"
|
msgstr "Вы уверены, что хотите удалить {name}?"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Are you sure?"
|
||||||
|
msgstr "Вы уверены?"
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Automatic copy requires a secure context."
|
msgid "Automatic copy requires a secure context."
|
||||||
msgstr "Автоматическое копирование требует безопасного контекста."
|
msgstr "Автоматическое копирование требует безопасного контекста."
|
||||||
@@ -152,11 +188,22 @@ msgstr "Beszel использует <0>Shoutrrr</0> для интеграции
|
|||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
msgstr "Двоичный"
|
msgstr "Двоичный"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bits (Kbps, Mbps, Gbps)"
|
||||||
|
msgstr "Биты (Кбит/с, Мбит/с, Гбит/с)"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bytes (KB/s, MB/s, GB/s)"
|
||||||
|
msgstr "Байты (Кбайт/с, Мбайт/с, Гбайт/с)"
|
||||||
|
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
msgid "Cache / Buffers"
|
msgid "Cache / Buffers"
|
||||||
msgstr "Кэш / Буферы"
|
msgstr "Кэш / Буферы"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Отмена"
|
msgstr "Отмена"
|
||||||
|
|
||||||
@@ -164,6 +211,14 @@ msgstr "Отмена"
|
|||||||
msgid "Caution - potential data loss"
|
msgid "Caution - potential data loss"
|
||||||
msgstr "Внимание - возможная потеря данных"
|
msgstr "Внимание - возможная потеря данных"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Celsius (°C)"
|
||||||
|
msgstr "Цельсий (°C)"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Change display units for metrics."
|
||||||
|
msgstr "Изменить единицы измерения для метрик."
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Change general application options."
|
msgid "Change general application options."
|
||||||
msgstr "Изменить общие параметры приложения."
|
msgstr "Изменить общие параметры приложения."
|
||||||
@@ -202,7 +257,12 @@ msgstr "Настройте, как вы получаете уведомлени
|
|||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr "Подтвердите пароль"
|
msgstr "Подтвердите пароль"
|
||||||
|
|
||||||
|
#: src/components/routes/home.tsx
|
||||||
|
msgid "Connection is down"
|
||||||
|
msgstr "Нет соединения"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Continue"
|
msgid "Continue"
|
||||||
msgstr "Продолжить"
|
msgstr "Продолжить"
|
||||||
|
|
||||||
@@ -211,11 +271,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Скопировано в буфер обмена"
|
msgstr "Скопировано в буфер обмена"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Скопировать docker compose"
|
msgstr "Скопировать docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Скопировать docker run"
|
msgstr "Скопировать docker run"
|
||||||
@@ -223,31 +285,36 @@ msgstr "Скопировать docker run"
|
|||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Environment variables"
|
msgctxt "Environment variables"
|
||||||
msgid "Copy env"
|
msgid "Copy env"
|
||||||
msgstr ""
|
msgstr "Скопировать env"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Copy host"
|
msgid "Copy host"
|
||||||
msgstr "Копировать хост"
|
msgstr "Копировать хост"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Копировать команду Linux"
|
msgstr "Копировать команду Linux"
|
||||||
|
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Copy name"
|
||||||
|
msgstr "Копировать имя"
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Copy text"
|
msgid "Copy text"
|
||||||
msgstr "Копировать текст"
|
msgstr "Копировать текст"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Copy the installation command for the agent below, or register agents automatically with a <0>universal token</0>."
|
msgid "Copy the installation command for the agent below, or register agents automatically with a <0>universal token</0>."
|
||||||
msgstr ""
|
msgstr "Скопируйте команду для установки агента ниже, или зарегистрируйте агентов автоматически с помощью <0>универсального токена</0>."
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Copy the<0>docker-compose.yml</0> content for the agent below, or register agents automatically with a <1>universal token</1>."
|
msgid "Copy the<0>docker-compose.yml</0> content for the agent below, or register agents automatically with a <1>universal token</1>."
|
||||||
msgstr ""
|
msgstr "Скопируйте содержимое <0>docker-compose.yml</0> для агента ниже, или зарегистрируйте агентов автоматически с помощью <1>универсального токена</1>."
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy YAML"
|
msgid "Copy YAML"
|
||||||
msgstr ""
|
msgstr "Скопировать YAML"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "CPU"
|
msgid "CPU"
|
||||||
@@ -255,7 +322,7 @@ msgstr "CPU"
|
|||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "CPU Usage"
|
msgid "CPU Usage"
|
||||||
msgstr "Использование CPU"
|
msgstr "Использование CPU"
|
||||||
|
|
||||||
@@ -263,6 +330,11 @@ msgstr "Использование CPU"
|
|||||||
msgid "Create account"
|
msgid "Create account"
|
||||||
msgstr "Создать аккаунт"
|
msgstr "Создать аккаунт"
|
||||||
|
|
||||||
|
#. Context: date created
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Created"
|
||||||
|
msgstr "Создано"
|
||||||
|
|
||||||
#. Dark theme
|
#. Dark theme
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
@@ -278,12 +350,13 @@ msgid "Default time period"
|
|||||||
msgstr "Период по умолчанию"
|
msgstr "Период по умолчанию"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Удалить"
|
msgstr "Удалить"
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Delete fingerprint"
|
msgid "Delete fingerprint"
|
||||||
msgstr ""
|
msgstr "Удалить отпечаток"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Disk"
|
msgid "Disk"
|
||||||
@@ -293,6 +366,10 @@ msgstr "Диск"
|
|||||||
msgid "Disk I/O"
|
msgid "Disk I/O"
|
||||||
msgstr "Дисковый ввод/вывод"
|
msgstr "Дисковый ввод/вывод"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Disk unit"
|
||||||
|
msgstr "Единицы измерения температуры"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/disk-chart.tsx
|
#: src/components/charts/disk-chart.tsx
|
||||||
@@ -321,11 +398,16 @@ msgstr "Документация"
|
|||||||
|
|
||||||
#. Context: System is down
|
#. Context: System is down
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Down"
|
msgid "Down"
|
||||||
msgstr "Не в сети"
|
msgstr "Не в сети"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Duration"
|
||||||
|
msgstr "Длительность"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
@@ -351,6 +433,7 @@ msgstr "Введите адрес электронной почты..."
|
|||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
#: src/components/login/auth-form.tsx
|
#: src/components/login/auth-form.tsx
|
||||||
msgid "Error"
|
msgid "Error"
|
||||||
msgstr "Ошибка"
|
msgstr "Ошибка"
|
||||||
@@ -366,6 +449,10 @@ msgstr "Превышает {0}{1} за последние {2, plural, one {# м
|
|||||||
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
||||||
msgstr "Существующие системы, не определенные в <0>config.yml</0>, будут удалены. Пожалуйста, делайте регулярные резервные копии."
|
msgstr "Существующие системы, не определенные в <0>config.yml</0>, будут удалены. Пожалуйста, делайте регулярные резервные копии."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Export"
|
||||||
|
msgstr "Экспорт"
|
||||||
|
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
msgid "Export configuration"
|
msgid "Export configuration"
|
||||||
msgstr "Экспорт конфигурации"
|
msgstr "Экспорт конфигурации"
|
||||||
@@ -374,6 +461,10 @@ msgstr "Экспорт конфигурации"
|
|||||||
msgid "Export your current systems configuration."
|
msgid "Export your current systems configuration."
|
||||||
msgstr "Экспортируйте текущую конфигурацию систем."
|
msgstr "Экспортируйте текущую конфигурацию систем."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Fahrenheit (°F)"
|
||||||
|
msgstr "Фаренгейт (°F)"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Failed to authenticate"
|
msgid "Failed to authenticate"
|
||||||
msgstr "Не удалось аутентифицировать"
|
msgstr "Не удалось аутентифицировать"
|
||||||
@@ -393,9 +484,14 @@ msgstr "Не удалось обновить оповещение"
|
|||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Фильтр..."
|
msgstr "Фильтр..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr "Отпечаток"
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "На <0>{min}</0> {min, plural, one {минуту} other {минут}}"
|
msgstr "На <0>{min}</0> {min, plural, one {минуту} other {минут}}"
|
||||||
@@ -419,6 +515,7 @@ msgid "Grid"
|
|||||||
msgstr "Сетка"
|
msgstr "Сетка"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Команда Homebrew"
|
msgstr "Команда Homebrew"
|
||||||
@@ -453,6 +550,27 @@ msgstr "Макет"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Светлая"
|
msgstr "Светлая"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "Load Average"
|
||||||
|
msgstr "Средняя загрузка"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr "Средняя загрузка за 15м"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 1m"
|
||||||
|
msgstr "Средняя загрузка за 1м"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr "Средняя загрузка за 5м"
|
||||||
|
|
||||||
|
#. Short label for load average
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Load Avg"
|
||||||
|
msgstr "Ср. загрузка"
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Выйти"
|
msgstr "Выйти"
|
||||||
@@ -501,6 +619,7 @@ msgstr "Использование памяти"
|
|||||||
msgid "Memory usage of docker containers"
|
msgid "Memory usage of docker containers"
|
||||||
msgstr "Использование памяти контейнерами Docker"
|
msgstr "Использование памяти контейнерами Docker"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Имя"
|
msgstr "Имя"
|
||||||
@@ -517,10 +636,19 @@ msgstr "Сетевой трафик контейнеров Docker"
|
|||||||
msgid "Network traffic of public interfaces"
|
msgid "Network traffic of public interfaces"
|
||||||
msgstr "Сетевой трафик публичных интерфейсов"
|
msgstr "Сетевой трафик публичных интерфейсов"
|
||||||
|
|
||||||
|
#. Context: Bytes or bits
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Network unit"
|
||||||
|
msgstr "Единицы измерения скорости сети"
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "No results found."
|
msgid "No results found."
|
||||||
msgstr "Результаты не найдены."
|
msgstr "Результаты не найдены."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "No results."
|
||||||
|
msgstr "Нет результатов."
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "No systems found."
|
msgid "No systems found."
|
||||||
@@ -558,6 +686,12 @@ msgstr "Перезаписать существующие оповещения"
|
|||||||
msgid "Page"
|
msgid "Page"
|
||||||
msgstr "Страница"
|
msgstr "Страница"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getState().pagination.pageIndex + 1
|
||||||
|
#. placeholder {1}: table.getPageCount()
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Page {0} of {1}"
|
||||||
|
msgstr "Страница {0} из {1}"
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "Pages / Settings"
|
msgid "Pages / Settings"
|
||||||
msgstr "Страницы / Настройки"
|
msgstr "Страницы / Настройки"
|
||||||
@@ -585,7 +719,7 @@ msgstr "Пауза"
|
|||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Paused"
|
msgid "Paused"
|
||||||
msgstr "Приостановлено"
|
msgstr "Пауза"
|
||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
|
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
|
||||||
@@ -639,13 +773,12 @@ msgid "Public Key"
|
|||||||
msgstr "Ключ"
|
msgstr "Ключ"
|
||||||
|
|
||||||
#. Disk read
|
#. Disk read
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Read"
|
msgid "Read"
|
||||||
msgstr "Чтение"
|
msgstr "Чтение"
|
||||||
|
|
||||||
#. Network bytes received (download)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Received"
|
msgid "Received"
|
||||||
msgstr "Получено"
|
msgstr "Получено"
|
||||||
|
|
||||||
@@ -653,13 +786,23 @@ msgstr "Получено"
|
|||||||
msgid "Reset Password"
|
msgid "Reset Password"
|
||||||
msgstr "Сбросить пароль"
|
msgstr "Сбросить пароль"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Resolved"
|
||||||
|
msgstr "Завершено"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Resume"
|
msgid "Resume"
|
||||||
msgstr "Возобновить"
|
msgstr "Возобновить"
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Rotate token"
|
msgid "Rotate token"
|
||||||
msgstr ""
|
msgstr "Обновить токен"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Rows per page"
|
||||||
|
msgstr "Строк на странице"
|
||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
||||||
@@ -686,8 +829,7 @@ msgstr "Поиск систем или настроек..."
|
|||||||
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
||||||
msgstr "Смотрите <0>настройки уведомлений</0>, чтобы настроить, как вы получаете оповещения."
|
msgstr "Смотрите <0>настройки уведомлений</0>, чтобы настроить, как вы получаете оповещения."
|
||||||
|
|
||||||
#. Network bytes sent (upload)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Sent"
|
msgid "Sent"
|
||||||
msgstr "Отправлено"
|
msgstr "Отправлено"
|
||||||
|
|
||||||
@@ -718,6 +860,11 @@ msgstr "Настройки SMTP"
|
|||||||
msgid "Sort By"
|
msgid "Sort By"
|
||||||
msgstr "Сортировать по"
|
msgstr "Сортировать по"
|
||||||
|
|
||||||
|
#. Context: alert state (active or resolved)
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "State"
|
||||||
|
msgstr "Состояние"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr "Статус"
|
msgstr "Статус"
|
||||||
@@ -733,10 +880,16 @@ msgstr "Использование подкачки"
|
|||||||
#. System theme
|
#. System theme
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Система"
|
msgstr "Система"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "System load averages over time"
|
||||||
|
msgstr "Средняя загрузка системы за время"
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Systems"
|
msgid "Systems"
|
||||||
msgstr "Системы"
|
msgstr "Системы"
|
||||||
@@ -759,6 +912,10 @@ msgstr "Темп"
|
|||||||
msgid "Temperature"
|
msgid "Temperature"
|
||||||
msgstr "Температура"
|
msgstr "Температура"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Temperature unit"
|
||||||
|
msgstr "Температура"
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Temperatures of system sensors"
|
msgid "Temperatures of system sensors"
|
||||||
msgstr "Температуры датчиков системы"
|
msgstr "Температуры датчиков системы"
|
||||||
@@ -779,6 +936,10 @@ msgstr "Затем войдите в бэкенд и сбросьте парол
|
|||||||
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
||||||
msgstr "Это действие не может быть отменено. Это навсегда удалит все текущие записи для {name} из базы данных."
|
msgstr "Это действие не может быть отменено. Это навсегда удалит все текущие записи для {name} из базы данных."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "This will permanently delete all selected records from the database."
|
||||||
|
msgstr "Это навсегда удалит все выбранные записи из базы данных."
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Throughput of {extraFsName}"
|
msgid "Throughput of {extraFsName}"
|
||||||
msgstr "Пропускная способность {extraFsName}"
|
msgstr "Пропускная способность {extraFsName}"
|
||||||
@@ -801,22 +962,35 @@ msgid "Toggle theme"
|
|||||||
msgstr "Переключить тему"
|
msgstr "Переключить тему"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr ""
|
msgstr "Токен"
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
#: src/components/routes/settings/layout.tsx
|
#: src/components/routes/settings/layout.tsx
|
||||||
msgid "Tokens & Fingerprints"
|
msgid "Tokens & Fingerprints"
|
||||||
msgstr ""
|
msgstr "Токены и отпечатки"
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Tokens allow agents to connect and register. Fingerprints are stable identifiers unique to each system, set on first connection."
|
msgid "Tokens allow agents to connect and register. Fingerprints are stable identifiers unique to each system, set on first connection."
|
||||||
msgstr ""
|
msgstr "Токены позволяют агентам подключаться и регистрироваться. Отпечатки являются постоянными идентификаторами, уникальными для каждой системы, которые создаются при первом подключении."
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr ""
|
msgstr "Токены и отпечатки используются для аутентификации соединений WebSocket с хабом."
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 1 minute load average exceeds a threshold"
|
||||||
|
msgstr "Срабатывает, когда средняя загрузка за 1 минуту превышает порог"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr "Срабатывает, когда средняя загрузка за 15 минут превышает порог"
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr "Срабатывает, когда средняя загрузка за 5 минут превышает порог"
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
@@ -842,9 +1016,14 @@ msgstr "Срабатывает, когда статус переключаетс
|
|||||||
msgid "Triggers when usage of any disk exceeds a threshold"
|
msgid "Triggers when usage of any disk exceeds a threshold"
|
||||||
msgstr "Срабатывает, когда использование любого диска превышает порог"
|
msgstr "Срабатывает, когда использование любого диска превышает порог"
|
||||||
|
|
||||||
|
#. Temperature / network units
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Unit preferences"
|
||||||
|
msgstr "Параметры единиц измерения"
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Universal token"
|
msgid "Universal token"
|
||||||
msgstr ""
|
msgstr "Универсальный токен"
|
||||||
|
|
||||||
#. Context: System is up
|
#. Context: System is up
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
@@ -862,7 +1041,8 @@ msgstr "Время работы"
|
|||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
msgid "Usage"
|
msgid "Usage"
|
||||||
msgstr "Использование"
|
msgstr "Использование"
|
||||||
|
|
||||||
@@ -872,7 +1052,6 @@ msgstr "Использование корневого раздела"
|
|||||||
|
|
||||||
#: src/components/charts/swap-chart.tsx
|
#: src/components/charts/swap-chart.tsx
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Used"
|
msgid "Used"
|
||||||
msgstr "Использовано"
|
msgstr "Использовано"
|
||||||
|
|
||||||
@@ -881,10 +1060,18 @@ msgstr "Использовано"
|
|||||||
msgid "Users"
|
msgid "Users"
|
||||||
msgstr "Пользователи"
|
msgstr "Пользователи"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Value"
|
||||||
|
msgstr "Значение"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "View"
|
msgid "View"
|
||||||
msgstr "Вид"
|
msgstr "Вид"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "View your 200 most recent alerts."
|
||||||
|
msgstr "Просмотреть 200 последних оповещений."
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Visible Fields"
|
msgid "Visible Fields"
|
||||||
msgstr "Видимые столбцы"
|
msgstr "Видимые столбцы"
|
||||||
@@ -903,16 +1090,17 @@ msgstr "Webhook / Push уведомления"
|
|||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "When enabled, this token allows agents to self-register without prior system creation. Expires after one hour or on hub restart."
|
msgid "When enabled, this token allows agents to self-register without prior system creation. Expires after one hour or on hub restart."
|
||||||
msgstr ""
|
msgstr "Если включено, этот токен позволяет агентам регистрироваться самостоятельно без предварительного создания системы. Истекает через час или при перезапуске хаба."
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Команда Windows"
|
msgstr "Команда Windows"
|
||||||
|
|
||||||
#. Disk write
|
#. Disk write
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Write"
|
msgid "Write"
|
||||||
msgstr "Запись"
|
msgstr "Запись"
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ msgstr ""
|
|||||||
"Language: sl\n"
|
"Language: sl\n"
|
||||||
"Project-Id-Version: beszel\n"
|
"Project-Id-Version: beszel\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2025-03-06 07:27\n"
|
"PO-Revision-Date: 2025-07-25 22:44\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: Slovenian\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"
|
"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3;\n"
|
||||||
@@ -23,6 +23,12 @@ msgstr ""
|
|||||||
msgid "{0, plural, one {# day} other {# days}}"
|
msgid "{0, plural, one {# day} other {# days}}"
|
||||||
msgstr "{0, plural, one {# dan} two {# dneva} few {# dni} other {# dni}}"
|
msgstr "{0, plural, one {# dan} two {# dneva} few {# dni} other {# dni}}"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
|
||||||
|
#. placeholder {1}: table.getFilteredRowModel().rows.length
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "{0} of {1} row(s) selected."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "{hours, plural, one {# hour} other {# hours}}"
|
msgid "{hours, plural, one {# hour} other {# hours}}"
|
||||||
msgstr "{hours, plural, one {# ura} two {# uri} few {# ur} other {# ur}}"
|
msgstr "{hours, plural, one {# ura} two {# uri} few {# ur} other {# ur}}"
|
||||||
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# ura} two {# uri} few {# ur} other {# ur}}"
|
|||||||
msgid "1 hour"
|
msgid "1 hour"
|
||||||
msgstr "1 ura"
|
msgstr "1 ura"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "1 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "1 week"
|
msgid "1 week"
|
||||||
msgstr "1 teden"
|
msgstr "1 teden"
|
||||||
@@ -39,6 +50,11 @@ msgstr "1 teden"
|
|||||||
msgid "12 hours"
|
msgid "12 hours"
|
||||||
msgstr "12 ur"
|
msgstr "12 ur"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "15 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "24 hours"
|
msgid "24 hours"
|
||||||
msgstr "24 ur"
|
msgstr "24 ur"
|
||||||
@@ -47,12 +63,22 @@ msgstr "24 ur"
|
|||||||
msgid "30 days"
|
msgid "30 days"
|
||||||
msgstr "30 dni"
|
msgstr "30 dni"
|
||||||
|
|
||||||
|
#. Load average
|
||||||
|
#: src/components/charts/load-average-chart.tsx
|
||||||
|
msgid "5 min"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. Table column
|
#. Table column
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "Dejanja"
|
msgstr "Dejanja"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Active"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/home.tsx
|
#: src/components/routes/home.tsx
|
||||||
msgid "Active Alerts"
|
msgid "Active Alerts"
|
||||||
msgstr "Aktivna opozorila"
|
msgstr "Aktivna opozorila"
|
||||||
@@ -86,6 +112,12 @@ msgstr "Administrator"
|
|||||||
msgid "Agent"
|
msgid "Agent"
|
||||||
msgstr "Agent"
|
msgstr "Agent"
|
||||||
|
|
||||||
|
#: src/components/command-palette.tsx
|
||||||
|
#: src/components/routes/settings/layout.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Alert History"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
#: src/components/alerts/alert-button.tsx
|
#: src/components/alerts/alert-button.tsx
|
||||||
msgid "Alerts"
|
msgid "Alerts"
|
||||||
@@ -100,6 +132,10 @@ msgstr "Vsi sistemi"
|
|||||||
msgid "Are you sure you want to delete {name}?"
|
msgid "Are you sure you want to delete {name}?"
|
||||||
msgstr "Ali ste prepričani, da želite izbrisati {name}?"
|
msgstr "Ali ste prepričani, da želite izbrisati {name}?"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Are you sure?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Automatic copy requires a secure context."
|
msgid "Automatic copy requires a secure context."
|
||||||
msgstr "Za samodejno kopiranje je potreben varen kontekst."
|
msgstr "Za samodejno kopiranje je potreben varen kontekst."
|
||||||
@@ -152,11 +188,22 @@ msgstr "Beszel uporablja <0>Shoutrrr</0> za integracijo s priljubljenimi storitv
|
|||||||
msgid "Binary"
|
msgid "Binary"
|
||||||
msgstr "Binarno"
|
msgstr "Binarno"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bits (Kbps, Mbps, Gbps)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Bytes (KB/s, MB/s, GB/s)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
msgid "Cache / Buffers"
|
msgid "Cache / Buffers"
|
||||||
msgstr "Predpomnilnik / medpomnilniki"
|
msgstr "Predpomnilnik / medpomnilniki"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Prekliči"
|
msgstr "Prekliči"
|
||||||
|
|
||||||
@@ -164,6 +211,14 @@ msgstr "Prekliči"
|
|||||||
msgid "Caution - potential data loss"
|
msgid "Caution - potential data loss"
|
||||||
msgstr "Pozor - možna izguba podatkov"
|
msgstr "Pozor - možna izguba podatkov"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Celsius (°C)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Change display units for metrics."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/general.tsx
|
#: src/components/routes/settings/general.tsx
|
||||||
msgid "Change general application options."
|
msgid "Change general application options."
|
||||||
msgstr "Spremeni splošne možnosti aplikacije."
|
msgstr "Spremeni splošne možnosti aplikacije."
|
||||||
@@ -202,7 +257,12 @@ msgstr "Nastavi način prejemanja opozorilnih obvestil."
|
|||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr "Potrdite geslo"
|
msgstr "Potrdite geslo"
|
||||||
|
|
||||||
|
#: src/components/routes/home.tsx
|
||||||
|
msgid "Connection is down"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Continue"
|
msgid "Continue"
|
||||||
msgstr "Nadaljuj"
|
msgstr "Nadaljuj"
|
||||||
|
|
||||||
@@ -211,11 +271,13 @@ msgid "Copied to clipboard"
|
|||||||
msgstr "Kopirano v odložišče"
|
msgstr "Kopirano v odložišče"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker compose file content"
|
msgctxt "Button to copy docker compose file content"
|
||||||
msgid "Copy docker compose"
|
msgid "Copy docker compose"
|
||||||
msgstr "Kopiraj docker compose"
|
msgstr "Kopiraj docker compose"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy docker run command"
|
msgctxt "Button to copy docker run command"
|
||||||
msgid "Copy docker run"
|
msgid "Copy docker run"
|
||||||
msgstr "Kopiraj docker run"
|
msgstr "Kopiraj docker run"
|
||||||
@@ -230,9 +292,14 @@ msgid "Copy host"
|
|||||||
msgstr "Kopiraj gostitelja"
|
msgstr "Kopiraj gostitelja"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Copy Linux command"
|
msgid "Copy Linux command"
|
||||||
msgstr "Kopiraj Linux ukaz"
|
msgstr "Kopiraj Linux ukaz"
|
||||||
|
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Copy name"
|
||||||
|
msgstr "Kopiraj ime"
|
||||||
|
|
||||||
#: src/components/copy-to-clipboard.tsx
|
#: src/components/copy-to-clipboard.tsx
|
||||||
msgid "Copy text"
|
msgid "Copy text"
|
||||||
msgstr "Kopiraj besedilo"
|
msgstr "Kopiraj besedilo"
|
||||||
@@ -255,7 +322,7 @@ msgstr "CPU"
|
|||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "CPU Usage"
|
msgid "CPU Usage"
|
||||||
msgstr "CPU poraba"
|
msgstr "CPU poraba"
|
||||||
|
|
||||||
@@ -263,6 +330,11 @@ msgstr "CPU poraba"
|
|||||||
msgid "Create account"
|
msgid "Create account"
|
||||||
msgstr "Ustvari račun"
|
msgstr "Ustvari račun"
|
||||||
|
|
||||||
|
#. Context: date created
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Created"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. Dark theme
|
#. Dark theme
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
@@ -278,6 +350,7 @@ msgid "Default time period"
|
|||||||
msgstr "Privzeto časovno obdobje"
|
msgstr "Privzeto časovno obdobje"
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Izbriši"
|
msgstr "Izbriši"
|
||||||
|
|
||||||
@@ -293,6 +366,10 @@ msgstr "Disk"
|
|||||||
msgid "Disk I/O"
|
msgid "Disk I/O"
|
||||||
msgstr "Disk I/O"
|
msgstr "Disk I/O"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Disk unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/disk-chart.tsx
|
#: src/components/charts/disk-chart.tsx
|
||||||
@@ -321,11 +398,16 @@ msgstr "Dokumentacija"
|
|||||||
|
|
||||||
#. Context: System is down
|
#. Context: System is down
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Down"
|
msgid "Down"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Duration"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
@@ -351,6 +433,7 @@ msgstr "Vnesite e-poštni naslov..."
|
|||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
#: src/components/login/auth-form.tsx
|
#: src/components/login/auth-form.tsx
|
||||||
msgid "Error"
|
msgid "Error"
|
||||||
msgstr "Napaka"
|
msgstr "Napaka"
|
||||||
@@ -366,6 +449,10 @@ msgstr "Preseženo {0}{1} v zadnjih {2, plural, one {# minuti} other {# minutah}
|
|||||||
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
|
||||||
msgstr "Obstoječi sistemi, ki niso definirani v <0>config.yml</0>, bodo izbrisani. Prosimo, naredite redne varnostne kopije."
|
msgstr "Obstoječi sistemi, ki niso definirani v <0>config.yml</0>, bodo izbrisani. Prosimo, naredite redne varnostne kopije."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Export"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/config-yaml.tsx
|
#: src/components/routes/settings/config-yaml.tsx
|
||||||
msgid "Export configuration"
|
msgid "Export configuration"
|
||||||
msgstr "Izvozi nastavitve"
|
msgstr "Izvozi nastavitve"
|
||||||
@@ -374,6 +461,10 @@ msgstr "Izvozi nastavitve"
|
|||||||
msgid "Export your current systems configuration."
|
msgid "Export your current systems configuration."
|
||||||
msgstr "Izvozi trenutne nastavitve sistema."
|
msgstr "Izvozi trenutne nastavitve sistema."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Fahrenheit (°F)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Failed to authenticate"
|
msgid "Failed to authenticate"
|
||||||
msgstr "Preverjanje pristnosti ni uspelo"
|
msgstr "Preverjanje pristnosti ni uspelo"
|
||||||
@@ -393,9 +484,14 @@ msgstr "Opozorila ni bilo mogoče posodobiti"
|
|||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
msgid "Filter..."
|
msgid "Filter..."
|
||||||
msgstr "Filter..."
|
msgstr "Filter..."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
|
msgid "Fingerprint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/alerts/alerts-system.tsx
|
#: src/components/alerts/alerts-system.tsx
|
||||||
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
|
||||||
msgstr "Za <0>{min}</0> {min, plural, one {minuto} other {minut}}"
|
msgstr "Za <0>{min}</0> {min, plural, one {minuto} other {minut}}"
|
||||||
@@ -419,6 +515,7 @@ msgid "Grid"
|
|||||||
msgstr "Mreža"
|
msgstr "Mreža"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Homebrew command"
|
msgid "Homebrew command"
|
||||||
msgstr "Ukaz Homebrew"
|
msgstr "Ukaz Homebrew"
|
||||||
@@ -453,6 +550,27 @@ msgstr "Postavitev"
|
|||||||
msgid "Light"
|
msgid "Light"
|
||||||
msgstr "Svetlo"
|
msgstr "Svetlo"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "Load Average"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 15m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 1m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Load Average 5m"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Short label for load average
|
||||||
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
msgid "Load Avg"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Odjava"
|
msgstr "Odjava"
|
||||||
@@ -501,6 +619,7 @@ msgstr "Poraba pomnilnika"
|
|||||||
msgid "Memory usage of docker containers"
|
msgid "Memory usage of docker containers"
|
||||||
msgstr "Poraba pomnilnika docker kontejnerjev"
|
msgstr "Poraba pomnilnika docker kontejnerjev"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Naziv"
|
msgstr "Naziv"
|
||||||
@@ -517,10 +636,19 @@ msgstr "Omrežni promet docker kontejnerjev"
|
|||||||
msgid "Network traffic of public interfaces"
|
msgid "Network traffic of public interfaces"
|
||||||
msgstr "Omrežni promet javnih vmesnikov"
|
msgstr "Omrežni promet javnih vmesnikov"
|
||||||
|
|
||||||
|
#. Context: Bytes or bits
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Network unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "No results found."
|
msgid "No results found."
|
||||||
msgstr "Ni rezultatov."
|
msgstr "Ni rezultatov."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "No results."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "No systems found."
|
msgid "No systems found."
|
||||||
@@ -558,6 +686,12 @@ msgstr "Prepiši obstoječe alarme"
|
|||||||
msgid "Page"
|
msgid "Page"
|
||||||
msgstr "Stran"
|
msgstr "Stran"
|
||||||
|
|
||||||
|
#. placeholder {0}: table.getState().pagination.pageIndex + 1
|
||||||
|
#. placeholder {1}: table.getPageCount()
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Page {0} of {1}"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/command-palette.tsx
|
#: src/components/command-palette.tsx
|
||||||
msgid "Pages / Settings"
|
msgid "Pages / Settings"
|
||||||
msgstr "Strani / Nastavitve"
|
msgstr "Strani / Nastavitve"
|
||||||
@@ -639,13 +773,12 @@ msgid "Public Key"
|
|||||||
msgstr "Javni ključ"
|
msgstr "Javni ključ"
|
||||||
|
|
||||||
#. Disk read
|
#. Disk read
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Read"
|
msgid "Read"
|
||||||
msgstr "Preberano"
|
msgstr "Preberano"
|
||||||
|
|
||||||
#. Network bytes received (download)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Received"
|
msgid "Received"
|
||||||
msgstr "Prejeto"
|
msgstr "Prejeto"
|
||||||
|
|
||||||
@@ -653,6 +786,12 @@ msgstr "Prejeto"
|
|||||||
msgid "Reset Password"
|
msgid "Reset Password"
|
||||||
msgstr "Ponastavi geslo"
|
msgstr "Ponastavi geslo"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Resolved"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Resume"
|
msgid "Resume"
|
||||||
msgstr "Nadaljuj"
|
msgstr "Nadaljuj"
|
||||||
@@ -661,6 +800,10 @@ msgstr "Nadaljuj"
|
|||||||
msgid "Rotate token"
|
msgid "Rotate token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "Rows per page"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/notifications.tsx
|
#: src/components/routes/settings/notifications.tsx
|
||||||
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
|
||||||
msgstr "Shranite naslov s tipko enter ali vejico. Pustite prazno, da onemogočite e-poštna obvestila."
|
msgstr "Shranite naslov s tipko enter ali vejico. Pustite prazno, da onemogočite e-poštna obvestila."
|
||||||
@@ -686,8 +829,7 @@ msgstr "Iskanje sistemov ali nastavitev..."
|
|||||||
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
msgid "See <0>notification settings</0> to configure how you receive alerts."
|
||||||
msgstr "Glejte <0>nastavitve obvestil</0>, da nastavite način prejemanja opozoril."
|
msgstr "Glejte <0>nastavitve obvestil</0>, da nastavite način prejemanja opozoril."
|
||||||
|
|
||||||
#. Network bytes sent (upload)
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Sent"
|
msgid "Sent"
|
||||||
msgstr "Poslano"
|
msgstr "Poslano"
|
||||||
|
|
||||||
@@ -718,6 +860,11 @@ msgstr "SMTP nastavitve"
|
|||||||
msgid "Sort By"
|
msgid "Sort By"
|
||||||
msgstr "Razvrsti po"
|
msgstr "Razvrsti po"
|
||||||
|
|
||||||
|
#. Context: alert state (active or resolved)
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "State"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr "Status"
|
msgstr "Status"
|
||||||
@@ -733,10 +880,16 @@ msgstr "Swap uporaba"
|
|||||||
#. System theme
|
#. System theme
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
#: src/components/mode-toggle.tsx
|
#: src/components/mode-toggle.tsx
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Sistemsko"
|
msgstr "Sistemsko"
|
||||||
|
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
|
msgid "System load averages over time"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/navbar.tsx
|
#: src/components/navbar.tsx
|
||||||
msgid "Systems"
|
msgid "Systems"
|
||||||
msgstr "Sistemi"
|
msgstr "Sistemi"
|
||||||
@@ -759,6 +912,10 @@ msgstr ""
|
|||||||
msgid "Temperature"
|
msgid "Temperature"
|
||||||
msgstr "Temperatura"
|
msgstr "Temperatura"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Temperature unit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Temperatures of system sensors"
|
msgid "Temperatures of system sensors"
|
||||||
msgstr "Temperature sistemskih senzorjev"
|
msgstr "Temperature sistemskih senzorjev"
|
||||||
@@ -779,6 +936,10 @@ msgstr "Nato se prijavite v zaledni sistem in ponastavite geslo svojega uporabni
|
|||||||
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
|
||||||
msgstr "Tega dejanja ni mogoče razveljaviti. To bo trajno izbrisalo vse trenutne zapise za {name} iz zbirke podatkov."
|
msgstr "Tega dejanja ni mogoče razveljaviti. To bo trajno izbrisalo vse trenutne zapise za {name} iz zbirke podatkov."
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "This will permanently delete all selected records from the database."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Throughput of {extraFsName}"
|
msgid "Throughput of {extraFsName}"
|
||||||
msgstr "Prepustnost {extraFsName}"
|
msgstr "Prepustnost {extraFsName}"
|
||||||
@@ -801,6 +962,7 @@ msgid "Toggle theme"
|
|||||||
msgstr "Obrni temo"
|
msgstr "Obrni temo"
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Token"
|
msgid "Token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -818,6 +980,18 @@ msgstr ""
|
|||||||
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 1 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 15 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/lib/utils.ts
|
||||||
|
msgid "Triggers when 5 minute load average exceeds a threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/lib/utils.ts
|
#: src/lib/utils.ts
|
||||||
msgid "Triggers when any sensor exceeds a threshold"
|
msgid "Triggers when any sensor exceeds a threshold"
|
||||||
msgstr "Sproži se, ko kateri koli senzor preseže prag"
|
msgstr "Sproži se, ko kateri koli senzor preseže prag"
|
||||||
@@ -842,6 +1016,11 @@ msgstr "Sproži se, ko se stanje preklaplja med gor in dol"
|
|||||||
msgid "Triggers when usage of any disk exceeds a threshold"
|
msgid "Triggers when usage of any disk exceeds a threshold"
|
||||||
msgstr "Sproži se, ko uporaba katerega koli diska preseže prag"
|
msgstr "Sproži se, ko uporaba katerega koli diska preseže prag"
|
||||||
|
|
||||||
|
#. Temperature / network units
|
||||||
|
#: src/components/routes/settings/general.tsx
|
||||||
|
msgid "Unit preferences"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/routes/settings/tokens-fingerprints.tsx
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgid "Universal token"
|
msgid "Universal token"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -862,7 +1041,8 @@ msgstr "Čas delovanja"
|
|||||||
|
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/routes/system.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
|
#: src/components/routes/system.tsx
|
||||||
msgid "Usage"
|
msgid "Usage"
|
||||||
msgstr "Uporaba"
|
msgstr "Uporaba"
|
||||||
|
|
||||||
@@ -872,7 +1052,6 @@ msgstr "Uporaba korenske particije"
|
|||||||
|
|
||||||
#: src/components/charts/swap-chart.tsx
|
#: src/components/charts/swap-chart.tsx
|
||||||
#: src/components/charts/mem-chart.tsx
|
#: src/components/charts/mem-chart.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
|
||||||
msgid "Used"
|
msgid "Used"
|
||||||
msgstr "Uporabljeno"
|
msgstr "Uporabljeno"
|
||||||
|
|
||||||
@@ -881,10 +1060,18 @@ msgstr "Uporabljeno"
|
|||||||
msgid "Users"
|
msgid "Users"
|
||||||
msgstr "Uporabniki"
|
msgstr "Uporabniki"
|
||||||
|
|
||||||
|
#: src/components/alerts-history-columns.tsx
|
||||||
|
msgid "Value"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "View"
|
msgid "View"
|
||||||
msgstr "Pogled"
|
msgstr "Pogled"
|
||||||
|
|
||||||
|
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||||
|
msgid "View your 200 most recent alerts."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/systems-table/systems-table.tsx
|
#: src/components/systems-table/systems-table.tsx
|
||||||
msgid "Visible Fields"
|
msgid "Visible Fields"
|
||||||
msgstr "Vidna polja"
|
msgstr "Vidna polja"
|
||||||
@@ -906,13 +1093,14 @@ msgid "When enabled, this token allows agents to self-register without prior sys
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/add-system.tsx
|
#: src/components/add-system.tsx
|
||||||
|
#: src/components/routes/settings/tokens-fingerprints.tsx
|
||||||
msgctxt "Button to copy install command"
|
msgctxt "Button to copy install command"
|
||||||
msgid "Windows command"
|
msgid "Windows command"
|
||||||
msgstr "Ukaz Windows"
|
msgstr "Ukaz Windows"
|
||||||
|
|
||||||
#. Disk write
|
#. Disk write
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
#: src/components/charts/area-chart.tsx
|
#: src/components/routes/system.tsx
|
||||||
msgid "Write"
|
msgid "Write"
|
||||||
msgstr "Pisanje"
|
msgstr "Pisanje"
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user