Merge remote-tracking branch 'origin/develop' into HEAD

# Conflicts:
#	.github/scripts/tests/test_command_descriptions.py
This commit is contained in:
MacRimi
2026-10-16 23:06:07 +02:00
47 changed files with 1219 additions and 332 deletions
+2 -1
View File
@@ -124,7 +124,8 @@ class OciWordingTests(TestCase):
fn = function(CUSTOM, 'explore', read_definition=lambda _: ('definition', 'source'),
ignored_settings=lambda _: [], template_from_compose=lambda _: {
'container_contract': {'image': {'reference': 'example:latest'}}},
describe=lambda _: 'SUMMARY', registry_report=lambda _: (False, 'INSPECTION FAILED'))
describe=lambda _: 'SUMMARY', registry_report=lambda _: (False, 'INSPECTION FAILED'),
_registry_refused=lambda _: False)
fn(ui)
self.assertEqual(ui.message.call_args.args[0], 'SUMMARY\n\nINSPECTION FAILED\n\n' + REGISTRY_ADVICE)
self.assertNotIn('not supported yet', ui.message.call_args.args[0])
+27 -3
View File
@@ -35,6 +35,23 @@ import DOMPurify from "dompurify"
import { marked } from "marked"
import { getCountFormKey, useI18n, useT } from "@/lib/i18n/provider"
// A schedule record predating the structured reason code still contains one
// of these exact diagnostic messages. Recognise only those known historical
// values so an already-recorded safe skip localizes after an upgrade, while
// unrelated freeform diagnostics remain verbatim for troubleshooting.
const LEGACY_STOPPED_SCHEDULE_REASONS = new Set([
"container is stopped; scheduled update was skipped",
"container was stopped before scheduled update could begin",
])
const scheduleReasonCodeFromPersisted = (reasonCode: unknown, reason: unknown): string | null => {
if (typeof reasonCode === "string" && reasonCode) return reasonCode
if (typeof reason === "string" && LEGACY_STOPPED_SCHEDULE_REASONS.has(reason.toLowerCase())) {
return "stopped_container"
}
return null
}
// Sent by /api/vms only for LXC rows, only when the user has enabled
// `lxc_updates_available` notifications. The Monitor populates this
// from managed_installs registry → frontend uses it to render the
@@ -2077,6 +2094,7 @@ const handleDownloadLogs = async (vmid: number, vmName: string) => {
const [scheduleLastRunAt, setScheduleLastRunAt] = useState<string | null>(null)
const [scheduleLastRunStatus, setScheduleLastRunStatus] = useState<string | null>(null)
const [scheduleLastRunReason, setScheduleLastRunReason] = useState<string | null>(null)
const [scheduleLastRunReasonCode, setScheduleLastRunReasonCode] = useState<string | null>(null)
const [scheduleLastRunLog, setScheduleLastRunLog] = useState<string | null>(null)
const [scheduleLastRunRebootRequired, setScheduleLastRunRebootRequired] = useState(false)
const [scheduleLastRunRebootPackages, setScheduleLastRunRebootPackages] = useState<string[]>([])
@@ -2153,6 +2171,7 @@ const handleDownloadLogs = async (vmid: number, vmName: string) => {
setScheduleLastRunAt(s.last_run_at || null)
setScheduleLastRunStatus(s.last_run_status || null)
setScheduleLastRunReason(s.last_run_reason || null)
setScheduleLastRunReasonCode(scheduleReasonCodeFromPersisted(s.last_run_reason_code, s.last_run_reason))
setScheduleLastRunLog(s.last_run_log || null)
setScheduleLastRunRebootRequired(s.last_run_reboot_required === true)
setScheduleLastRunRebootPackages(Array.isArray(s.last_run_reboot_packages)
@@ -2430,6 +2449,11 @@ const handleDownloadLogs = async (vmid: number, vmName: string) => {
const renderScheduleRunDetails = (indented = false) => {
if (!scheduleLastRunAt || !selectedVM) return null
const spacing = indented ? "pl-4" : ""
const scheduleLastRunReasonText = scheduleLastRunReasonCode === "stopped_container"
? selectedVM.status === "stopped"
? t("vmLxc.scheduled.reasonStoppedContainer")
: t("vmLxc.scheduled.reasonStoppedContainerHistorical")
: scheduleLastRunReason
return (
<div className={`space-y-1.5 ${spacing}`}>
<div className="text-xs text-muted-foreground">
@@ -2443,14 +2467,14 @@ const handleDownloadLogs = async (vmid: number, vmName: string) => {
: scheduleLastRunStatus === "deferred"
? t("vmLxc.scheduled.runDeferred")
: scheduleLastRunStatus === "skipped"
? t("vmLxc.scheduled.runSkipped")
? t("vmLxc.scheduled.runSkippedStatus")
: t("vmLxc.scheduled.runFailed")}
</span></>
)}
</div>
{scheduleLastRunReason && (
{scheduleLastRunReasonText && (
<div className="text-xs text-muted-foreground break-words">
{scheduleLastRunReason}
{scheduleLastRunReasonText}
</div>
)}
{scheduleLastRunRebootRequired && (
+4 -1
View File
@@ -1302,7 +1302,10 @@
"Donnerstag",
"Freitag",
"Samstag"
]
],
"runSkippedStatus": "Lauf übersprungen",
"reasonStoppedContainer": "Container ist gestoppt; das geplante Update wurde übersprungen.",
"reasonStoppedContainerHistorical": "Der Container wurde zum geplanten Aktualisierungszeitpunkt gestoppt."
},
"cronChip": {
"detected": "Host-Cron erkannt",
+3
View File
@@ -1288,6 +1288,9 @@
"runFailed": "✗ failed",
"runDeferred": "held for safety",
"runSkipped": "nothing pending",
"runSkippedStatus": "run skipped",
"reasonStoppedContainer": "Container is stopped; scheduled update was skipped.",
"reasonStoppedContainerHistorical": "Container was stopped at the scheduled update time.",
"releaseDelaySummary": "{days}-day release hold",
"releaseDelayLabel": "Wait after a new app release",
"releaseDelayNone": "No waiting period",
+4 -1
View File
@@ -1302,7 +1302,10 @@
"jueves",
"viernes",
"sábado"
]
],
"runSkippedStatus": "ejecución omitida",
"reasonStoppedContainer": "El contenedor está parado; se ha omitido la actualización programada.",
"reasonStoppedContainerHistorical": "El contenedor estaba parado a la hora de la actualización programada."
},
"cronChip": {
"detected": "cron del host detectado",
+4 -1
View File
@@ -1302,7 +1302,10 @@
"Jeudi",
"Vendredi",
"Samedi"
]
],
"runSkippedStatus": "exécution ignorée",
"reasonStoppedContainer": "Le conteneur est arrêté ; la mise à jour programmée a été ignorée.",
"reasonStoppedContainerHistorical": "Le conteneur était arrêté à l'heure de la mise à jour programmée."
},
"cronChip": {
"detected": "cron hôte détecté",
+4 -1
View File
@@ -1302,7 +1302,10 @@
"Giovedì",
"Venerdì",
"Sabato"
]
],
"runSkippedStatus": "esecuzione saltata",
"reasonStoppedContainer": "Il contenitore è fermo; l'aggiornamento pianificato è stato saltato.",
"reasonStoppedContainerHistorical": "Il contenitore era fermo all'ora dell'aggiornamento pianificato."
},
"cronChip": {
"detected": "cron host rilevato",
+4 -1
View File
@@ -1302,7 +1302,10 @@
"Quinta-feira",
"Sexta-feira",
"Sábado"
]
],
"runSkippedStatus": "execução ignorada",
"reasonStoppedContainer": "O contêiner está parado; a atualização agendada foi ignorada.",
"reasonStoppedContainerHistorical": "O contêiner estava parado no horário da atualização agendada."
},
"cronChip": {
"detected": "cron do host detectado",
+3
View File
@@ -1288,6 +1288,9 @@
"runFailed": "✗ zlyhalo",
"runDeferred": "odložené z bezpečnostných dôvodov",
"runSkipped": "nič nečaká",
"runSkippedStatus": "spustenie bolo preskočené",
"reasonStoppedContainer": "Kontajner je vypnutý; plánovaná aktualizácia sa preskočila.",
"reasonStoppedContainerHistorical": "Kontajner bol v čase plánovanej aktualizácie vypnutý.",
"releaseDelaySummary": "odklad {days} deň/dní",
"releaseDelayLabel": "Počkať po novej verzii aplikácie",
"releaseDelayNone": "Bez čakacej doby",
+4 -1
View File
@@ -1302,7 +1302,10 @@
"torsdag",
"fredag",
"lördag"
]
],
"runSkippedStatus": "körning överhoppad",
"reasonStoppedContainer": "Behållaren är stoppad; den schemalagda uppdateringen hoppades över.",
"reasonStoppedContainerHistorical": "Behållaren stoppades vid den schemalagda uppdateringstiden."
},
"cronChip": {
"detected": "host cron upptäckt",
+44 -1
View File
@@ -22245,6 +22245,7 @@ def api_proxmenux_self_update_status():
# so scheduled and manual applies cannot overlap.
_APPLY_UPDATES_SCRIPT = _LXC_APPLY_UPDATES_SCRIPT
_SCHEDULED_STOPPED_EXIT = 9
_DOCKER_ENGINE_INTEGRATED_COMMAND = (
'python3 /usr/local/share/proxmenux/monitor-app/usr/bin/'
'update_docker_engine.py --vmid "$VMID"'
@@ -22286,6 +22287,23 @@ def _append_lxc_update_log(path: str | None, text: str) -> None:
print(f'[ProxMenux] scheduler: could not append update log: {exc}', flush=True)
def _scheduled_runner_reported_stopped(result, log_path: str | None, marker: str) -> bool:
"""Return true only for the scheduler's own pre-start stopped marker."""
if result.returncode != _SCHEDULED_STOPPED_EXIT or not marker:
return False
if log_path:
try:
with open(log_path, 'rb') as stream:
stream.seek(0, os.SEEK_END)
stream.seek(max(0, stream.tell() - 4096))
output = stream.read().decode('utf-8', errors='replace')
except OSError:
return False
else:
output = (result.stdout or '') + (result.stderr or '')
return marker in output
def _prune_lxc_update_logs(vmid: int) -> None:
try:
candidates = sorted(
@@ -22679,8 +22697,10 @@ def _run_scheduled_update(vmid: int, sched: dict) -> dict:
requested_targets = _normalise_schedule_targets(sched)
targets = list(requested_targets)
before = _lxc_update_snapshot(vmid)
requested_target = sched.get("target") or "both"
deferred_targets: list[str] = []
reasons: list[str] = []
reason_code: str | None = None
reboot_required: bool | None = None
reboot_packages: list[str] = []
reboot_check_error: str | None = None
@@ -22732,6 +22752,7 @@ def _run_scheduled_update(vmid: int, sched: dict) -> dict:
'status': status,
'target': actual_target,
'reason': reason,
'reason_code': reason_code,
'run_id': run_id,
'requested_targets': requested_targets,
'executed_targets': list(executed),
@@ -22743,10 +22764,23 @@ def _run_scheduled_update(vmid: int, sched: dict) -> dict:
'finalization': finalization,
}
requested_target = sched.get("target") or "both"
if not originally_running:
reason_code = 'stopped_container'
reasons.append('container is stopped; scheduled update was skipped')
return finish('skipped', requested_target, [])
if requested_targets == ['oci_image']:
# A container installed by OCI manager Apps is updated by replacing
# its image, through the same flow as the OCI menu, unattended.
# OCI updates have their own runner rather than apply_updates.sh.
# Check once more immediately before handing control to it: a user
# may have intentionally stopped the CT after the scheduler's first
# observation, and the OCI transaction can start a replacement CT
# while validating its new image.
if _fast_guest_status(vmid, 'lxc') != 'running':
reason_code = 'stopped_container'
reasons.append('container was stopped before scheduled update could begin')
return finish('skipped', 'oci_image', [])
command = ['bash', '/usr/local/share/proxmenux/scripts/oci/oci_manager_apps.sh',
'manage', str(vmid), '--action', 'update', '--unattended']
storage = (sched.get('backup_storage') or '').strip()
@@ -22887,6 +22921,9 @@ def _run_scheduled_update(vmid: int, sched: dict) -> dict:
target = "both" if has_os_target and has_app_targets else ("os" if has_os_target else "app")
env = dict(os.environ)
env["VMID"] = str(vmid)
env["EXECUTION_MODE"] = "scheduled"
scheduled_stopped_marker = f"PROXMENUX_SCHEDULED_STOPPED:{run_id}"
env["SCHEDULED_STOPPED_MARKER"] = scheduled_stopped_marker
env["TARGET"] = target
env["BACKUP"] = "1" if sched.get("backup") else "0"
env["BACKUP_STORAGE"] = sched.get("backup_storage") or ""
@@ -22952,6 +22989,10 @@ def _run_scheduled_update(vmid: int, sched: dict) -> dict:
text=True,
timeout=60 * 60,
)
if _scheduled_runner_reported_stopped(r, log_path, scheduled_stopped_marker):
reason_code = 'stopped_container'
reasons.append('container was stopped before scheduled update could begin')
return finish('skipped', target, [])
reboot_required, reboot_packages, reboot_check_error = (
_inspect_lxc_reboot_requirement(
vmid,
@@ -23027,12 +23068,14 @@ def _scheduler_loop():
status = outcome.get('status') or 'failure'
actual_target = outcome.get('target') or 'both'
reason = outcome.get('reason')
reason_code = outcome.get('reason_code')
try:
lxc_apps.record_schedule_run(
_vmid,
status,
actual_target,
reason,
reason_code=reason_code,
log_name=outcome.get('log_name'),
reboot_required=outcome.get('reboot_required'),
reboot_packages=outcome.get('reboot_packages'),
+43 -12
View File
@@ -94,6 +94,7 @@ _VALID_UPSTREAM_TYPES = ("github", "http_json", "docker_hub")
# `*/N` step, and comma lists — that covers every preset the UI
# exposes and the freeform "custom" text field.
_VALID_SCHEDULE_TARGETS = ("os", "app", "both")
_SCHEDULE_REASON_CODES = frozenset({"stopped_container"})
_SCHEDULE_TARGET_ID_RE = re.compile(
r"^(?:os|apps|oci_image|app:[A-Za-z0-9_-]{1,64}|docker-engine|docker-(?:compose|container):[A-Za-z0-9][A-Za-z0-9_.-]{0,127}|docker-unit:[a-f0-9]{20})$"
)
@@ -2081,8 +2082,28 @@ class _DockerNoRedirect(urllib.request.HTTPRedirectHandler):
_docker_no_redirect_opener = urllib.request.build_opener(_DockerNoRedirect)
def _registry_bearer_token(challenge: dict) -> tuple[Optional[str], Optional[str]]:
"""Exchange a parsed ``WWW-Authenticate`` challenge for a pull token."""
_REGISTRY_AUTH_FILE = "/etc/pve/priv/proxmenux/registry-auth.json"
_DOCKER_HUB_API_HOSTS = {"docker.io", "index.docker.io", "registry-1.docker.io", "registry.hub.docker.com"}
def _registry_saved_login(api_host: str) -> Optional[str]:
"""The login saved in ProxMenux for a registry, as a Basic credential."""
try:
with open(_REGISTRY_AUTH_FILE, encoding="utf-8") as handle:
auths = (json.load(handle) or {}).get("auths") or {}
except (OSError, ValueError, AttributeError):
return None
host = (api_host or "").lower()
for key in ([host, "docker.io"] if host in _DOCKER_HUB_API_HOSTS else [host]):
entry = auths.get(key) if isinstance(auths, dict) else None
if isinstance(entry, dict) and isinstance(entry.get("auth"), str) and entry["auth"]:
return f"Basic {entry['auth']}"
return None
def _registry_bearer_token(challenge: dict, saved_login: Optional[str] = None) -> tuple[Optional[str], Optional[str]]:
"""Exchange a parsed ``WWW-Authenticate`` challenge for a pull token,
with the login saved for a private registry when there is one."""
query = {
key: challenge[key]
for key in ("service", "scope") if challenge.get(key)
@@ -2090,10 +2111,10 @@ def _registry_bearer_token(challenge: dict) -> tuple[Optional[str], Optional[str
token_url = challenge["realm"]
if query:
token_url += ("&" if "?" in token_url else "?") + urllib.parse.urlencode(query)
token_req = urllib.request.Request(
token_url,
headers={"User-Agent": "ProxMenux-Monitor", "Accept": "application/json"},
)
token_headers = {"User-Agent": "ProxMenux-Monitor", "Accept": "application/json"}
if saved_login:
token_headers["Authorization"] = saved_login
token_req = urllib.request.Request(token_url, headers=token_headers)
try:
with urllib.request.urlopen(token_req, timeout=_docker_registry_timeout()) as response:
body = response.read(65537)
@@ -2160,13 +2181,18 @@ def _registry_request(url: str, headers: dict, method: str = "HEAD",
if error:
return None, None, token, error
if status == 401:
challenge = _parse_bearer_challenge((response_headers or {}).get("WWW-Authenticate", ""))
if not challenge:
authenticate = (response_headers or {}).get("WWW-Authenticate", "")
saved_login = _registry_saved_login(urllib.parse.urlsplit(url).netloc)
challenge = _parse_bearer_challenge(authenticate)
if challenge:
token, token_error = _registry_bearer_token(challenge, saved_login)
if token_error:
return None, None, None, token_error
attempt_headers["Authorization"] = f"Bearer {token}"
elif saved_login and authenticate.lower().startswith("basic") and url.startswith("https://"):
attempt_headers["Authorization"] = saved_login
else:
return None, None, token, "registry authentication required"
token, token_error = _registry_bearer_token(challenge)
if token_error:
return None, None, None, token_error
attempt_headers["Authorization"] = f"Bearer {token}"
response_headers, body, status, location, error = _registry_open(
url, attempt_headers, method, max_bytes,
)
@@ -3918,6 +3944,7 @@ def record_schedule_run(
target: str,
reason: Optional[str] = None,
*,
reason_code: Optional[str] = None,
log_name: Optional[str] = None,
reboot_required: Optional[bool] = None,
reboot_packages: Optional[list[str]] = None,
@@ -3937,6 +3964,10 @@ def record_schedule_run(
sidecar["schedule"]["last_run_reason"] = str(reason)[:300]
else:
sidecar["schedule"].pop("last_run_reason", None)
if reason_code in _SCHEDULE_REASON_CODES:
sidecar["schedule"]["last_run_reason_code"] = reason_code
else:
sidecar["schedule"].pop("last_run_reason_code", None)
if log_name:
sidecar["schedule"]["last_run_log"] = os.path.basename(str(log_name))[:220]
else:
@@ -33,6 +33,8 @@ class ScheduledUpdateRecordTests(unittest.TestCase):
self.vmid,
'success',
'both',
reason='container is stopped; scheduled update was skipped',
reason_code='stopped_container',
log_name='../9911-scheduled-' + ('a' * 32) + '.log',
reboot_required=True,
reboot_packages=['linux-image-amd64', 'libc6'],
@@ -43,11 +45,31 @@ class ScheduledUpdateRecordTests(unittest.TestCase):
'9911-scheduled-' + ('a' * 32) + '.log',
)
self.assertTrue(schedule['last_run_reboot_required'])
self.assertEqual(schedule['last_run_reason_code'], 'stopped_container')
self.assertEqual(
schedule['last_run_reboot_packages'],
['linux-image-amd64', 'libc6'],
)
def test_record_rejects_unknown_reason_code_and_clears_the_previous_one(self):
self.assertTrue(lxc_apps.record_schedule_run(
self.vmid,
'skipped',
'os',
reason='container is stopped; scheduled update was skipped',
reason_code='stopped_container',
))
self.assertTrue(lxc_apps.record_schedule_run(
self.vmid,
'failure',
'os',
reason='update runner exited with code 9',
reason_code='untrusted_value',
))
schedule = lxc_apps._read_sidecar(self.vmid)['schedule']
self.assertEqual(schedule['last_run_reason'], 'update runner exited with code 9')
self.assertNotIn('last_run_reason_code', schedule)
def test_lifecycle_clear_preserves_run_and_log(self):
lxc_apps.record_schedule_run(
self.vmid,
@@ -0,0 +1,101 @@
"""The update check of a private image uses the login saved in ProxMenux:
it is sent to the token service the registry names, or to the registry
itself when it asks for Basic authentication, and never anywhere else."""
import base64
import json
import sys
import tempfile
import unittest
from pathlib import Path
from unittest import mock
SCRIPTS_DIR = Path(__file__).resolve().parents[1]
if str(SCRIPTS_DIR) not in sys.path:
sys.path.insert(0, str(SCRIPTS_DIR))
import lxc_apps
CREDENTIAL = base64.b64encode(b"macrimi:ghp_secret").decode()
MANIFEST = "https://ghcr.io/v2/macrimi/app/manifests/latest"
class SavedLoginTests(unittest.TestCase):
def setUp(self):
self.folder = tempfile.TemporaryDirectory()
self.auth_file = Path(self.folder.name) / "registry-auth.json"
self.auth_file.write_text(json.dumps({"auths": {"ghcr.io": {"auth": CREDENTIAL},
"docker.io": {"auth": CREDENTIAL},
"registry.example.com:5000": {"auth": CREDENTIAL}}}))
patcher = mock.patch.object(lxc_apps, "_REGISTRY_AUTH_FILE", str(self.auth_file))
patcher.start()
self.addCleanup(patcher.stop)
self.addCleanup(self.folder.cleanup)
def test_the_login_is_found_by_registry_host(self):
self.assertEqual(lxc_apps._registry_saved_login("ghcr.io"), f"Basic {CREDENTIAL}")
self.assertEqual(lxc_apps._registry_saved_login("registry-1.docker.io"), f"Basic {CREDENTIAL}")
self.assertEqual(lxc_apps._registry_saved_login("registry.example.com:5000"), f"Basic {CREDENTIAL}")
self.assertIsNone(lxc_apps._registry_saved_login("quay.io"))
def test_without_the_file_nothing_is_sent(self):
self.auth_file.unlink()
self.assertIsNone(lxc_apps._registry_saved_login("ghcr.io"))
def test_a_bearer_challenge_asks_the_token_with_the_saved_login(self):
challenge = 'Bearer realm="https://ghcr.io/token",service="ghcr.io",scope="repository:macrimi/app:pull"'
answers = [({"WWW-Authenticate": challenge}, b"", 401, None, None),
({"Docker-Content-Digest": "sha256:abc"}, b"", 200, None, None)]
sent = []
def token_service(request, timeout):
sent.append(dict(request.header_items()))
response = mock.MagicMock()
response.__enter__.return_value.read.return_value = b'{"token": "pull-token"}'
return response
with mock.patch.object(lxc_apps, "_registry_open", side_effect=answers) as registry, \
mock.patch.object(lxc_apps.urllib.request, "urlopen", side_effect=token_service):
headers, _body, token, error = lxc_apps._registry_request(MANIFEST, {"Accept": "*/*"})
self.assertIsNone(error)
self.assertEqual(token, "pull-token")
self.assertEqual(sent[0]["Authorization"], f"Basic {CREDENTIAL}")
self.assertEqual(registry.call_args_list[1].args[1]["Authorization"], "Bearer pull-token")
def test_a_basic_challenge_is_answered_with_the_saved_login(self):
answers = [({"WWW-Authenticate": 'Basic realm="registry"'}, b"", 401, None, None),
({"Docker-Content-Digest": "sha256:abc"}, b"", 200, None, None)]
url = "https://registry.example.com:5000/v2/team/app/manifests/latest"
with mock.patch.object(lxc_apps, "_registry_open", side_effect=answers) as registry:
_headers, _body, _token, error = lxc_apps._registry_request(url, {"Accept": "*/*"})
self.assertIsNone(error)
self.assertEqual(registry.call_args_list[1].args[1]["Authorization"], f"Basic {CREDENTIAL}")
def test_a_basic_challenge_over_http_gets_no_login(self):
answers = [({"WWW-Authenticate": 'Basic realm="registry"'}, b"", 401, None, None)]
url = "http://registry.example.com:5000/v2/team/app/manifests/latest"
with mock.patch.object(lxc_apps, "_registry_open", side_effect=answers) as registry:
_headers, _body, _token, error = lxc_apps._registry_request(url, {"Accept": "*/*"})
self.assertEqual(error, "registry authentication required")
self.assertEqual(registry.call_count, 1)
def test_a_public_image_asks_its_token_without_a_login(self):
challenge = 'Bearer realm="https://auth.example.org/token",service="example",scope="repository:x:pull"'
answers = [({"WWW-Authenticate": challenge}, b"", 401, None, None),
({"Docker-Content-Digest": "sha256:abc"}, b"", 200, None, None)]
sent = []
def token_service(request, timeout):
sent.append(dict(request.header_items()))
response = mock.MagicMock()
response.__enter__.return_value.read.return_value = b'{"token": "t"}'
return response
with mock.patch.object(lxc_apps, "_registry_open", side_effect=answers), \
mock.patch.object(lxc_apps.urllib.request, "urlopen", side_effect=token_service):
lxc_apps._registry_request("https://quay.io/v2/x/manifests/latest", {})
self.assertNotIn("Authorization", sent[0])
if __name__ == "__main__":
unittest.main()
+15 -13
View File
@@ -506,7 +506,7 @@
"Authentication": "Authentifizierung",
"Authentication & Security": "Authentifizierung und Sicherheit",
"Authentication Error": "Authentifizierungsfehler",
"Authentication failed for {registry}. Check the account and token permissions.": "Authentication failed for {registry}.Check the account and token permissions.",
"Authentication failed for {registry}. Check the account and token permissions.": "Authentication failed for {registry}. Check the account and token permissions.",
"Authentication failed.": "Die Authentifizierung ist fehlgeschlagen.",
"Authentication required:": "Authentifizierung erforderlich:",
"Authentication:": "Authentifizierung:",
@@ -1387,7 +1387,7 @@
"Could not remove VM automatically. Run manually:": "VM konnte nicht automatisch entfernt werden. Manuell ausführen:",
"Could not remove ZRAM profile; configuration was restored": "ZRAM-Profil konnte nicht entfernt werden; Die Konfiguration wurde wiederhergestellt",
"Could not remove ZRAM profile; configuration was restored but swap could not be restarted": "ZRAM-Profil konnte nicht entfernt werden; Die Konfiguration wurde wiederhergestellt, aber der Swap konnte nicht neu gestartet werden",
"Could not remove credentials for {registry}; saved file credentials were not changed.": "Anmeldeinformationen für {registry} konnten nicht entfernt werden;Die Anmeldeinformationen der gespeicherten Datei wurden nicht geändert.",
"Could not remove credentials for {registry}; saved file credentials were not changed.": "Anmeldeinformationen für {registry} konnten nicht entfernt werden; Die Anmeldeinformationen der gespeicherten Datei wurden nicht geändert.",
"Could not remove previous DKMS tree at": "Vorheriger DKMS-Baum konnte nicht entfernt werden",
"Could not reserve a private network for the stack": "Konnte kein privates Netzwerk für den Stack reservieren",
"Could not resolve the Compose user:": "Konnte den Compose-Benutzer nicht lösen:",
@@ -1496,7 +1496,8 @@
"Credentials file created securely.": "Anmeldeinformationsdatei sicher erstellt.",
"Credentials file removed.": "Anmeldeinformationsdatei entfernt.",
"Credentials file:": "Anmeldeinformationsdatei:",
"Credentials file:\n{path}\n\nOwned by root; directory mode 700 and file mode 600.\nBasic credentials are base64 encoded, not encrypted.\nCredential helpers use their own storage.\n\nUse an access token with permission to pull images.\nConfigure credentials on each node that downloads images.": "Anmeldeinformationsdatei:\n{path}\n\nIm Besitz von root;Verzeichnismodus 700 und Dateimodus 600.\nGrundlegende Anmeldeinformationen sind Base64-codiert und nicht verschlüsselt.\nAnmeldeinformationshelfer nutzen ihren eigenen Speicher.\n\nVerwenden Sie ein Zugriffstoken mit der Berechtigung zum Abrufen von Bildern.\nKonfigurieren Sie Anmeldeinformationen für jeden Knoten, der Bilder herunterlädt.",
"Credentials file:\n{path}\n\nOwned by root; directory mode 700 and file mode 600.\nBasic credentials are base64 encoded, not encrypted.\nCredential helpers use their own storage.\n\nUse an access token with permission to pull images.\nConfigure credentials on each node that downloads images.": "Anmeldeinformationsdatei:\n{path}\n\nIm Besitz von root; Verzeichnismodus 700 und Dateimodus 600.\nGrundlegende Anmeldeinformationen sind Base64-codiert und nicht verschlüsselt.\nAnmeldeinformationshelfer nutzen ihren eigenen Speicher.\n\nVerwenden Sie ein Zugriffstoken mit der Berechtigung zum Abrufen von Bildern.\nKonfigurieren Sie Anmeldeinformationen für jeden Knoten, der Bilder herunterlädt.",
"Credentials file:\n{path}\n\nOwned by root; directory mode 700 and file mode 600.\nBasic credentials are base64 encoded, not encrypted.\nCredential helpers use their own storage.\n\nUse an access token with permission to pull images.\nEvery node of the cluster uses the accounts saved here.": "Anmeldeinformationsdatei:\n{path}\n\nIm Besitz von root; Verzeichnismodus 700 und Dateimodus 600.\nGrundlegende Anmeldeinformationen sind Base64-codiert und nicht verschlüsselt.\nAnmeldeinformationshelfer nutzen ihren eigenen Speicher.\n\nVerwenden Sie ein Zugriffstoken mit der Berechtigung zum Abrufen von Bildern.\nJeder Knoten des Clusters verwendet die hier gespeicherten Konten.",
"Credentials validated successfully": "Anmeldeinformationen erfolgreich validiert",
"Cross-host restore: guest IDs in backup overlap live IDs on target:": "Hostübergreifende Wiederherstellung: Gast-IDs im Backup überschneiden sich mit Live-IDs auf dem Ziel:",
"Cross-kernel restore — kernel-tied paths merged, not copied": "Kernelübergreifende Wiederherstellung – Kernel-gebundene Pfade werden zusammengeführt, nicht kopiert",
@@ -2923,7 +2924,7 @@
"Image downloaded and verified.\n\n{reference}\n\nStorage: {storage}\nArchive size: {size}\nArchive: {archive}\n\nNo container was created.\nProxMenux removes unused cached images after successful updates.": "Bild heruntergeladen und überprüft.\n\n{reference}\n\nSpeicher: {storage}\nArchivgröße: {size}\nArchiv: {archive}\n\nEs wurde kein Container erstellt.\nProxMenux entfernt nicht verwendete zwischengespeicherte Bilder nach erfolgreichen Updates.",
"Image file not found:": "Bilddatei nicht gefunden:",
"Image imported:": "Bild importiert:",
"Image integrity verification failed. The partial download was discarded; try again.": "Überprüfung der Bildintegrität fehlgeschlagen. Der teilweise Download wurde verworfen;versuchen Sie es erneut.",
"Image integrity verification failed. The partial download was discarded; try again.": "Überprüfung der Bildintegrität fehlgeschlagen. Der teilweise Download wurde verworfen; versuchen Sie es erneut.",
"Image integrity verified": "Überprüfung der Integrität des Bildes",
"Image not allowed for the host monitor profile": "Bild nicht erlaubt für das Host-Monitor-Profil",
"Image reference": "Bildreferenz",
@@ -3566,8 +3567,8 @@
"Log2RAM write scheduled every": "Log2RAM-Schreibvorgang alle geplant",
"Log:": "Protokoll:",
"Logged-in users": "Angemeldete Benutzer",
"Login to {registry} timed out. Saved credentials were not changed.": "Zeitüberschreitung bei der Anmeldung bei {registry}.Gespeicherte Anmeldeinformationen wurden nicht geändert.",
"Logout from {registry} timed out. Saved file credentials were not changed.": "Zeitüberschreitung beim Abmelden von {registry}.Die Anmeldeinformationen der gespeicherten Datei wurden nicht geändert.",
"Login to {registry} timed out. Saved credentials were not changed.": "Zeitüberschreitung bei der Anmeldung bei {registry}. Gespeicherte Anmeldeinformationen wurden nicht geändert.",
"Logout from {registry} timed out. Saved file credentials were not changed.": "Zeitüberschreitung beim Abmelden von {registry}. Die Anmeldeinformationen der gespeicherten Datei wurden nicht geändert.",
"Logrotate optimization completed": "Logrotate-Optimierung abgeschlossen",
"Logrotate service restarted successfully": "Der Logrotate-Dienst wurde erfolgreich neu gestartet",
"Lollypop is a lightweight modern music player designed to work excellently on the GNOME desktop environment.": "Lollypop ist ein leichter moderner Musikplayer, der hervorragend auf der GNOME-Desktopumgebung funktioniert.",
@@ -4336,7 +4337,7 @@
"Not currently mounted — skipping umount.": "Derzeit nicht gemountet – umount wird übersprungen.",
"Not declared": "Nicht deklariert",
"Not enough free space for the backup": "Nicht genug freier Speicherplatz für das Backup",
"Not enough free space on {storage}. Free some space or select another storage.": "Nicht genügend freier Speicherplatz auf {storage}.Geben Sie Speicherplatz frei oder wählen Sie einen anderen Speicher aus.",
"Not enough free space on {storage}. Free some space or select another storage.": "Nicht genügend freier Speicherplatz auf {storage}. Geben Sie Speicherplatz frei oder wählen Sie einen anderen Speicher aus.",
"Not found": "Nicht gefunden",
"Not found in the OCI archive:": "Nicht im OCI-Archiv gefunden:",
"Not imported:": "Nicht importiert:",
@@ -6365,7 +6366,7 @@
"The containers do not need them any more; an update downloads the new versions when there are any.": "Die Container brauchen sie nicht mehr; ein Update lädt die neuen Versionen herunter, wenn es welche gibt.",
"The containers were created from downloaded OCI images": "Die Container wurden aus heruntergeladenen OCI-Bildern erstellt",
"The coordinated backup was modified": "Das koordinierte Backup wurde modifiziert",
"The credential file changed during this operation. Try again; it was not overwritten.": "Die Anmeldeinformationsdatei wurde während dieses Vorgangs geändert. Versuchen Sie es erneut;es wurde nicht überschrieben.",
"The credential file changed during this operation. Try again; it was not overwritten.": "Die Anmeldeinformationsdatei wurde während dieses Vorgangs geändert. Versuchen Sie es erneut; es wurde nicht überschrieben.",
"The current driver will be completely uninstalled before installing the new version. Continue?": "Der aktuelle Treiber wird vor der Installation der neuen Version vollständig deinstalliert. Weitermachen?",
"The current image of the saved channel will be checked and downloaded. Resources, paths and GPU are kept. The CT is stopped during the replacement and a native backup is created first.": "Das aktuelle Bild des gespeicherten Kanals wird überprüft und heruntergeladen. Ressourcen, Pfade und GPU werden beibehalten. Der CT wird während des Austauschs gestoppt und zuerst ein natives Backup erstellt.",
"The current record is missing for": "Der aktuelle Rekord fehlt für",
@@ -6602,7 +6603,7 @@
"The record or diagnosis could not be completed; no update was run.": "Die Aufzeichnung oder Diagnose konnte nicht abgeschlossen werden; kein Update wurde ausgeführt.",
"The recovery did not complete. Review the log and choose \"Recover\" again for this container in the OCI management menu.": "Die Rückforderung war nicht abgeschlossen. Überprüfen Sie das Protokoll und wählen Sie erneut \"Wiederherstellen\" für diesen Container im OCI-Verwaltungsmenü.",
"The recovery did not complete. Review the log and choose \"{choice}\" again for this container in the OCI management menu.": "Die Wiederherstellung wurde nicht abgeschlossen. Prüfen Sie das Protokoll und wählen Sie für diesen Container im OCI-Verwaltungsmenü erneut \"{choice}\".",
"The registry authentication file is invalid; it was not changed.": "Die Registrierungsauthentifizierungsdatei ist ungültig;es wurde nicht geändert.",
"The registry authentication file is invalid; it was not changed.": "Die Registrierungsauthentifizierungsdatei ist ungültig; es wurde nicht geändert.",
"The registry authentication file must be owned by root with mode 600.": "Die Registrierungsauthentifizierungsdatei muss Root mit Modus 600 gehören.",
"The registry authentication file must have an absolute path.": "Die Registrierungsauthentifizierungsdatei muss einen absoluten Pfad haben.",
"The registry authentication path cannot contain symbolic links.": "Der Registrierungsauthentifizierungspfad darf keine symbolischen Links enthalten.",
@@ -6769,7 +6770,7 @@
"This GPU is considered incompatible with GPU passthrough to a VM in ProxMenux.": "Diese GPU gilt als inkompatibel mit GPU-Passthrough zu einer VM in ProxMenux.",
"This NFS share is fully restricted — even the host root cannot write to it.": "Diese NFS-Freigabe ist vollständig eingeschränkt – selbst der Host-Root kann nicht darauf schreiben.",
"This VM requires extra installation steps, see install guide at:\nhttps://github.com/community-scripts/ProxmoxVE/discussions/144": "Für diese VM sind zusätzliche Installationsschritte erforderlich. Weitere Informationen finden Sie im Installationshandbuch unter:\nhttps://github.com/community-scripts/ProxmoxVE/discussions/144",
"This account is for {registry}. Enter an image from that registry.": "Dieses Konto ist für {registry}.Geben Sie ein Bild aus dieser Registrierung ein.",
"This account is for {registry}. Enter an image from that registry.": "Dieses Konto ist für {registry}. Geben Sie ein Bild aus dieser Registrierung ein.",
"This action will:": "Diese Aktion wird:",
"This application cannot be recovered yet:": "Diese Anwendung kann noch nicht wiederhergestellt werden:",
"This application cannot be recovered yet; nothing was changed:": "Diese Anwendung kann noch nicht wiederhergestellt werden; es wurde nichts geändert:",
@@ -7640,7 +7641,7 @@
"assembling": "Montage",
"automatically. Install it manually inside the container.": "automatisch. Installieren Sie es manuell im Container.",
"automatically. Reboot LXC to fully release.": "automatisch. Starten Sie LXC neu, um es vollständig freizugeben.",
"available": "verfügbar",
"available": "Verfügbar",
"available for LXC bind-mounts via 'LXC Mount Manager'": "verfügbar für LXC-Bind-Mounts über „LXC Mount Manager“",
"available in this same GPU and TPU menu.": "verfügbar im selben GPU- und TPU-Menü.",
"backup at /etc/fstab.proxmenux.bak": "Backup unter /etc/fstab.proxmenux.bak",
@@ -7993,7 +7994,7 @@
"runs in": "läuft",
"safe paths now (configs, packages, /etc, /root, ...)": "Jetzt sichere Pfade (Konfigurationen, Pakete, /etc, /root, ...)",
"same MAC": "gleicher MAC",
"saved": "gespeichert",
"saved": "Gespeichert",
"seconds (default)": "Sekunden (Standard)",
"see log:": "siehe Protokoll:",
"selected by default": "Standardmäßig ausgewählt",
@@ -8116,9 +8117,10 @@
"{count} saved accounts.": "{count} gespeicherte Konten.",
"{path} already exists and belongs to another user of the host, so {app} cannot write to it.\n\nProxMenux can add access rules (ACL) to this directory, to everything inside it and to what is created there later, for the users and groups {app} runs as on the host (IDs {ids}). The owner of the files does not change and whatever reads or writes them today keeps doing so; the owner of the directory also gets access to the files {app} creates.\n\nGrant {app} access to this directory?": "{path} existiert bereits und gehört einem anderen Benutzer des Hosts, daher kann {app} nicht darauf schreiben.\n\nProxMenux kann Zugriffsregeln (ACL) zu diesem Verzeichnis, zu allem darin und zu dem, was später dort erstellt wird, für die Benutzer und Gruppen hinzufügen, unter denen {app} auf dem Host läuft (IDs {ids}). Der Eigentümer der Dateien ändert sich nicht, und was sie heute liest oder schreibt, tut dies weiterhin; der Eigentümer des Verzeichnisses erhält außerdem Zugriff auf die von {app} erstellten Dateien.\n\n{app} Zugriff auf dieses Verzeichnis gewähren?",
"{path} already exists and belongs to another user of the host, so {app} cannot write to it.\n\nProxMenux can add an access rule (ACL) for the identity {app} uses on the host (UID {uid}). Nothing that is there changes owner or permissions: whatever reads or writes those files today keeps doing so, and the owner of the directory also gets access to the files {app} creates.\n\nGrant {app} access to this directory?": "{path} existiert bereits und gehört einem anderen Benutzer des Hosts, daher kann {app} nicht darauf schreiben.\n\nProxMenux kann eine Zugriffsregel (ACL) für die Identität hinzufügen, die {app} auf dem Host verwendet (UID {uid}).Nichts, was dort ist, ändert den Besitzer oder die Berechtigungen: Was auch immer diese Dateien heute liest oder schreibt, tut dies weiterhin, und der Besitzer des Verzeichnisses erhält auch Zugriff auf die Dateien, die {app} erstellt.\n\n{app} Zugriff auf dieses Verzeichnis gewähren?",
"{registry} answered with plain HTTP. Use a registry with HTTPS; TLS verification remains enabled.": "{registry} hat mit einfachem HTTP geantwortet. Verwenden Sie eine Registrierung mit HTTPS;Die TLS-Überprüfung bleibt aktiviert.",
"{registry} answered with plain HTTP. Use a registry with HTTPS; TLS verification remains enabled.": "{registry} hat mit einfachem HTTP geantwortet. Verwenden Sie eine Registrierung mit HTTPS; Die TLS-Überprüfung bleibt aktiviert.",
"{registry} did not respond within {timeout} seconds. Try again later.": "{registry} hat nicht innerhalb von {timeout} Sekunden geantwortet. Versuchen Sie es später noch einmal.",
"{registry} is rate limiting requests. Wait a while and try again.": "Bei {registry} handelt es sich um ratenbegrenzende Anfragen. Warten Sie eine Weile und versuchen Sie es erneut.",
"{registry} refused access to this image:\n{reference}\n\nIf the image is private, sign in with an account that can pull it.\n\nSign in now?": "{registry} hat den Zugriff auf dieses Bild verweigert:\n{reference}\n\nWenn das Bild privat ist, melden Sie sich mit einem Konto an, das es abrufen kann.\n\nJetzt anmelden?",
"{registry} reported a server error. Try again later.": "{registry} hat einen Serverfehler gemeldet. Versuchen Sie es später noch einmal.",
"{registry} returned invalid or unsupported image metadata.": "{registry} hat ungültige oder nicht unterstützte Bildmetadaten zurückgegeben.",
"— Full/Custom restore will skip kernel-tied paths": "– Bei der vollständigen/benutzerdefinierten Wiederherstellung werden an den Kernel gebundene Pfade übersprungen",
+87 -85
View File
@@ -190,7 +190,7 @@
"Access bridge for Paperless": "Puente de acceso para Paperless",
"Access bridge for Tandoor": "Puente de acceso para Tandoor",
"Access could not be granted completely; the application may be unable to write to:": "No se pudo conceder el acceso por completo; puede que la aplicación no pueda escribir en:",
"Access denied by {registry}. Check the image name and sign in from Registry accounts.": "Acceso denegado por {registry}.Verifique el nombre de la imagen e inicie sesión desde las cuentas del Registro.",
"Access denied by {registry}. Check the image name and sign in from Registry accounts.": "{registry} ha denegado el acceso. Comprueba el nombre de la imagen e inicia sesión desde Cuentas de registro.",
"Access granted to the application on:": "Acceso concedido a la aplicación en:",
"Access password of the web interface (optional)": "Contraseña de acceso a la interfaz web (opcional)",
"Access profile:": "Perfil de acceso:",
@@ -309,7 +309,7 @@
"Advanced": "Avanzado",
"Advanced Diagnostics": "Diagnóstico avanzado",
"Advanced Network Diagnostics": "Diagnóstico de red avanzado",
"Advanced settings": "configuración avanzada",
"Advanced settings": "Configuración avanzada",
"Advanced: every setting of the container": "Avanzado: cada configuración del contenedor",
"Affected LXC containers": "Contenedores LXC afectados",
"After completing GPU setup, start the VM manually when the host is ready.": "Después de completar la configuración de la GPU, inicie la VM manualmente cuando el host esté listo.",
@@ -401,7 +401,7 @@
"Another OCI operation is using the instance registry. Wait for it to finish and open this menu again; no container is modified.": "Otra operación OCI está usando el registro de instancias. Espera a que termine y vuelve a abrir este menú; no se modifica ningún contenedor.",
"Another OCI operation is using the instance registry. Wait for it to finish.": "Otra operación OCI está usando el registro de instancias. Espera a que termine.",
"Another OCI operation is using the registry. This operation was not started.": "Otra operación OCI está utilizando el registro. Esta operación no se inició.",
"Another ProxMenux OCI operation is running. Try again when it finishes.": "se está ejecutando otra operación ProxMenux OCI.Inténtalo de nuevo cuando termine.",
"Another ProxMenux OCI operation is running. Try again when it finishes.": "Hay otra operación OCI de ProxMenux en curso. Inténtalo de nuevo cuando termine.",
"Another ZRAM configuration exists or could not be inspected; systemd-zram-generator was retained": "Existe otra configuración de ZRAM o no se pudo inspeccionar; se conserva systemd-zram-generator",
"Another ZRAM generator configuration exists; refusing to overwrite it:": "Existe otra configuración del generador de ZRAM; no se sobrescribe:",
"Another ZRAM swap setup exists; refusing to replace it:": "Existe otra configuración de swap con ZRAM; no se sustituye:",
@@ -409,7 +409,7 @@
"Another instance uses": "Otro caso utiliza",
"Another job that writes to the same storage still starts them.": "Otro trabajo que escriba en el mismo almacenamiento los sigue lanzando.",
"Another node, typed by hand": "Otro nodo, escrito a mano",
"Another registry account operation is running. Try again when it finishes.": "se está ejecutando otra operación de cuenta de registro. Inténtalo de nuevo cuando termine.",
"Another registry account operation is running. Try again when it finishes.": "Hay otra operación con las cuentas de registro en curso. Inténtalo de nuevo cuando termine.",
"Another stack operation is pending": "Hay otra operación de pila pendiente",
"Application": "Aplicación",
"Application Specific": "Específico de la aplicación",
@@ -504,7 +504,7 @@
"Authentication": "Autenticación",
"Authentication & Security": "Authentication & Security",
"Authentication Error": "Error de autenticación",
"Authentication failed for {registry}. Check the account and token permissions.": "Error de autenticación para {registry}.Verifique la cuenta y los permisos del token.",
"Authentication failed for {registry}. Check the account and token permissions.": "{registry} no ha aceptado la autenticación. Comprueba la cuenta y los permisos del token.",
"Authentication failed.": "La autenticación falló.",
"Authentication required:": "Se requiere autenticación:",
"Authentication:": "Autenticación:",
@@ -743,7 +743,7 @@
"Cannot resolve the container home directory:": "No se puede resolver el directorio de inicio del contenedor:",
"Cannot validate credentials - no shares available for testing.": "No se pueden validar las credenciales: no hay recursos compartidos disponibles para realizar pruebas.",
"Cannot verify the reused disk:": "No se puede verificar el disco reutilizado:",
"Cannot write the image archive to {storage}. Check storage access and mount status.": "No se puede escribir el archivo de imágenes en {storage}.Verifique el acceso al almacenamiento y el estado del montaje.",
"Cannot write the image archive to {storage}. Check storage access and mount status.": "No se puede escribir el archivo de la imagen en {storage}. Comprueba el acceso al almacenamiento y que esté montado.",
"Capabilities cannot be kept and all dropped at the same time": "No se pueden mantener las capacidades y todas se disminuyen al mismo tiempo",
"Category": "Categoría",
"Caution: Maximum mode generates more heat.": "Precaución: el modo máximo genera más calor.",
@@ -805,7 +805,7 @@
"Check Samba Status": "Verificar el estado de Samba",
"Check VM disk/PCI slots": "Verifique el disco VM/ranuras PCI",
"Check VM passthrough settings": "Revise la configuración de passthrough de la VM",
"Check access to an image": "comprobar el acceso a una imagen",
"Check access to an image": "Comprobar el acceso a una imagen",
"Check connectivity with another host": "Verificar la conectividad con otro host",
"Check container mount points": "Verifique los puntos de montaje del contenedor",
"Check if container is unprivileged:": "Compruebe si el contenedor no tiene privilegios:",
@@ -818,7 +818,7 @@
"Check that:": "Comprueba que:",
"Check the error messages above for details.": "Consulte los mensajes de error anteriores para obtener más detalles.",
"Check the image reference and registry access. If the registry is unavailable, try again later. A private registry needs credentials, which are not supported yet.": "Comprueba la referencia de la imagen y el acceso al registro. Si el registro no está disponible, inténtalo más tarde. Un registro privado necesita credenciales, que todavía no se admiten.",
"Check the image reference and registry access. If the registry is unavailable, try again later. For a private image, sign in from Registry accounts in the OCI menu.": "Verifique la referencia de la imagen y el acceso al registro. Si el registro no está disponible, inténtelo de nuevo más tarde. Para obtener una imagen privada, inicie sesión desde las cuentas del Registro en el menú OCI.",
"Check the image reference and registry access. If the registry is unavailable, try again later. For a private image, sign in from Registry accounts in the OCI menu.": "Comprueba la referencia de la imagen y el acceso al registro. Si el registro no está disponible, inténtalo más tarde. Para una imagen privada, inicia sesión desde Cuentas de registro en el menú OCI.",
"Check the service status manually if needed.": "Verifique el estado del servicio manualmente si es necesario.",
"Checking MOTD configuration...": "Comprobando la configuración del MOTD...",
"Checking NVIDIA driver status with nvidia-smi": "Comprobar el estado del controlador NVIDIA con nvidia-smi",
@@ -832,7 +832,7 @@
"Checking free space in /var/cache/apt/archives...": "Comprobando espacio libre en /var/cache/apt/archives...",
"Checking if system disk is SSD or M.2...": "Comprobando si el disco del sistema es SSD o M.2...",
"Checking if the server belongs to OVH...": "Comprobando si el servidor pertenece a OVH...",
"Checking image access and metadata. Please wait...": "comprobar el acceso a las imágenes y los metadatos. Espere por favor...",
"Checking image access and metadata. Please wait...": "Comprobando el acceso a la imagen y sus metadatos. Espera...",
"Checking kernel headers and build tools...": "Comprobando los encabezados del kernel y las herramientas de compilación...",
"Checking remaining interfaces": "Comprobando las interfaces restantes",
"Checking that the container keeps running...": "Comprobando que el contenedor sigue funcionando...",
@@ -905,7 +905,7 @@
"Choose iperf3 mode:": "Elige el modo iperf3:",
"Choose options to configure:": "Elige opciones para configurar:",
"Choose specific VMs/CTs": "Elegir VM/CT concretas",
"Choose storage for the downloaded image.": "elija el almacenamiento para la imagen descargada.",
"Choose storage for the downloaded image.": "Elige el almacenamiento para la imagen descargada.",
"Choose the driver version for Coral M.2:": "Elige la versión del controlador para Coral M.2:",
"Choose the filesystem for the new partition:": "Elige el sistema de archivos para la nueva partición:",
"Choose the release channel to use:": "Elige el canal de release que quieres usar:",
@@ -1372,20 +1372,20 @@
"Could not publish pending restore. Previous pending restore was kept.": "No se pudo publicar la restauración pendiente. Se mantiene la anterior.",
"Could not push the key. Check the password and that": "No se pudo presionar la tecla. Verifique la contraseña y eso",
"Could not query the image registry": "No se puede consultar el registro de imágenes",
"Could not reach {registry}. Check its address, DNS and network access.": "No se pudo alcanzar {registry}.Verifique su dirección, DNS y acceso a la red.",
"Could not reach {registry}. Check its address, DNS and network access.": "No se pudo contactar con {registry}. Comprueba su dirección, el DNS y el acceso a la red.",
"Could not read SMART data from": "No se pudieron leer los datos SMART de",
"Could not read VM configuration.": "No se pudo leer la configuración de la VM.",
"Could not read the CUDA compute capability": "No podía leer la capacidad de cálculo de CUDA",
"Could not read the NVIDIA driver version": "No podía leer la versión del controlador NVIDIA",
"Could not read the host firewall rules": "No se pudieron leer las reglas del cortafuegos del host",
"Could not read the image from {registry}. Check the reference and sign in from Registry accounts.": "No se pudo leer la imagen de {registry}.Verifique la referencia e inicie sesión desde las cuentas del Registro.",
"Could not read the image from {registry}. Check the reference and sign in from Registry accounts.": "No se pudo leer la imagen de {registry}. Comprueba la referencia e inicia sesión desde Cuentas de registro.",
"Could not read this job.": "No se pudo leer este trabajo.",
"Could not release ZRAM pages; existing profile remains active": "No se pudieron liberar las páginas de ZRAM; el perfil actual sigue activo",
"Could not remount automatically. Try manually or check credentials.": "No se pudo volver a montar automáticamente. Pruebe manualmente o verifique las credenciales.",
"Could not remove VM automatically. Run manually:": "No se pudo eliminar la VM automáticamente. Ejecutar manualmente:",
"Could not remove ZRAM profile; configuration was restored": "No se pudo eliminar el perfil de ZRAM; se restauró la configuración",
"Could not remove ZRAM profile; configuration was restored but swap could not be restarted": "No se pudo eliminar el perfil de ZRAM; se restauró la configuración, pero no se pudo reiniciar el swap",
"Could not remove credentials for {registry}; saved file credentials were not changed.": "No se pudieron eliminar las credenciales de {registry};Las credenciales del archivo guardado no se cambiaron.",
"Could not remove credentials for {registry}; saved file credentials were not changed.": "No se pudieron eliminar las credenciales de {registry}; las credenciales guardadas no han cambiado.",
"Could not remove previous DKMS tree at": "No se pudo eliminar el árbol DKMS anterior en",
"Could not reserve a private network for the stack": "No se pudo reservar una red privada para la pila",
"Could not resolve the Compose user:": "No podía resolver el usuario de Compose:",
@@ -1400,7 +1400,7 @@
"Could not set VM virtual display to vga: std": "No se pudo configurar la pantalla virtual de VM en vga: estándar",
"Could not set boot order for": "No se pudo establecer el orden de inicio para",
"Could not set the container entrypoint": "No podía establecer el punto de entrada del contenedor",
"Could not sign in to {registry}. Check registry access and token permissions.": "No se pudo iniciar sesión en {registry}.Verifique el acceso al registro y los permisos de token.",
"Could not sign in to {registry}. Check registry access and token permissions.": "No se pudo iniciar sesión en {registry}. Comprueba el acceso al registro y los permisos del token.",
"Could not stage pending restore path:": "No se pudo preparar la ruta de la restauración pendiente:",
"Could not stage pending restore. Nothing new was scheduled.": "No se pudo preparar la restauración pendiente. No se ha programado nada nuevo.",
"Could not stop LXC": "No se pudo detener LXC",
@@ -1487,14 +1487,15 @@
"Creating the private network...": "Creando la red privada...",
"Creating the temporary data container": "Creando el contenedor temporal para los datos",
"Creative & Design": "Creative & Design",
"Credential helper": "ayudante de credenciales",
"Credential storage and access": "almacenamiento y acceso a credenciales",
"Credential helper": "Asistente de credenciales",
"Credential storage and access": "Dónde se guardan las credenciales",
"Credentials are correct": "Las credenciales son correctas",
"Credentials cleared. jwt_secret and API tokens preserved.": "Credenciales borradas. Se conservan jwt_secret y los tokens de API.",
"Credentials file created securely.": "Archivo de credenciales creado de forma segura.",
"Credentials file removed.": "Archivo de credenciales eliminado.",
"Credentials file:": "Archivo de credenciales:",
"Credentials file:\n{path}\n\nOwned by root; directory mode 700 and file mode 600.\nBasic credentials are base64 encoded, not encrypted.\nCredential helpers use their own storage.\n\nUse an access token with permission to pull images.\nConfigure credentials on each node that downloads images.": "Archivo de credenciales:\n{path}\n\nPropiedad de raíz;modo directorio 700 y modo archivo 600.\nLas credenciales básicas están codificadas en base64, no cifradas.\nLos asistentes de credenciales utilizan su propio almacenamiento.\n\nUtilice un token de acceso con permiso para extraer imágenes.\nConfigure las credenciales en cada nodo que descarga imágenes.",
"Credentials file:\n{path}\n\nOwned by root; directory mode 700 and file mode 600.\nBasic credentials are base64 encoded, not encrypted.\nCredential helpers use their own storage.\n\nUse an access token with permission to pull images.\nEvery node of the cluster uses the accounts saved here.": "Fichero de credenciales:\n{path}\n\nPropiedad de root; carpeta con modo 700 y fichero con modo 600.\nLas credenciales básicas van en base64, no cifradas.\nLos asistentes de credenciales usan su propio almacén.\n\nUsa un token de acceso con permiso para descargar imágenes.\nTodos los nodos del clúster usan las cuentas guardadas aquí.",
"Credentials validated successfully": "Credenciales validadas correctamente",
"Cross-host restore: guest IDs in backup overlap live IDs on target:": "Restauración entre hosts: los ID de VM/CT del backup coinciden con ID activos en el destino:",
"Cross-kernel restore — kernel-tied paths merged, not copied": "Restauración entre kernels — rutas vinculadas al kernel fusionadas, no copiadas",
@@ -1632,7 +1633,7 @@
"Default login": "Acceso predeterminado",
"Default options": "Opciones predeterminadas",
"Default options read/write": "Opciones predeterminadas lectura/escritura",
"Default settings": "configuración predeterminada",
"Default settings": "Configuración por defecto",
"Default will be used:": "Se utilizará el valor predeterminado:",
"Default:": "Predeterminado:",
"Default: only what the application needs": "Por defecto: solo lo que la aplicación necesita",
@@ -1867,7 +1868,7 @@
"Doplarr_rs is a Discord bot for requesting media through *arr backends, written in Rust.": "Doplarr_rs es un bot de Discord, escrito en Rust, para solicitar contenido a través de backends *arr.",
"Double Commander is a free cross platform open source file manager with two panels side by side. It is inspired by Total Commander and features some new ideas.": "Double Commander es un gestor de archivos gratuito, multiplataforma y de código abierto con dos paneles en paralelo. Se inspira en Total Commander y aporta algunas ideas nuevas.",
"Download Spotify music with album art and metadata": "Descarga música de Spotify con carátulas y metadatos",
"Download an image to template storage": "descargar una imagen al almacenamiento de plantillas",
"Download an image to template storage": "Descargar una imagen al almacenamiento de plantillas",
"Download an oci-compose from an address": "Descargar un oci-compose desde una dirección",
"Download failed for all attempted URLs": "La descarga falló en todos los intentos de URL",
"Download its Compose file from an address": "Descargar su archivo Compose desde una dirección",
@@ -1883,7 +1884,7 @@
"Downloading Proxmology logo...": "Descargando el logo de Proxmology...",
"Downloading UUP converter...": "Descargando el convertidor UUP...",
"Downloading amdgpu_top": "Descargando amdgpu_top",
"Downloading and verifying the image.\nThis can take a few minutes. Please wait...": "Descargar y verificar la imagen.\nEsto puede tardar unos minutos. Espere por favor...",
"Downloading and verifying the image.\nThis can take a few minutes. Please wait...": "Descargando y verificando la imagen.\nPuede tardar unos minutos. Espera...",
"Downloading official installer...": "Descargando el instalador oficial...",
"Downloading pre-existing encrypted backups from this host will fail unless you kept a copy of the current key.": "La descarga de backups cifrados ya existentes desde este host fallará salvo que conserve una copia de la clave actual.",
"Downloading the image:": "Descargando la imagen:",
@@ -2017,11 +2018,11 @@
"Enter ZFS pool name for the selected disk:": "Ingrese el nombre del grupo ZFS para el disco seleccionado:",
"Enter a name for the mount point (used as /mnt/<name>):": "Ingrese un nombre para el punto de montaje (usado como /mnt/<nombre>):",
"Enter a name for the new virtual machine:": "Ingrese un nombre para la nueva máquina virtual:",
"Enter a non-empty password or access token on a single line.": "ingrese una contraseña que no esté vacía o un token de acceso en una sola línea.",
"Enter a non-empty password or access token on a single line.": "Escribe una contraseña o un token de acceso, en una sola línea.",
"Enter a number, or write or paste a command:": "Ingrese un número, o escriba o pegue un comando:",
"Enter a systemd calendar event, e.g.:": "Introduzca un evento de calendario de systemd, por ejemplo:",
"Enter a usable IPv4 address with its prefix, for example": "Introduzca una dirección IPv4 usable con su prefijo, por ejemplo",
"Enter a valid registry username.": "ingrese un nombre de usuario de registro válido.",
"Enter a valid registry username.": "Escribe un usuario válido para el registro.",
"Enter backup file (.zst):": "Ingrese el archivo de backup (.zst):",
"Enter backup path (.tar.zst):": "Ingrese la ruta de backup (.tar.zst):",
"Enter backup path (.vma.zst):": "Ingrese la ruta de backup (.vma.zst):",
@@ -2695,7 +2696,7 @@
"Help and Info": "Ayuda e información",
"Help and Info Commands": "Comandos de ayuda e información",
"Helper-Scripts logo applied": "Logotipo de Helper-Scripts aplicado",
"Helper:": "Ayudante:",
"Helper:": "Asistente:",
"Hermes WebUI": "Hermes WebUI",
"Hidden for safety": "Escondido por seguridad",
"Hidden:": "Oculto:",
@@ -2909,20 +2910,20 @@
"If your DHCP has a static reservation for the old MAC, update it.": "Si su DHCP tiene una reserva estática para la MAC anterior, actualícela.",
"Image": "Imagen",
"Image Source Directory": "Directorio de origen de imágenes",
"Image access confirmed.\n\n{reference}\n\nArchitecture: {architecture}\nVersion: {version}\nDownload size: {size}\nDigest: {digest}": "Acceso a la imagen confirmado.\n\n{reference}\n\nArquitectura: {architecture}\nVersión: {version}\nTamaño de descarga: {size}\nResumen: {digest}",
"Image access confirmed.\n\n{reference}\n\nArchitecture: {architecture}\nVersion: {version}\nDownload size: {size}\nDigest: {digest}": "Acceso a la imagen confirmado.\n\n{reference}\n\nArquitectura: {architecture}\nVersión: {version}\nTamaño de descarga: {size}\nDigest: {digest}",
"Image cache": "Caché de imágenes",
"Image compatibility restored:": "Compatibilidad de imagen restaurada:",
"Image compatibility verified:": "Compatibilidad de imagen verificada:",
"Image directory:": "Directorio de imágenes:",
"Image download failed:": "Descarga de imagen falló:",
"Image downloaded": "Imagen descargada",
"Image downloaded and verified.\n\n{reference}\n\nStorage: {storage}\nArchive size: {size}\nArchive: {archive}\n\nNo container was created.\nProxMenux removes unused cached images after successful updates.": "Imagen descargada y verificada.\n\n{reference}\n\nAlmacenamiento: {storage}\nTamaño del archivo: {size}\nArchivo: {archive}\n\nNo se creó ningún contenedor.\nProxMenux elimina las imágenes almacenadas en caché no utilizadas después de actualizaciones exitosas.",
"Image downloaded and verified.\n\n{reference}\n\nStorage: {storage}\nArchive size: {size}\nArchive: {archive}\n\nNo container was created.\nProxMenux removes unused cached images after successful updates.": "Imagen descargada y verificada.\n\n{reference}\n\nAlmacenamiento: {storage}\nTamaño del archivo: {size}\nArchivo: {archive}\n\nNo se ha creado ningún contenedor.\nProxMenux elimina las imágenes en caché que no se usan tras las actualizaciones correctas.",
"Image file not found:": "Archivo de imagen no encontrado:",
"Image imported:": "Imagen importada:",
"Image integrity verification failed. The partial download was discarded; try again.": "Error en la verificación de la integridad de la imagen. La descarga parcial fue descartada;intentar otra vez.",
"Image integrity verification failed. The partial download was discarded; try again.": "La imagen no ha superado la verificación de integridad. Se ha descartado la descarga parcial; inténtalo de nuevo.",
"Image integrity verified": "Integridad de la imagen verificada",
"Image not allowed for the host monitor profile": "Imagen no permitida para el perfil del monitor host",
"Image reference": "referencia de imagen",
"Image reference": "Referencia de la imagen",
"Image reference (for example ghcr.io/user/application:latest)": "Referencia de imagen (por ejemplo ghcr.io/user/application:latest)",
"Image selection was cancelled": "Se canceló la selección de la imagen",
"Image that is not in the catalog": "Imagen que no está en el catálogo",
@@ -3051,7 +3052,7 @@
"Install Samba inside CT:": "Instale Samba dentro de CT:",
"Install ZFS auto-snapshot": "Instalar ZFS auto-snapshot",
"Install a version from the branch the kernel names.": "Instale una versión de la rama que indica el kernel.",
"Install an image as a native LXC": "instalar una imagen como LXC nativo",
"Install an image as a native LXC": "Instalar una imagen como LXC nativo",
"Install an image that is not in the catalog": "Instalar una imagen que no está en el catálogo",
"Install analysis tools": "Instalar herramientas de análisis",
"Install and configure": "Instalar y configurar",
@@ -3091,7 +3092,7 @@
"Installation finished but drivers are not loaded. A reboot may be required.": "La instalación finalizó pero los controladores no están cargados. Es posible que sea necesario reiniciar.",
"Installation incomplete. These containers and their data are kept:": "Instalación incompleta. Estos contenedores y sus datos se guardan:",
"Installation log:": "Log de instalación:",
"Installation settings": "configuración de instalación",
"Installation settings": "Configuración de la instalación",
"Installation summary": "Resumen de instalación",
"Installed": "Instalado",
"Installed at:": "Instalado en:",
@@ -3265,7 +3266,7 @@
"Invalid host path:": "Camino del host inválido:",
"Invalid host-monitor firewall plan": "El plan de cortafuegos del monitor del host no es válido",
"Invalid image probe descriptor": "Descriptor de sonda de imagen inválida",
"Invalid image tag.": "etiqueta de imagen no válida.",
"Invalid image tag.": "La etiqueta de la imagen no es válida.",
"Invalid input": "Entrada no válida",
"Invalid internal volume": "Volumen interno inválido",
"Invalid list:": "Lista inválida:",
@@ -3323,7 +3324,7 @@
"Invalid suite application": "Aplicación de suite inválida",
"Invalid sysctl value:": "Valor sysctl inválido:",
"Invalid template storage": "Almacenamiento de plantillas inválidas",
"Invalid template storage name.": "nombre de almacenamiento de plantilla no válido.",
"Invalid template storage name.": "El nombre del almacenamiento de plantillas no es válido.",
"Invalid tmpfs options:": "Opciones de tmpfs inválidos:",
"Invalid tmpfs path:": "Camino de los tmpfs inválidos:",
"Invalid tmpfs size:": "Tamaño de tmpfs inválido:",
@@ -3562,8 +3563,8 @@
"Log2RAM write scheduled every": "Escritura de Log2RAM programada cada",
"Log:": "Log:",
"Logged-in users": "Usuarios registrados",
"Login to {registry} timed out. Saved credentials were not changed.": "Se agotó el tiempo de inicio de sesión en {registry}.Las credenciales guardadas no se cambiaron.",
"Logout from {registry} timed out. Saved file credentials were not changed.": "Se agotó el tiempo de cierre de sesión de {registry}.Las credenciales del archivo guardado no se cambiaron.",
"Login to {registry} timed out. Saved credentials were not changed.": "El inicio de sesión en {registry} ha superado el tiempo de espera. Las credenciales guardadas no han cambiado.",
"Logout from {registry} timed out. Saved file credentials were not changed.": "El cierre de sesión en {registry} ha superado el tiempo de espera. Las credenciales guardadas no han cambiado.",
"Logrotate optimization completed": "Optimización de logrotate completada",
"Logrotate service restarted successfully": "El servicio Logrotate se reinició correctamente",
"Lollypop is a lightweight modern music player designed to work excellently on the GNOME desktop environment.": "Lollypop es un reproductor de música moderno y ligero, diseñado para funcionar de maravilla en el entorno de escritorio GNOME.",
@@ -3626,8 +3627,8 @@
"Manage custom paths (add / remove your folders)": "Configurar rutas personalizadas (agreguar/eliminar carpetas)",
"Manage installed OCI applications": "Gestionar aplicaciones OCI instaladas",
"Manage local backup target": "Configurar el destino del backup local",
"Manage private image registries.\nSaved credentials let ProxMenux access your private images.": "Administrar registros de imágenes privadas.\nLas credenciales guardadas permiten que ProxMenux acceda a sus imágenes privadas.",
"Manage registry accounts as root on the Proxmox node.": "administre cuentas de registro como root en el nodo Proxmox.",
"Manage private image registries.\nSaved credentials let ProxMenux access your private images.": "Gestiona los registros de imágenes privadas.\nCon las credenciales guardadas, ProxMenux puede acceder a tus imágenes privadas.",
"Manage registry accounts as root on the Proxmox node.": "Gestiona las cuentas de registro como root en el nodo Proxmox.",
"Managed disks must have backup enabled and a valid size": "Los discos gestionados deben tener habilitado backup y un tamaño válido",
"Managing Nginx proxy hosts with a simple, powerful interface.": "Gestión de proxy hosts de Nginx con una interfaz sencilla y potente.",
"Manual CLI Guide (Disk and Storage Manager)": "Comandos CLI manuales (Administrador de discos y almacenamiento)",
@@ -4144,7 +4145,7 @@
"No accessible Samba servers found.": "No se encontraron servidores Samba accesibles.",
"No accessible exports found.": "No se encontraron exportaciones accesibles.",
"No accessible shares found.": "No se encontraron recursos compartidos accesibles.",
"No active Proxmox storage accepts OCI template archives.": "Ningún almacenamiento Proxmox activo acepta archivos de plantilla OCI.",
"No active Proxmox storage accepts OCI template archives.": "Ningún almacenamiento activo de Proxmox acepta archivos de plantilla OCI.",
"No active exports or showmount not available": "No hay exportaciones activas o showmount no disponible",
"No active session": "Ninguna sesión activa",
"No active subscription and no usable PVE repository. Noninteractive mode cannot change APT sources; configure them in Node > Updates > Repositories.": "No hay suscripción activa ni un repositorio de PVE utilizable. El modo no interactivo no puede cambiar las fuentes de APT; configúralas en Nodo > Actualizaciones > Repositorios.",
@@ -4264,7 +4265,7 @@
"No recent": "No reciente",
"No recent Samba servers found.": "No se encontraron servidores Samba recientes.",
"No registered OCI containers are available for selection on this host.": "No hay contenedores OCI registrados disponibles para seleccionar en este host.",
"No registry API was found at {registry}. Check the hostname and port.": "No se encontró ninguna API de registro en {registry}.Verifique el nombre de host y el puerto.",
"No registry API was found at {registry}. Check the hostname and port.": "No hay ninguna API de registro en {registry}. Comprueba el nombre y el puerto.",
"No restored OCI application is waiting to be recovered.": "No hay ninguna aplicación OCI restaurada pendiente de recuperar.",
"No results": "Sin resultados",
"No routing information found.": "No se encontró información de enrutamiento.",
@@ -4329,8 +4330,8 @@
"Not an OVH server, skipping RTM installation": "No es un servidor OVH, se salta la instalación de RTM",
"Not currently mounted": "Actualmente no montado",
"Not currently mounted — skipping umount.": "Actualmente no montado: omitiendo el desmontaje.",
"Not declared": "No declarado",
"Not enough free space on {storage}. Free some space or select another storage.": "No hay suficiente espacio libre en {storage}.Libere algo de espacio o seleccione otro almacenamiento.",
"Not declared": "Sin declarar",
"Not enough free space on {storage}. Free some space or select another storage.": "No hay espacio suficiente en {storage}. Libera espacio o elige otro almacenamiento.",
"Not found": "No encontrado",
"Not found in the OCI archive:": "No se encuentra en el archivo OCI:",
"Not imported:": "No importado:",
@@ -4419,7 +4420,7 @@
"Only Intel/AMD DRM, Coral and USB nodes can be adopted automatically": "Solo se pueden incorporar automáticamente dispositivos DRM Intel/AMD, Coral y USB",
"Only Intel/AMD DRM, Coral, NPU and USB nodes can be adopted automatically": "Solo los nodos DRM de Intel/AMD, Coral, NPU y USB se pueden adoptar automáticamente",
"Only a Docker Swarm uses these settings, so they are not applied:": "Solo un Docker Swarm utiliza estos ajustes, por lo que no se aplican:",
"Only a full sha256 image digest is supported.": "solo se admite un resumen completo de imágenes sha256.",
"Only a full sha256 image digest is supported.": "Solo se admite un digest sha256 completo.",
"Only an installed standalone OCI instance can adopt external changes": "Solo una instancia OCI independiente e instalada puede incorporar cambios externos",
"Only backed-up Proxmox volumes can be adopted": "Solo se pueden incorporar volúmenes de Proxmox incluidos en los backups",
"Only convert to privileged if absolutely necessary for your use case.": "Convierta a privilegiado solo si es absolutamente necesario para su caso de uso.",
@@ -4573,7 +4574,7 @@
"Passthrough may still work without a ROM file.": "Es posible que el passthrough siga funcionando sin un archivo ROM.",
"Passthrough may work, but startup/restart reliability is not guaranteed.": "El passthrough puede funcionar, pero no se garantiza la fiabilidad del inicio/reinicio.",
"Password": "Contraseña",
"Password / access token (image pull permission)": "Contraseña/token de acceso (permiso de extracción de imágenes)",
"Password / access token (image pull permission)": "Contraseña o token de acceso (con permiso para descargar imágenes)",
"Password Mismatch": "La contraseña no coincide",
"Password cannot be empty.": "La contraseña no puede estar vacía.",
"Password confirmation cannot be empty.": "La confirmación de contraseña no puede estar vacía.",
@@ -4838,9 +4839,9 @@
"ProxMenux attaches directories, not single files, so this image cannot be installed yet.": "ProxMenux adjunta directorios, no archivos individuales, por lo que esta imagen no se puede instalar todavía.",
"ProxMenux can apply open permissions on this NFS directory from the host so the container can read and write:": "ProxMenux puede aplicar permisos de apertura en este directorio NFS desde el host para que el contenedor pueda leer y escribir:",
"ProxMenux can remount it with open permissions so any LXC can read and write.": "ProxMenux puede volver a montarlo con permisos abiertos para que cualquier LXC pueda leer y escribir.",
"ProxMenux cannot install this image automatically. Import its Compose file instead.": "ProxMenux no puede instalar esta imagen automáticamente. En su lugar, importe su archivo Redactar.",
"ProxMenux cannot install this image automatically. Import its Compose file instead.": "ProxMenux no puede instalar esta imagen de forma automática. Importa su archivo Compose.",
"ProxMenux cannot override NFS server-side permissions from the host.": "ProxMenux no puede anular los permisos del lado del servidor NFS del host.",
"ProxMenux could not translate this image. Try importing its Compose file from OCI manager Apps.": "ProxMenux no pudo traducir esta imagen. Intente importar su archivo Compose desde OCI manager Apps.",
"ProxMenux could not translate this image. Try importing its Compose file from OCI manager Apps.": "ProxMenux no ha podido traducir esta imagen. Prueba a importar su archivo Compose desde OCI manager Apps.",
"ProxMenux customizations removed from bashrc": "Personalizaciones de ProxMenux eliminadas de bashrc",
"ProxMenux does not give a container the system of its host.": "ProxMenux no le da a un contenedor el sistema de su host.",
"ProxMenux does not install them. The installation asks how to connect to them.": "ProxMenux no los instala. La instalación pide cómo conectarse a ellos.",
@@ -4961,7 +4962,7 @@
"Reading SMART data...": "Leyendo datos SMART...",
"Reading SMART self-test log...": "Leyendo el log de autoprueba SMART...",
"Reading full SMART report...": "Leyendo el informe SMART completo...",
"Reading image metadata. Please wait...": "lectura de metadatos de imágenes. Espere por favor...",
"Reading image metadata. Please wait...": "Leyendo los metadatos de la imagen. Espera...",
"Real-time Performance Monitoring": "Monitorización del rendimiento en tiempo real",
"Real-time bandwidth usage (press q to exit)": "Uso de ancho de banda en tiempo real (presione q para salir)",
"Real-time collaborative document editor": "Editor colaborativo de documentos en tiempo real",
@@ -5047,9 +5048,9 @@
"Register mount path in Proxmox:": "Registre la ruta de montaje en Proxmox:",
"Registering disk as Proxmox storage...": "Registrando disco como almacenamiento en Proxmox...",
"Registering module with DKMS...": "Registrando módulo con DKMS...",
"Registry accounts": "cuentas de registro",
"Registry hostname": "nombre de host del registro",
"Registry: {registry}\nAccount: {account}\nAuthentication: {method}\n\nSaved credentials are verified when an image is accessed.": "Registro: {registry}\nCuenta: {account}\nAutenticación: {method}\n\nLas credenciales guardadas se verifican cuando se accede a una imagen.",
"Registry accounts": "Cuentas de registro",
"Registry hostname": "Nombre del registro",
"Registry: {registry}\nAccount: {account}\nAuthentication: {method}\n\nSaved credentials are verified when an image is accessed.": "Registro: {registry}\nCuenta: {account}\nAutenticación: {method}\n\nLas credenciales guardadas se comprueban al acceder a una imagen.",
"Reinstall / update Coral drivers": "Reinstalar/actualizar los controladores Coral",
"Reinstall Fail2Ban": "Reinstale Fail2Ban",
"Reinstall Lynis": "Reinstale Lynis",
@@ -5121,10 +5122,10 @@
"Remove obsolete systemd-boot meta-package": "Eliminar el metapaquete obsoleto systemd-boot",
"Remove old repository files:": "Eliminar archivos antiguos del repositorio:",
"Remove passthrough device from VM": "Eliminar el dispositivo en passthrough de la VM",
"Remove saved credentials": "eliminar las credenciales guardadas",
"Remove saved credentials": "Eliminar las credenciales guardadas",
"Remove subscription banner": "Eliminar banner de suscripción",
"Remove the application? Its container disks are deleted, and only a backup can bring them back.": "¿Eliminar la aplicación? Los discos de sus contenedores se eliminan y solo un backup puede recuperarlos.",
"Remove the saved credentials for {registry}?\nRunning apps will keep working.": "¿Eliminar las credenciales guardadas para {registry}?\nLas aplicaciones en ejecución seguirán funcionando.",
"Remove the saved credentials for {registry}?\nRunning apps will keep working.": "¿Eliminar las credenciales guardadas de {registry}?\nLas aplicaciones en marcha seguirán funcionando.",
"Remove the unprivileged flag from configuration:": "Elimine el flag unprivileged de la configuración:",
"Remove unused packages and their config": "Eliminar paquetes no utilizados y su configuración",
"Remove: delete the application and its containers": "Eliminar: la aplicación y sus contenedores",
@@ -5446,7 +5447,7 @@
"Save and classify articles. Read them later. Freely.": "Guarda y clasifica artículos. Léelos más tarde. Con libertad.",
"Save the passphrase somewhere safe NOW, before continuing.": "Guarde la frase de contraseña en un lugar seguro AHORA, antes de continuar.",
"Save this Borg target so you don't need to enter the details again?": "¿Guardar este destino Borg para no tener que volver a introducir los detalles?",
"Saved credentials for {registry} were removed.\nOther Skopeo/Docker credential files are managed separately.": "Se eliminaron las credenciales guardadas para {registry}.\nOtros archivos de credenciales Skopeo/Docker se administran por separado.",
"Saved credentials for {registry} were removed.\nOther Skopeo/Docker credential files are managed separately.": "Se han eliminado las credenciales guardadas de {registry}.\nLos demás ficheros de credenciales de Skopeo o Docker se gestionan aparte.",
"Saved record removed": "Registro guardado eliminado",
"Saving changes...": "Guardando los cambios...",
"Saving the new configuration": "Salvando la nueva configuración",
@@ -5831,7 +5832,7 @@
"Sign in to the panel and create a Samba user in Settings before publishing a directory over SMB.": "Inicia sesión en el panel y crea un usuario Samba en Ajustes antes de publicar un directorio por SMB.",
"Signal is a messaging app with privacy at its core. It is free and easy to use, with strong end-to-end encryption that keeps your communication completely private.": "Signal es una aplicación de mensajería con la privacidad como base. Es gratuita y fácil de usar, con un sólido cifrado de extremo a extremo que mantiene tus comunicaciones totalmente privadas.",
"Signatures removed. Partition table preserved.": "Firmas eliminadas. Se conserva la tabla de particiones.",
"Signed in to {registry} as {username}.\n\nCredentials are saved for ProxMenux.\nSelect the account to check, download or install an image.": "ha iniciado sesión en {registry} como {username}.\n\nLas credenciales se guardan para ProxMenux.\nSeleccione la cuenta para verificar, descargar o instalar una imagen.",
"Signed in to {registry} as {username}.\n\nCredentials are saved for ProxMenux.\nSelect the account to check, download or install an image.": "Sesión iniciada en {registry} como {username}.\n\nLas credenciales quedan guardadas para ProxMenux.\nElige la cuenta para comprobar, descargar o instalar una imagen.",
"Simple and easy to use DDNS": "DDNS simple y fácil de usar",
"Single GPU Warning": "Advertencia de GPU única",
"Single target found — selected automatically:": "Destino único encontrado: seleccionado automáticamente:",
@@ -5857,8 +5858,8 @@
"Skipping SR-IOV device": "Saltar el dispositivo SR-IOV",
"Skipping installation.": "Saltarse la instalación.",
"Skipping manual patches — feranick fork already supports this kernel.": "Saltarse parches manuales: feranick fork ya es compatible con este kernel.",
"Skopeo is not available. Restore the ProxMenux OCI dependencies and try again.": "Skopeo no está disponible. Restaure las dependencias de ProxMenux OCI y vuelva a intentarlo.",
"Skopeo returned an invalid credential file; saved credentials were not changed.": "Skopeo devolvió un archivo de credenciales no válido;Las credenciales guardadas no se cambiaron.",
"Skopeo is not available. Restore the ProxMenux OCI dependencies and try again.": "Skopeo no está disponible. Restaura las dependencias OCI de ProxMenux e inténtalo de nuevo.",
"Skopeo returned an invalid credential file; saved credentials were not changed.": "Skopeo ha devuelto un fichero de credenciales no válido; las credenciales guardadas no han cambiado.",
"Sleek podcast downloader with GPodder sync": "Descargador de podcasts elegante con sincronización GPodder",
"Smart Card": "Tarjeta inteligente",
"Smart restore plan — hardware compatibility check": "Plan de restauración inteligente: verificación de compatibilidad de hardware",
@@ -6117,7 +6118,7 @@
"TCP optimizations configuration completed": "Configuración de optimizaciones TCP completada",
"TCP optimizations reverted (defaults restored on next reboot)": "Optimizaciones de TCP revertidas (los valores predeterminados se restauran en el próximo reinicio)",
"TCP port 5201 is reachable (firewall on server)": "El puerto TCP 5201 es accesible (cortafuegos del servidor)",
"TLS verification failed for {registry}. Install the registry CA in /etc/containers/certs.d/{registry}/ca.crt.": "Error en la verificación TLS para {registry}.Instale la CA de registro en /etc/containers/certs.d/{registry}/ca.crt.",
"TLS verification failed for {registry}. Install the registry CA in /etc/containers/certs.d/{registry}/ca.crt.": "La verificación TLS de {registry} ha fallado. Instala la CA del registro en /etc/containers/certs.d/{registry}/ca.crt.",
"TPM device added to VM": "Dispositivo TPM agregado a la VM",
"TPM storage selection failed or was cancelled. VM creation aborted.": "La selección de almacenamiento de TPM falló o se canceló. Se canceló la creación de la máquina virtual.",
"TROUBLESHOOTING:": "SOLUCIÓN DE PROBLEMAS:",
@@ -6309,7 +6310,7 @@
"The configuration must run as root on Proxmox VE": "La configuración debe funcionar como root en Proxmox VE",
"The configuration of a new member changed after it was created": "La configuración de un nuevo miembro cambió después de su creación",
"The configuration stopped because of an unexpected error": "La configuración se detuvo debido a un error inesperado",
"The configured credential helper could not be used. Check its installation and credential store.": "No se pudo utilizar el asistente de credenciales configurado. Consulta su instalación y almacén de credenciales.",
"The configured credential helper could not be used. Check its installation and credential store.": "No se pudo usar el asistente de credenciales configurado. Comprueba su instalación y su almacén de credenciales.",
"The console of the container could not be configured": "No se pudo configurar la consola del contenedor",
"The consume/export volumes need at least 1 GB": "Los volúmenes de consumo/exportación necesitan al menos 1 GB",
"The container could not be removed automatically:": "El contenedor no se puede retirar automáticamente:",
@@ -6347,7 +6348,7 @@
"The containers do not need them any more; an update downloads the new versions when there are any.": "Los contenedores ya no las necesitan; una actualización descarga las nuevas versiones cuando las hay.",
"The containers were created from downloaded OCI images": "Los contenedores fueron creados a partir de imágenes OCI descargadas",
"The coordinated backup was modified": "El backup coordinado fue modificada",
"The credential file changed during this operation. Try again; it was not overwritten.": "el archivo de credenciales cambió durante esta operación. Intentar otra vez;no fue sobrescrito.",
"The credential file changed during this operation. Try again; it was not overwritten.": "El fichero de credenciales ha cambiado durante la operación. Inténtalo de nuevo; no se ha sobrescrito.",
"The current driver will be completely uninstalled before installing the new version. Continue?": "El controlador actual se desinstalará por completo antes de instalar la nueva versión. ¿Continuar?",
"The current image of the saved channel will be checked and downloaded. Resources, paths and GPU are kept. The CT is stopped during the replacement and a native backup is created first.": "La imagen actual del canal guardado será revisada y descargada. Se mantienen recursos, rutas y GPU. El CT se detiene durante el reemplazo y se crea primero un backup nativo.",
"The current record is missing for": "Falta el registro actual para",
@@ -6430,9 +6431,9 @@
"The host-monitor firewall subnet changed; no firewall rule was added": "La subred del bridge ha cambiado; no se ha añadido ninguna regla al cortafuegos",
"The host-monitor web interface uses the host network.": "La interfaz web del monitor del host usa la red del host.",
"The identity of a member was replaced": "Se sustituyó la identidad de un miembro",
"The image cache path is unsafe. Check the template storage before trying again.": "la ruta de la caché de imágenes no es segura. Verifique el almacenamiento de la plantilla antes de volver a intentarlo.",
"The image cache path is unsafe. Check the template storage before trying again.": "La ruta de la caché de imágenes no es segura. Comprueba el almacenamiento de plantillas antes de volver a intentarlo.",
"The image changes the user expected by the adapter": "La imagen cambia el usuario esperado por el adaptador",
"The image could not be downloaded or verified. Check registry and storage access, then try again.": "La imagen no se pudo descargar ni verificar. Verifique el acceso al registro y al almacenamiento y vuelva a intentarlo.",
"The image could not be downloaded or verified. Check registry and storage access, then try again.": "No se pudo descargar o verificar la imagen. Comprueba el acceso al registro y al almacenamiento, e inténtalo de nuevo.",
"The image could not be read from its registry:": "La imagen no se pudo leer desde su registro:",
"The image declares data paths that are still stored in the rootfs": "La imagen declara caminos de datos que aún están almacenados en los rootfs",
"The image did not grant the application user access to the devices; check its native init. Host permissions were not relaxed.": "La imagen no concedió el acceso del usuario de la aplicación a los dispositivos; comprobar su entrada nativa. Los permisos del host no se relajaron.",
@@ -6445,8 +6446,8 @@
"The image is in its registry, for one architecture.": "La imagen está en su registro, para una arquitectura.",
"The image is in its registry.": "La imagen está en su registro.",
"The image is in its registry:": "La imagen está en su registro:",
"The image manifest failed integrity verification. Try again or contact the image publisher.": "El manifiesto de imagen falló en la verificación de integridad. Inténtalo de nuevo o ponte en contacto con el editor de la imagen.",
"The image or tag was not found on {registry}, or this account cannot access it. Check the reference.": "la imagen o etiqueta no se encontró en {registry} o esta cuenta no puede acceder a ella. Consulta la referencia.",
"The image manifest failed integrity verification. Try again or contact the image publisher.": "El manifiesto de la imagen no ha superado la verificación de integridad. Inténtalo de nuevo o contacta con quien publica la imagen.",
"The image or tag was not found on {registry}, or this account cannot access it. Check the reference.": "La imagen o la etiqueta no está en {registry}, o esta cuenta no puede acceder a ella. Comprueba la referencia.",
"The image requests NVIDIA, but the host has no working NVIDIA driver": "La imagen solicita NVIDIA, pero el host no tiene ningún controlador NVIDIA trabajando",
"The image requests disabling part of the AppArmor or seccomp confinement. Continue only if you trust the image and accept this risk.": "La imagen pide desactivar parte del confinamiento de AppArmor o seccomp. Continúa solo si confías en la imagen y aceptas este riesgo.",
"The image requests disabling part of the AppArmor or seccomp confinement. The Compose offers an optional AppArmor or seccomp relaxation; it will stay disabled unless the user selects it. Continue only if you trust the image and accept this risk.": "La imagen pide desactivar parte del confinamiento de AppArmor o seccomp. El Compose ofrece una relajación opcional de AppArmor o seccomp; seguirá desactivada salvo que el usuario la seleccione. Continúa solo si confías en la imagen y aceptas este riesgo.",
@@ -6578,15 +6579,15 @@
"The record or diagnosis could not be completed; no update was run.": "El registro o el diagnóstico no se pudo completar; no se realizó ninguna actualización.",
"The recovery did not complete. Review the log and choose \"Recover\" again for this container in the OCI management menu.": "La recuperación no terminó. Revise el log y elija \"Recuperar la instalación anterior\" de nuevo para este contenedor en el menú de gestión OCI.",
"The recovery did not complete. Review the log and choose \"{choice}\" again for this container in the OCI management menu.": "La recuperación no terminó. Revisa el log y elige \"{choice}\" de nuevo para este contenedor en el menú de gestión OCI.",
"The registry authentication file is invalid; it was not changed.": "el archivo de autenticación del registro no es válido;no fue cambiado.",
"The registry authentication file must be owned by root with mode 600.": "el archivo de autenticación del registro debe ser propiedad de root con modo 600.",
"The registry authentication file must have an absolute path.": "el archivo de autenticación del registro debe tener una ruta absoluta.",
"The registry authentication path cannot contain symbolic links.": "la ruta de autenticación del registro no puede contener enlaces simbólicos.",
"The registry authentication path has an unsafe parent directory.": "la ruta de autenticación del registro tiene un directorio principal no seguro.",
"The registry credential directory must be owned by root with mode 700.": "el directorio de credenciales de registro debe ser propiedad de root con modo 700.",
"The registry authentication file is invalid; it was not changed.": "El fichero de autenticación del registro no es válido; no se ha modificado.",
"The registry authentication file must be owned by root with mode 600.": "El fichero de autenticación del registro debe pertenecer a root y tener el modo 600.",
"The registry authentication file must have an absolute path.": "El fichero de autenticación del registro debe tener una ruta absoluta.",
"The registry authentication path cannot contain symbolic links.": "La ruta del fichero de autenticación no puede contener enlaces simbólicos.",
"The registry authentication path has an unsafe parent directory.": "La ruta del fichero de autenticación tiene una carpeta superior insegura.",
"The registry credential directory must be owned by root with mode 700.": "La carpeta de credenciales del registro debe pertenecer a root y tener el modo 700.",
"The registry did not return the saved image digest": "El registro no devolvió el digest de imagen guardado",
"The registry returned incomplete or unsupported image metadata.": "el registro devolvió metadatos de imagen incompletos o no compatibles.",
"The registry returned invalid or unsupported image metadata.": "el registro devolvió metadatos de imagen no válidos o no compatibles.",
"The registry returned incomplete or unsupported image metadata.": "El registro ha devuelto metadatos de imagen incompletos o no admitidos.",
"The registry returned invalid or unsupported image metadata.": "El registro ha devuelto metadatos de imagen no válidos o no admitidos.",
"The remote does not exist; create and authorize it first in the WebUI:": "El remoto no existe; crear y autorizar primero en el WebUI:",
"The remote installer must run as root on Proxmox VE": "El instalador remoto debe funcionar como root en Proxmox VE",
"The remote must already be created and authorized in the Rclone web UI. This operation restarts the CT and publishes two FUSE views on the host.": "El remoto ya debe estar creado y autorizado en la interfaz web de Rclone. Esta operación reinicia el CT y publica dos puntos de vista FUSE sobre el host.",
@@ -6744,7 +6745,7 @@
"This GPU is considered incompatible with GPU passthrough to a VM in ProxMenux.": "Esta GPU se considera incompatible con el passthrough de GPU a una VM en ProxMenux.",
"This NFS share is fully restricted — even the host root cannot write to it.": "Este recurso compartido NFS está completamente restringido: ni siquiera la raíz del host puede escribir en él.",
"This VM requires extra installation steps, see install guide at:\nhttps://github.com/community-scripts/ProxmoxVE/discussions/144": "Esta máquina virtual requiere pasos de instalación adicionales; consulte la guía de instalación en:\nhttps://github.com/community-scripts/ProxmoxVE/discussions/144",
"This account is for {registry}. Enter an image from that registry.": "Esta cuenta es para {registry}.Ingrese una imagen de ese registro.",
"This account is for {registry}. Enter an image from that registry.": "Esta cuenta es de {registry}. Escribe una imagen de ese registro.",
"This action will:": "Esta acción:",
"This application cannot be recovered yet:": "Esta aplicación todavía no se puede recuperar:",
"This application cannot be recovered yet; nothing was changed:": "Esta aplicación todavía no se puede recuperar; no se ha cambiado nada:",
@@ -6776,10 +6777,10 @@
"This explicitly marks the container as privileged": "Esto marca explícitamente el contenedor como privilegiado",
"This file decides what is mounted and with which privileges. Install it only if it comes from a source you trust.": "Este archivo decide qué se monta y con qué privilegios. Instálalo solo si viene de una fuente de confianza.",
"This guarantees that device nodes are available before applying LXC GPU config.": "Esto garantiza que los nodos del dispositivo estén disponibles antes de aplicar la configuración de GPU LXC.",
"This host architecture is not supported by the OCI image importer.": "esta arquitectura de host no es compatible con el importador de imágenes OCI.",
"This host architecture is not supported by the OCI image importer.": "El importador de imágenes OCI no admite la arquitectura de este host.",
"This host has no active subscription, switch to the no-subscription repository? The inaccessible Enterprise PVE source will be disabled. Enterprise Ceph sources, if present, will be disabled without choosing a replacement Ceph channel; configure Ceph separately if needed.": "Este host no tiene una suscripción activa, ¿cambiar al repositorio sin suscripción? La fuente Enterprise de PVE, que no es accesible, se desactivará. Las fuentes Enterprise de Ceph, si existen, se desactivarán sin elegir un canal de Ceph que las sustituya; configura Ceph por separado si lo necesitas.",
"This image cannot be installed as it is described:": "Esta imagen no se puede instalar como se describe:",
"This image has no compatible Linux image for this host ({architecture}).": "Esta imagen no tiene una imagen de Linux compatible para este host ({architecture}).",
"This image has no compatible Linux image for this host ({architecture}).": "Esta imagen no tiene una versión Linux compatible con este host ({architecture}).",
"This image requires the host module": "Esta imagen requiere el módulo host",
"This import rejects these paths without checking whether they are files or directories.": "Esta importación rechaza estas rutas sin comprobar si son archivos o directorios.",
"This installation will:": "Esta instalación:",
@@ -6895,7 +6896,7 @@
"To use the GPU again in LXC, run Add GPU to LXC from GPUs and Coral-TPU Menu": "Para usar la GPU nuevamente en LXC, ejecute Agregar GPU a LXC desde GPU y Menú Coral-TPU",
"To use the VM without issues, the host must be restarted before starting it.": "Para utilizar la VM sin problemas, se debe reiniciar el host antes de iniciarlo.",
"To use this share from an LXC, bind-mount it via:": "Para usar este recurso compartido desde un LXC, móntelo mediante enlace:",
"Token": "Ficha",
"Token": "Token",
"Tool exit code:": "Código de salida de la herramienta:",
"Tool output:": "Salida de herramienta:",
"Tools": "Tools",
@@ -7040,7 +7041,7 @@
"Unsafe private configuration path": "Vía de configuración privada insegura",
"Unsafe qBittorrent configuration path": "Vía de configuración segura qBittorrent",
"Unsafe record": "Registro inseguro",
"Unsafe registry credential lock.": "Bloqueo de credenciales de registro inseguro.",
"Unsafe registry credential lock.": "El bloqueo de las credenciales del registro no es seguro.",
"Unsafe registry directory": "Directorio del registro no seguro",
"Unsafe registry lock": "Bloqueo del registro no seguro",
"Unsafe rootfs for the capture": "rootfs inseguros para la captura",
@@ -7103,7 +7104,7 @@
"Update cancelled by user": "Actualización cancelada por el usuario",
"Update completed. Data kept.": "Actualización completada. Datos conservados.",
"Update completed. Press Enter to continue...": "Actualización completada. Presione Entrar para continuar...",
"Update credentials": "actualizar credenciales",
"Update credentials": "Actualizar las credenciales",
"Update every container of the application": "Actualizar cada contenedor de la aplicación",
"Update kernel to compatible version": "Actualizar el kernel a una versión compatible",
"Update now?": "¿Actualizar ahora?",
@@ -7170,10 +7171,10 @@
"Use a custom path": "Usar una ruta personalizada",
"Use a privileged LXC for NFS server/client workflows.": "Utilice un LXC privilegiado para flujos de trabajo de servidor/cliente NFS.",
"Use a privileged LXC for Samba client/server workflows.": "Utilice un LXC privilegiado para flujos de trabajo de cliente/servidor Samba.",
"Use a registry hostname, for example ghcr.io or registry.example.com:5000.": "utilice un nombre de host de registro, por ejemplo ghcr.io o registry.example.com:5000.",
"Use a registry hostname, for example ghcr.io or registry.example.com:5000.": "Escribe el nombre de un registro, por ejemplo ghcr.io o registry.example.com:5000.",
"Use an existing SSH private key file on this host": "Use un archivo de clave privada SSH existente en este host",
"Use an existing keyfile": "Usar un archivo de claves existente",
"Use an image reference, for example ghcr.io/owner/app:latest.": "utilice una referencia de imagen, por ejemplo ghcr.io/owner/app:latest.",
"Use an image reference, for example ghcr.io/owner/app:latest.": "Escribe una referencia de imagen, por ejemplo ghcr.io/owner/app:latest.",
"Use as-is — keep data and filesystem": "Úselo tal cual: mantenga los datos y el sistema de archivos",
"Use content types according to your use case.": "Utilice tipos de contenido según su caso de uso.",
"Use default": "Usar predeterminado",
@@ -7213,7 +7214,7 @@
"User-friendly WebUI for LLMs (Formerly Ollama WebUI)": "WebUI fácil de usar para LLM (antes Ollama WebUI)",
"Username": "Nombre de usuario",
"Username (e.g. root@pam or user@pbs!token):": "Nombre de usuario (por ejemplo, root@pam o usuario@pbs!token):",
"Username / token": "nombre de usuario/token",
"Username / token": "Usuario y token",
"Username and password": "Nombre de usuario y contraseña",
"Username and password will be cleared.": "Se borrarán el nombre de usuario y la contraseña.",
"Username cannot be empty.": "El nombre de usuario no puede estar vacío.",
@@ -7314,7 +7315,7 @@
"Verifying Ceph packages availability...": "Verificando la disponibilidad de los paquetes de Ceph...",
"Verifying all utilities status": "Comprobando el estado de todas las utilidades",
"Verifying disk accessibility in CT": "Verificación de la accesibilidad del disco en CT",
"Verifying registry access. Please wait...": "Verificación del acceso al registro. Espere por favor...",
"Verifying registry access. Please wait...": "Comprobando el acceso al registro. Espera...",
"Verifying the backups...": "Verificando los backups...",
"Verifying the image integrity...": "Verificando la integridad de la imagen...",
"Version": "Versión",
@@ -7614,7 +7615,7 @@
"assembling": "ensamblando",
"automatically. Install it manually inside the container.": "automáticamente. Instálelo manualmente dentro del contenedor.",
"automatically. Reboot LXC to fully release.": "automáticamente. Reinicie LXC para liberarlo por completo.",
"available": "disponible",
"available": "disponibles",
"available for LXC bind-mounts via 'LXC Mount Manager'": "disponible para montajes de enlace LXC a través de 'LXC Mount Manager'",
"available in this same GPU and TPU menu.": "disponible en este mismo menú de GPU y TPU.",
"backup at /etc/fstab.proxmenux.bak": "backup en /etc/fstab.proxmenux.bak",
@@ -7966,7 +7967,7 @@
"runs in": "se ejecuta en",
"safe paths now (configs, packages, /etc, /root, ...)": "rutas seguras ahora (configuraciones, paquetes, /etc, /root, ...)",
"same MAC": "misma MAC",
"saved": "guardado",
"saved": "guardada",
"seconds (default)": "segundos (predeterminado)",
"see log:": "ver log:",
"selected by default": "seleccionado por defecto",
@@ -8085,14 +8086,15 @@
"zfs-auto-snapshot removed (existing snapshots preserved on the pool)": "zfs-auto-snapshot eliminado (las instantáneas existentes se conservan en el grupo)",
"zpool command not found. Install zfsutils-linux and retry.": "Comando zpool no encontrado. Instale zfsutils-linux y vuelva a intentarlo.",
"zpool not found. Install zfsutils-linux and retry.": "zpool no encontrado. Instale zfsutils-linux y vuelva a intentarlo.",
"{count} saved account.": "cuenta guardada {count}.",
"{count} saved account.": "{count} cuenta guardada.",
"{count} saved accounts.": "{count} cuentas guardadas.",
"{path} already exists and belongs to another user of the host, so {app} cannot write to it.\n\nProxMenux can add access rules (ACL) to this directory, to everything inside it and to what is created there later, for the users and groups {app} runs as on the host (IDs {ids}). The owner of the files does not change and whatever reads or writes them today keeps doing so; the owner of the directory also gets access to the files {app} creates.\n\nGrant {app} access to this directory?": "{path} ya existe y pertenece a otro usuario del host, así que {app} no puede escribir en él.\n\nProxMenux puede añadir reglas de acceso (ACL) a este directorio, a todo lo que contiene y a lo que se cree en él después, para los usuarios y grupos con los que {app} se ejecuta en el host (ID {ids}). El propietario de los archivos no cambia y lo que hoy los lee o escribe lo sigue haciendo; el propietario del directorio también tiene acceso a los archivos que cree {app}.\n\n¿Dar acceso a {app} a este directorio?",
"{registry} answered with plain HTTP. Use a registry with HTTPS; TLS verification remains enabled.": "{registry} respondió con HTTP simple. Utilice un registro con HTTPS;La verificación TLS permanece habilitada.",
"{registry} did not respond within {timeout} seconds. Try again later.": "{registry} no respondió en {timeout} segundos. Vuelve a intentarlo más tarde.",
"{registry} is rate limiting requests. Wait a while and try again.": "{registry} es una tasa que limita las solicitudes. Espera un momento y vuelve a intentarlo.",
"{registry} reported a server error. Try again later.": "{registry} informó un error del servidor. Vuelve a intentarlo más tarde.",
"{registry} returned invalid or unsupported image metadata.": "{registry} devolvió metadatos de imagen no válidos o no compatibles.",
"{registry} answered with plain HTTP. Use a registry with HTTPS; TLS verification remains enabled.": "{registry} ha respondido con HTTP sin cifrar. Usa un registro con HTTPS; la verificación TLS sigue activa.",
"{registry} did not respond within {timeout} seconds. Try again later.": "{registry} no ha respondido en {timeout} segundos. Inténtalo más tarde.",
"{registry} is rate limiting requests. Wait a while and try again.": "{registry} está limitando las peticiones. Espera un rato e inténtalo de nuevo.",
"{registry} refused access to this image:\n{reference}\n\nIf the image is private, sign in with an account that can pull it.\n\nSign in now?": "{registry} ha denegado el acceso a esta imagen:\n{reference}\n\nSi la imagen es privada, inicia sesión con una cuenta que pueda descargarla.\n\n¿Iniciar sesión ahora?",
"{registry} reported a server error. Try again later.": "{registry} ha informado de un error del servidor. Inténtalo más tarde.",
"{registry} returned invalid or unsupported image metadata.": "{registry} ha devuelto metadatos de imagen no válidos o no admitidos.",
"— Full/Custom restore will skip kernel-tied paths": "— La restauración completa/personalizada omitirá las rutas vinculadas al kernel",
"— disk may be busy. Skipping fstab removal.": "— el disco puede estar ocupado. Saltarse la eliminación de fstab.",
"— restore proceeds as same-version (verified safe)": "- la restauración procede como la misma versión (segura verificada)",
+44 -42
View File
@@ -192,7 +192,7 @@
"Access bridge for Tandoor": "Pont d'accès pour Tandoor",
"Access could not be granted completely; the application may be unable to write to:": "L'accès n'a pas pu être accordé complètement ; l'application risque de ne pas pouvoir écrire dans :",
"Access could not be granted; the application cannot write to:": "L'accès n'a pas pu être accordé ; l'application ne peut pas écrire dans :",
"Access denied by {registry}. Check the image name and sign in from Registry accounts.": "Accès refusé par {registry}.Vérifiez le nom de l'image et connectez-vous à partir des comptes de registre.",
"Access denied by {registry}. Check the image name and sign in from Registry accounts.": "Accès refusé par {registry}. Vérifiez le nom de l'image et connectez-vous à partir des comptes de registre.",
"Access granted to the application on:": "Accès accordé à l’application sur :",
"Access password of the web interface (optional)": "Mot de passe d'accès à l'interface web (facultatif)",
"Access profile:": "Profil d'accès :",
@@ -506,7 +506,7 @@
"Authentication": "Authentification",
"Authentication & Security": "Authentification et sécurité",
"Authentication Error": "Erreur d'authentification",
"Authentication failed for {registry}. Check the account and token permissions.": "Échec de l'authentification pour {registry}.Vérifiez les autorisations du compte et du jeton.",
"Authentication failed for {registry}. Check the account and token permissions.": "Échec de l'authentification pour {registry}. Vérifiez les autorisations du compte et du jeton.",
"Authentication failed.": "L'authentification a échoué.",
"Authentication required:": "Authentification requise :",
"Authentication:": "Authentification:",
@@ -744,7 +744,7 @@
"Cannot resolve the container home directory:": "Impossible de résoudre le répertoire de base du conteneur :",
"Cannot validate credentials - no shares available for testing.": "Impossible de valider les informations d'identification - aucun partage disponible pour les tests.",
"Cannot verify the reused disk:": "Impossible de vérifier le disque réutilisé :",
"Cannot write the image archive to {storage}. Check storage access and mount status.": "Impossible d'écrire l'archive d'images sur {storage}.Vérifiez l'accès au stockage et l'état du montage.",
"Cannot write the image archive to {storage}. Check storage access and mount status.": "Impossible d'écrire l'archive d'images sur {storage}. Vérifiez l'accès au stockage et l'état du montage.",
"Capabilities cannot be kept and all dropped at the same time": "Les capacités ne peuvent être conservées et toutes abandonnées en même temps",
"Category": "Catégorie",
"Caution: Maximum mode generates more heat.": "Attention : le mode maximum génère plus de chaleur.",
@@ -805,7 +805,7 @@
"Check Samba Status": "Vérifier le statut de Samba",
"Check VM disk/PCI slots": "Vérifiez les emplacements disque/PCI de la VM",
"Check VM passthrough settings": "Vérifier les paramètres de relais de la VM",
"Check access to an image": "vérifier l'accès à une image",
"Check access to an image": "Vérifier l'accès à une image",
"Check connectivity with another host": "Vérifiez la connectivité avec un autre hôte",
"Check container mount points": "Vérifier les points de montage du conteneur",
"Check if container is unprivileged:": "Vérifiez si le conteneur n'est pas privilégié :",
@@ -832,7 +832,7 @@
"Checking free space in /var/cache/apt/archives...": "Vérification de l'espace libre dans /var/cache/apt/archives...",
"Checking if system disk is SSD or M.2...": "Vérifier si le disque système est SSD ou M.2...",
"Checking if the server belongs to OVH...": "Vérifier si le serveur appartient à OVH...",
"Checking image access and metadata. Please wait...": "vérification de l'accès aux images et des métadonnées. S'il vous plaît, attendez...",
"Checking image access and metadata. Please wait...": "Vérification de l'accès aux images et des métadonnées. S'il vous plaît, attendez...",
"Checking kernel headers and build tools...": "Vérification des en-têtes du noyau et des outils de construction...",
"Checking remaining interfaces": "Vérification des interfaces restantes",
"Checking that the container keeps running...": "Je vérifie que le conteneur continue de fonctionner...",
@@ -1374,20 +1374,20 @@
"Could not publish pending restore. Previous pending restore was kept.": "Impossible de publier la restauration en attente. La restauration précédente en attente a été conservée.",
"Could not push the key. Check the password and that": "Impossible d'appuyer sur la clé. Vérifiez le mot de passe et cela",
"Could not query the image registry": "Impossible d'interroger le registre d'images",
"Could not reach {registry}. Check its address, DNS and network access.": "Impossible d'atteindre {registry}.Vérifiez son adresse, son DNS et son accès au réseau.",
"Could not reach {registry}. Check its address, DNS and network access.": "Impossible d'atteindre {registry}. Vérifiez son adresse, son DNS et son accès au réseau.",
"Could not read SMART data from": "Impossible de lire les données SMART de",
"Could not read VM configuration.": "Impossible de lire la configuration de la VM.",
"Could not read the CUDA compute capability": "Impossible de lire la capacité de calcul CUDA",
"Could not read the NVIDIA driver version": "Impossible de lire la version du pilote NVIDIA",
"Could not read the host firewall rules": "Impossible de lire les règles du pare-feu de l'hôte",
"Could not read the image from {registry}. Check the reference and sign in from Registry accounts.": "impossible de lire l'image à partir de {registry}.Vérifiez la référence et connectez-vous à partir des comptes de registre.",
"Could not read the image from {registry}. Check the reference and sign in from Registry accounts.": "Impossible de lire l'image à partir de {registry}. Vérifiez la référence et connectez-vous à partir des comptes de registre.",
"Could not read this job.": "Impossible de lire ce travail.",
"Could not release ZRAM pages; existing profile remains active": "Impossible de publier les pages ZRAM ; le profil existant reste actif",
"Could not remount automatically. Try manually or check credentials.": "Impossible de remonter automatiquement. Essayez manuellement ou vérifiez les informations d'identification.",
"Could not remove VM automatically. Run manually:": "Impossible de supprimer automatiquement la VM. Exécuter manuellement :",
"Could not remove ZRAM profile; configuration was restored": "Impossible de supprimer le profil ZRAM ; la configuration a été restaurée",
"Could not remove ZRAM profile; configuration was restored but swap could not be restarted": "Impossible de supprimer le profil ZRAM ; la configuration a été restaurée mais le swap n'a pas pu être redémarré",
"Could not remove credentials for {registry}; saved file credentials were not changed.": "Impossible de supprimer les informations d'identification pour {registry} ;les informations d'identification du fichier enregistré n'ont pas été modifiées.",
"Could not remove credentials for {registry}; saved file credentials were not changed.": "Impossible de supprimer les informations d'identification pour {registry} ; les informations d'identification du fichier enregistré n'ont pas été modifiées.",
"Could not remove previous DKMS tree at": "Impossible de supprimer l'arborescence DKMS précédente à",
"Could not reserve a private network for the stack": "Impossible de réserver un réseau privé pour la pile",
"Could not resolve the Compose user:": "Impossible de résoudre l'utilisateur Composer :",
@@ -1402,7 +1402,7 @@
"Could not set VM virtual display to vga: std": "Impossible de définir l'affichage virtuel de la VM sur VGA : std",
"Could not set boot order for": "Impossible de définir l'ordre de démarrage pour",
"Could not set the container entrypoint": "Impossible de définir le point d'entrée du conteneur",
"Could not sign in to {registry}. Check registry access and token permissions.": "Impossible de se connecter à {registry}.Vérifiez l'accès au registre et les autorisations des jetons.",
"Could not sign in to {registry}. Check registry access and token permissions.": "Impossible de se connecter à {registry}. Vérifiez l'accès au registre et les autorisations des jetons.",
"Could not stage pending restore path:": "Impossible de préparer le chemin de restauration en attente :",
"Could not stage pending restore. Nothing new was scheduled.": "Impossible d’effectuer la restauration en attente. Rien de nouveau n'était prévu.",
"Could not stop LXC": "Impossible d'arrêter LXC",
@@ -1496,7 +1496,8 @@
"Credentials file created securely.": "Fichier d’informations d’identification créé en toute sécurité.",
"Credentials file removed.": "Fichier d'informations d'identification supprimé.",
"Credentials file:": "Fichier d'informations d'identification :",
"Credentials file:\n{path}\n\nOwned by root; directory mode 700 and file mode 600.\nBasic credentials are base64 encoded, not encrypted.\nCredential helpers use their own storage.\n\nUse an access token with permission to pull images.\nConfigure credentials on each node that downloads images.": "Fichier d'informations d'identification :\n{path}\n\nPropriété de root ;mode répertoire 700 et mode fichier 600.\nLes informations d’identification de base sont codées en base64 et non cryptées.\nLes assistants d’identification utilisent leur propre stockage.\n\nUtilisez un jeton d'accès avec l'autorisation d'extraire des images.\nConfigurez les informations d'identification sur chaque nœud qui télécharge des images.",
"Credentials file:\n{path}\n\nOwned by root; directory mode 700 and file mode 600.\nBasic credentials are base64 encoded, not encrypted.\nCredential helpers use their own storage.\n\nUse an access token with permission to pull images.\nConfigure credentials on each node that downloads images.": "Fichier d'informations d'identification :\n{path}\n\nPropriété de root ; mode répertoire 700 et mode fichier 600.\nLes informations d’identification de base sont codées en base64 et non cryptées.\nLes assistants d’identification utilisent leur propre stockage.\n\nUtilisez un jeton d'accès avec l'autorisation d'extraire des images.\nConfigurez les informations d'identification sur chaque nœud qui télécharge des images.",
"Credentials file:\n{path}\n\nOwned by root; directory mode 700 and file mode 600.\nBasic credentials are base64 encoded, not encrypted.\nCredential helpers use their own storage.\n\nUse an access token with permission to pull images.\nEvery node of the cluster uses the accounts saved here.": "Fichier d'informations d'identification :\n{path}\n\nPropriété de root ; mode répertoire 700 et mode fichier 600.\nLes informations d’identification de base sont codées en base64 et non cryptées.\nLes assistants d’identification utilisent leur propre stockage.\n\nUtilisez un jeton d'accès avec l'autorisation d'extraire des images.\nChaque nœud du cluster utilise les comptes enregistrés ici.",
"Credentials validated successfully": "Identifiants validés avec succès",
"Cross-host restore: guest IDs in backup overlap live IDs on target:": "Restauration entre hôtes : les ID d'invité dans la sauvegarde chevauchent les ID actifs sur la cible :",
"Cross-kernel restore — kernel-tied paths merged, not copied": "Restauration inter-noyau – chemins liés au noyau fusionnés, non copiés",
@@ -1634,7 +1635,7 @@
"Default login": "Connexion par défaut",
"Default options": "Options par défaut",
"Default options read/write": "Options par défaut lecture/écriture",
"Default settings": "paramètres par défaut",
"Default settings": "Paramètres par défaut",
"Default will be used:": "la valeur par défaut sera utilisée :",
"Default:": "Par défaut :",
"Default: only what the application needs": "Par défaut : seulement ce dont l'application a besoin",
@@ -1869,7 +1870,7 @@
"Doplarr_rs is a Discord bot for requesting media through *arr backends, written in Rust.": "Doplarr_rs est un robot Discord pour demander des médias à travers *arr backends, écrit dans Rust.",
"Double Commander is a free cross platform open source file manager with two panels side by side. It is inspired by Total Commander and features some new ideas.": "Double Commander est un gestionnaire de fichiers gratuit cross open source avec deux panneaux côte à côte. Il est inspiré par Total Commander et présente de nouvelles idées.",
"Download Spotify music with album art and metadata": "Télécharger Spotify musique avec album art et métadonnées",
"Download an image to template storage": "télécharger une image dans le stockage de modèles",
"Download an image to template storage": "Télécharger une image dans le stockage de modèles",
"Download an oci-compose from an address": "Télécharger un oci-compose à partir d'une adresse",
"Download failed for all attempted URLs": "Le téléchargement a échoué pour toutes les tentatives d'URL",
"Download its Compose file from an address": "Télécharger son fichier Composer depuis une adresse",
@@ -2019,11 +2020,11 @@
"Enter ZFS pool name for the selected disk:": "Entrez le nom du pool ZFS pour le disque sélectionné :",
"Enter a name for the mount point (used as /mnt/<name>):": "Entrez un nom pour le point de montage (utilisé comme /mnt/<name>) :",
"Enter a name for the new virtual machine:": "Entrez un nom pour la nouvelle machine virtuelle :",
"Enter a non-empty password or access token on a single line.": "saisissez un mot de passe non vide ou un jeton d'accès sur une seule ligne.",
"Enter a non-empty password or access token on a single line.": "Saisissez un mot de passe non vide ou un jeton d'accès sur une seule ligne.",
"Enter a number, or write or paste a command:": "Entrez un nombre, ou écrivez ou collez une commande :",
"Enter a systemd calendar event, e.g.:": "Saisissez un événement du calendrier systemd, par exemple :",
"Enter a usable IPv4 address with its prefix, for example": "Saisissez une adresse IPv4 utilisable avec son préfixe, par exemple",
"Enter a valid registry username.": "saisissez un nom d'utilisateur de registre valide.",
"Enter a valid registry username.": "Saisissez un nom d'utilisateur de registre valide.",
"Enter backup file (.zst):": "Entrez le fichier de sauvegarde (.zst) :",
"Enter backup path (.tar.zst):": "Entrez le chemin de sauvegarde (.tar.zst) :",
"Enter backup path (.vma.zst):": "Entrez le chemin de sauvegarde (.vma.zst) :",
@@ -2913,7 +2914,7 @@
"If your DHCP has a static reservation for the old MAC, update it.": "Si votre DHCP a une réservation statique pour l'ancien MAC, mettez-la à jour.",
"Image": "Image",
"Image Source Directory": "Répertoire des sources d'images",
"Image access confirmed.\n\n{reference}\n\nArchitecture: {architecture}\nVersion: {version}\nDownload size: {size}\nDigest: {digest}": "accès à l’image confirmé.\n\n{reference}\n\nArchitecture : {architecture}\nVersion : {version}\nTaille du téléchargement : {size}\nRésumé : {digest}",
"Image access confirmed.\n\n{reference}\n\nArchitecture: {architecture}\nVersion: {version}\nDownload size: {size}\nDigest: {digest}": "Accès à l’image confirmé.\n\n{reference}\n\nArchitecture : {architecture}\nVersion : {version}\nTaille du téléchargement : {size}\nRésumé : {digest}",
"Image cache": "cache d'image",
"Image compatibility restored:": "Compatibilité de l'image restaurée :",
"Image compatibility verified:": "Compatibilité de l'image vérifiée :",
@@ -2923,10 +2924,10 @@
"Image downloaded and verified.\n\n{reference}\n\nStorage: {storage}\nArchive size: {size}\nArchive: {archive}\n\nNo container was created.\nProxMenux removes unused cached images after successful updates.": "Image téléchargée et vérifiée.\n\n{reference}\n\nStockage : {storage}\nTaille des archives : {size}\nArchives : {archive}\n\nAucun conteneur n'a été créé.\nProxMenux supprime les images mises en cache inutilisées après des mises à jour réussies.",
"Image file not found:": "Fichier image introuvable :",
"Image imported:": "Image importée :",
"Image integrity verification failed. The partial download was discarded; try again.": "La vérification de l'intégrité de l'image a échoué. Le téléchargement partiel a été rejeté ;essayer à nouveau.",
"Image integrity verification failed. The partial download was discarded; try again.": "La vérification de l'intégrité de l'image a échoué. Le téléchargement partiel a été rejeté ; essayer à nouveau.",
"Image integrity verified": "Intégrité de l'image vérifiée",
"Image not allowed for the host monitor profile": "Image non autorisée pour le profil du moniteur hôte",
"Image reference": "référence de l'image",
"Image reference": "Référence de l'image",
"Image reference (for example ghcr.io/user/application:latest)": "Référence de l'image (par exemple ghcr.io/user/application:latest)",
"Image selection was cancelled": "La sélection de l'image a été annulée",
"Image that is not in the catalog": "Image ne figurant pas dans le catalogue",
@@ -3268,7 +3269,7 @@
"Invalid host path:": "Chemin de l'hôte non valide & #160;:",
"Invalid host-monitor firewall plan": "Plan de pare-feu de moniteur d'hôte invalide",
"Invalid image probe descriptor": "Descripteur de la sonde d'image non valide",
"Invalid image tag.": "balise d'image non valide.",
"Invalid image tag.": "Balise d'image non valide.",
"Invalid input": "Entrée invalide",
"Invalid internal volume": "Volume interne non valable",
"Invalid list:": "Liste non valide:",
@@ -3630,7 +3631,7 @@
"Manage custom paths (add / remove your folders)": "Gérer les chemins personnalisés (ajouter/supprimer vos dossiers)",
"Manage installed OCI applications": "Gérer les applications OCI installées",
"Manage local backup target": "Gérer la cible de sauvegarde locale",
"Manage private image registries.\nSaved credentials let ProxMenux access your private images.": "gérer les registres d’images privés.\nLes informations d'identification enregistrées permettent à ProxMenux d'accéder à vos images privées.",
"Manage private image registries.\nSaved credentials let ProxMenux access your private images.": "Gérer les registres d’images privés.\nLes informations d'identification enregistrées permettent à ProxMenux d'accéder à vos images privées.",
"Manage registry accounts as root on the Proxmox node.": "Gérez les comptes de registre en tant que root sur le nœud Proxmox.",
"Managed disks must have backup enabled and a valid size": "Les disques gérés doivent avoir une sauvegarde activée et une taille valide",
"Managing Nginx proxy hosts with a simple, powerful interface.": "Gestion des hôtes proxy Nginx avec une interface simple et puissante.",
@@ -4269,7 +4270,7 @@
"No recent": "Pas de récent",
"No recent Samba servers found.": "Aucun serveur Samba récent trouvé.",
"No registered OCI containers are available for selection on this host.": "Aucun conteneur OCI enregistré n'est disponible pour la sélection sur cet hôte.",
"No registry API was found at {registry}. Check the hostname and port.": "Aucune API de registre n'a été trouvée sur {registry}.Vérifiez le nom d'hôte et le port.",
"No registry API was found at {registry}. Check the hostname and port.": "Aucune API de registre n'a été trouvée sur {registry}. Vérifiez le nom d'hôte et le port.",
"No restored OCI application is waiting to be recovered.": "Aucune application OCI restaurée n'est en attente de récupération.",
"No results": "Aucun résultat",
"No routing information found.": "Aucune information de routage trouvée.",
@@ -4336,7 +4337,7 @@
"Not currently mounted — skipping umount.": "Non monté actuellement – ​​ignorer umount.",
"Not declared": "Non déclaré",
"Not enough free space for the backup": "Pas assez d'espace libre pour la sauvegarde",
"Not enough free space on {storage}. Free some space or select another storage.": "Pas assez d’espace libre sur {storage}.Libérez de l'espace ou sélectionnez un autre stockage.",
"Not enough free space on {storage}. Free some space or select another storage.": "Pas assez d’espace libre sur {storage}. Libérez de l'espace ou sélectionnez un autre stockage.",
"Not found": "Pas trouvé",
"Not found in the OCI archive:": "Non trouvé dans l'archive OCI :",
"Not imported:": "Non importé :",
@@ -4427,7 +4428,7 @@
"Only Intel/AMD DRM, Coral and USB nodes can be adopted automatically": "Seuls les nœuds Intel/AMD DRM, Coral et USB peuvent être adoptés automatiquement",
"Only Intel/AMD DRM, Coral, NPU and USB nodes can be adopted automatically": "Seuls les nœuds Intel/AMD DRM, Coral, NPU et USB peuvent être adoptés automatiquement",
"Only a Docker Swarm uses these settings, so they are not applied:": "Seul un Swarm Docker utilise ces paramètres, donc ils ne sont pas appliqués:",
"Only a full sha256 image digest is supported.": "seul un résumé d'image sha256 complet est pris en charge.",
"Only a full sha256 image digest is supported.": "Seul un résumé d'image sha256 complet est pris en charge.",
"Only an installed standalone OCI instance can adopt external changes": "Seule une instance OCI autonome installée peut adopter des modifications externes.",
"Only backed-up Proxmox volumes can be adopted": "Seuls les volumes Proxmox sauvegardés peuvent être adoptés",
"Only convert to privileged if absolutely necessary for your use case.": "Ne convertissez en privilèges que si cela est absolument nécessaire pour votre cas d'utilisation.",
@@ -4970,7 +4971,7 @@
"Reading SMART data...": "Lecture des données SMART...",
"Reading SMART self-test log...": "Lecture du journal d'autotest SMART...",
"Reading full SMART report...": "Lecture du rapport SMART complet...",
"Reading image metadata. Please wait...": "lecture des métadonnées de l'image. S'il vous plaît, attendez...",
"Reading image metadata. Please wait...": "Lecture des métadonnées de l'image. S'il vous plaît, attendez...",
"Real-time Performance Monitoring": "Surveillance du rendement en temps réel",
"Real-time bandwidth usage (press q to exit)": "Utilisation de la bande passante en temps réel (appuyez sur q pour quitter)",
"Real-time collaborative document editor": "Éditeur de document collaboratif en temps réel",
@@ -5064,7 +5065,7 @@
"Registering disk as Proxmox storage...": "Enregistrement du disque en tant que stockage Proxmox...",
"Registering module with DKMS...": "Module d'enregistrement avec DKMS...",
"Registry accounts": "Comptes de registre",
"Registry hostname": "nom d'hôte du registre",
"Registry hostname": "Nom d'hôte du registre",
"Registry: {registry}\nAccount: {account}\nAuthentication: {method}\n\nSaved credentials are verified when an image is accessed.": "Registre : {registry}\nCompte : {account}\nAuthentification : {method}\n\nLes informations d'identification enregistrées sont vérifiées lors de l'accès à une image.",
"Reinstall / update Coral drivers": "Réinstaller/mettre à jour les pilotes Coral",
"Reinstall Fail2Ban": "Réinstaller Fail2Ban",
@@ -5462,7 +5463,7 @@
"Save and classify articles. Read them later. Freely.": "Enregistrer et classer les articles. Lisez-les plus tard. Gratuitement.",
"Save the passphrase somewhere safe NOW, before continuing.": "Enregistrez la phrase secrète dans un endroit sûr MAINTENANT, avant de continuer.",
"Save this Borg target so you don't need to enter the details again?": "Enregistrer cette cible Borg pour ne pas avoir à saisir à nouveau les détails ?",
"Saved credentials for {registry} were removed.\nOther Skopeo/Docker credential files are managed separately.": "les informations d'identification enregistrées pour {registry} ont été supprimées.\nLes autres fichiers d'informations d'identification Skopeo/Docker sont gérés séparément.",
"Saved credentials for {registry} were removed.\nOther Skopeo/Docker credential files are managed separately.": "Les informations d'identification enregistrées pour {registry} ont été supprimées.\nLes autres fichiers d'informations d'identification Skopeo/Docker sont gérés séparément.",
"Saved record removed": "Enregistrement supprimé",
"Saving changes...": "Enregistrer les modifications...",
"Saving the new configuration": "Enregistrement de la nouvelle configuration",
@@ -5847,7 +5848,7 @@
"Sign in to the panel and create a Samba user in Settings before publishing a directory over SMB.": "Connectez-vous au panneau et créez un utilisateur Samba dans Paramètres avant de publier un répertoire via SMB.",
"Signal is a messaging app with privacy at its core. It is free and easy to use, with strong end-to-end encryption that keeps your communication completely private.": "Signal est une application de messagerie avec la confidentialité à son cœur. Il est gratuit et facile à utiliser, avec un cryptage de bout en bout fort qui maintient votre communication complètement privée.",
"Signatures removed. Partition table preserved.": "Signatures supprimées. Table de partition conservée.",
"Signed in to {registry} as {username}.\n\nCredentials are saved for ProxMenux.\nSelect the account to check, download or install an image.": "connecté à {registry} en tant que {username}.\n\nLes informations d'identification sont enregistrées pour ProxMenux.\nSélectionnez le compte pour vérifier, télécharger ou installer une image.",
"Signed in to {registry} as {username}.\n\nCredentials are saved for ProxMenux.\nSelect the account to check, download or install an image.": "Connecté à {registry} en tant que {username}.\n\nLes informations d'identification sont enregistrées pour ProxMenux.\nSélectionnez le compte pour vérifier, télécharger ou installer une image.",
"Simple and easy to use DDNS": "Simple et facile à utiliser DDNS",
"Single GPU Warning": "Avertissement sur un seul GPU",
"Single target found — selected automatically:": "Cible unique trouvée — sélectionnée automatiquement :",
@@ -5874,7 +5875,7 @@
"Skipping installation.": "Sauter l'installation.",
"Skipping manual patches — feranick fork already supports this kernel.": "Ignorer les correctifs manuels — feranick fork prend déjà en charge ce noyau.",
"Skopeo is not available. Restore the ProxMenux OCI dependencies and try again.": "Skopeo n’est pas disponible. Restaurez les dépendances ProxMenux OCI et réessayez.",
"Skopeo returned an invalid credential file; saved credentials were not changed.": "Skopeo a renvoyé un fichier d'informations d'identification invalide ;les informations d'identification enregistrées n'ont pas été modifiées.",
"Skopeo returned an invalid credential file; saved credentials were not changed.": "Skopeo a renvoyé un fichier d'informations d'identification invalide ; les informations d'identification enregistrées n'ont pas été modifiées.",
"Sleek podcast downloader with GPodder sync": "Téléchargeur de podcast Sleek avec synchronisation GPodder",
"Smart restore plan — hardware compatibility check": "Plan de restauration intelligent – vérification de la compatibilité matérielle",
"Smokeping keeps track of your network latency. For a full example of what this application is capable of visit UCDavis.": "Smokeping suit votre latence réseau. Pour un exemple complet de ce que cette application est capable de visiter UCDavis.",
@@ -6132,7 +6133,7 @@
"TCP optimizations configuration completed": "Configuration des optimisations TCP terminée",
"TCP optimizations reverted (defaults restored on next reboot)": "Optimisations TCP annulées (valeurs par défaut restaurées au prochain redémarrage)",
"TCP port 5201 is reachable (firewall on server)": "Le port TCP 5201 est accessible (pare-feu sur le serveur)",
"TLS verification failed for {registry}. Install the registry CA in /etc/containers/certs.d/{registry}/ca.crt.": "La vérification TLS a échoué pour {registry}.Installez l'autorité de certification de registre dans /etc/containers/certs.d/{registry}/ca.crt.",
"TLS verification failed for {registry}. Install the registry CA in /etc/containers/certs.d/{registry}/ca.crt.": "La vérification TLS a échoué pour {registry}. Installez l'autorité de certification de registre dans /etc/containers/certs.d/{registry}/ca.crt.",
"TPM device added to VM": "Périphérique TPM ajouté à la VM",
"TPM storage selection failed or was cancelled. VM creation aborted.": "La sélection du stockage TPM a échoué ou a été annulée. Création de VM abandonnée.",
"TROUBLESHOOTING:": "DÉPANNAGE :",
@@ -6364,7 +6365,7 @@
"The containers do not need them any more; an update downloads the new versions when there are any.": "Les conteneurs n'en ont plus besoin ; une mise à jour télécharge les nouvelles versions quand il y en a.",
"The containers were created from downloaded OCI images": "Les conteneurs ont été créés à partir d'images OCI téléchargées",
"The coordinated backup was modified": "La sauvegarde coordonnée a été modifiée",
"The credential file changed during this operation. Try again; it was not overwritten.": "le fichier d'informations d'identification a été modifié au cours de cette opération. Essayer à nouveau;il n'a pas été écrasé.",
"The credential file changed during this operation. Try again; it was not overwritten.": "Le fichier d'informations d'identification a été modifié au cours de cette opération. Essayer à nouveau; il n'a pas été écrasé.",
"The current driver will be completely uninstalled before installing the new version. Continue?": "Le pilote actuel sera complètement désinstallé avant d'installer la nouvelle version. Continuer?",
"The current image of the saved channel will be checked and downloaded. Resources, paths and GPU are kept. The CT is stopped during the replacement and a native backup is created first.": "L'image actuelle du canal sauvegardé sera vérifiée et téléchargée. Les ressources, les chemins et le GPU sont conservés. Le CT est arrêté pendant le remplacement et une sauvegarde native est créée en premier.",
"The current record is missing for": "L'enregistrement actuel manque pour",
@@ -6601,15 +6602,15 @@
"The record or diagnosis could not be completed; no update was run.": "Le dossier ou le diagnostic n'a pu être complété; aucune mise à jour n'a été effectuée.",
"The recovery did not complete. Review the log and choose \"Recover\" again for this container in the OCI management menu.": "La récupération n'est pas terminée. Passez en revue le journal et choisissez « Recover » pour ce conteneur dans le menu de gestion OCI.",
"The recovery did not complete. Review the log and choose \"{choice}\" again for this container in the OCI management menu.": "La restauration ne s'est pas terminée. Consultez le journal et choisissez de nouveau « {choice} » pour ce conteneur dans le menu de gestion OCI.",
"The registry authentication file is invalid; it was not changed.": "Le fichier d'authentification du registre n'est pas valide ;cela n'a pas été changé.",
"The registry authentication file is invalid; it was not changed.": "Le fichier d'authentification du registre n'est pas valide ; cela n'a pas été changé.",
"The registry authentication file must be owned by root with mode 600.": "Le fichier d'authentification du registre doit appartenir à root avec le mode 600.",
"The registry authentication file must have an absolute path.": "Le fichier d’authentification du registre doit avoir un chemin absolu.",
"The registry authentication path cannot contain symbolic links.": "Le chemin d’authentification du registre ne peut pas contenir de liens symboliques.",
"The registry authentication path has an unsafe parent directory.": "Le chemin d'authentification du registre possède un répertoire parent non sécurisé.",
"The registry credential directory must be owned by root with mode 700.": "Le répertoire des informations d'identification du registre doit appartenir à root avec le mode 700.",
"The registry did not return the saved image digest": "Le registre n'a pas renvoyé le digest d'image enregistré",
"The registry returned incomplete or unsupported image metadata.": "le registre a renvoyé des métadonnées d'image incomplètes ou non prises en charge.",
"The registry returned invalid or unsupported image metadata.": "le registre a renvoyé des métadonnées d'image invalides ou non prises en charge.",
"The registry returned incomplete or unsupported image metadata.": "Le registre a renvoyé des métadonnées d'image incomplètes ou non prises en charge.",
"The registry returned invalid or unsupported image metadata.": "Le registre a renvoyé des métadonnées d'image invalides ou non prises en charge.",
"The remote does not exist; create and authorize it first in the WebUI:": "La télécommande n'existe pas; créez et autorisez-la d'abord dans le WebUI:",
"The remote installer must run as root on Proxmox VE": "L'installateur distant doit fonctionner comme root sur Proxmox VE",
"The remote must already be created and authorized in the Rclone web UI. This operation restarts the CT and publishes two FUSE views on the host.": "La télécommande doit déjà être créée et autorisée dans l'interface web Rclone. Ce operation redémarre le CT et publie deux vues FUSE sur l'hôte.",
@@ -6768,7 +6769,7 @@
"This GPU is considered incompatible with GPU passthrough to a VM in ProxMenux.": "Ce GPU est considéré comme incompatible avec le relais GPU vers une VM dans ProxMenux.",
"This NFS share is fully restricted — even the host root cannot write to it.": "Ce partage NFS est entièrement restreint : même la racine de l'hôte ne peut pas y écrire.",
"This VM requires extra installation steps, see install guide at:\nhttps://github.com/community-scripts/ProxmoxVE/discussions/144": "Cette VM nécessite des étapes d'installation supplémentaires. Consultez le guide d'installation à l'adresse :\nhttps://github.com/community-scripts/ProxmoxVE/discussions/144",
"This account is for {registry}. Enter an image from that registry.": "Ce compte concerne {registry}.Entrez une image de ce registre.",
"This account is for {registry}. Enter an image from that registry.": "Ce compte concerne {registry}. Entrez une image de ce registre.",
"This action will:": "Cette action va :",
"This application cannot be recovered yet:": "Cette application ne peut pas encore être récupérée :",
"This application cannot be recovered yet; nothing was changed:": "Cette application ne peut pas encore être récupérée ; rien n'a été changé :",
@@ -7129,7 +7130,7 @@
"Update cancelled by user": "Mise à jour annulée par l'utilisateur",
"Update completed. Data kept.": "Mise à jour terminée. Données conservées.",
"Update completed. Press Enter to continue...": "Mise à jour terminée. Appuyez sur Entrée pour continuer...",
"Update credentials": "mettre à jour les informations d'identification",
"Update credentials": "Mettre à jour les informations d'identification",
"Update every container of the application": "Mettre à jour chaque conteneur de l'application",
"Update kernel to compatible version": "Mettre à jour le noyau vers une version compatible",
"Update now?": "Mise à jour ?",
@@ -7196,10 +7197,10 @@
"Use a custom path": "utiliser un chemin personnalisé",
"Use a privileged LXC for NFS server/client workflows.": "Utilisez un LXC privilégié pour les workflows serveur/client NFS.",
"Use a privileged LXC for Samba client/server workflows.": "Utilisez un LXC privilégié pour les workflows client/serveur Samba.",
"Use a registry hostname, for example ghcr.io or registry.example.com:5000.": "utilisez un nom d'hôte de registre, par exemple ghcr.io ou registry.example.com:5000.",
"Use a registry hostname, for example ghcr.io or registry.example.com:5000.": "Utilisez un nom d'hôte de registre, par exemple ghcr.io ou registry.example.com:5000.",
"Use an existing SSH private key file on this host": "Utiliser un fichier de clé privée SSH existant sur cet hôte",
"Use an existing keyfile": "utiliser un fichier de clés existant",
"Use an image reference, for example ghcr.io/owner/app:latest.": "utilisez une référence d'image, par exemple ghcr.io/owner/app:latest.",
"Use an image reference, for example ghcr.io/owner/app:latest.": "Utilisez une référence d'image, par exemple ghcr.io/owner/app:latest.",
"Use as-is — keep data and filesystem": "Utiliser tel quel – conserver les données et le système de fichiers",
"Use content types according to your use case.": "Utilisez les types de contenu en fonction de votre cas d'utilisation.",
"Use default": "utiliser la valeur par défaut",
@@ -7639,7 +7640,7 @@
"assembling": "assemblage",
"automatically. Install it manually inside the container.": "automatiquement. Installez-le manuellement à l'intérieur du conteneur.",
"automatically. Reboot LXC to fully release.": "automatiquement. Redémarrez LXC pour le libérer complètement.",
"available": "disponible",
"available": "Disponible",
"available for LXC bind-mounts via 'LXC Mount Manager'": "disponible pour les montages liés LXC via 'LXC Mount Manager'",
"available in this same GPU and TPU menu.": "disponible dans ce même menu GPU et TPU.",
"backup at /etc/fstab.proxmenux.bak": "sauvegarde sur /etc/fstab.proxmenux.bak",
@@ -7992,7 +7993,7 @@
"runs in": "cours d'eau",
"safe paths now (configs, packages, /etc, /root, ...)": "chemins sécurisés maintenant (configurations, packages, /etc, /root, ...)",
"same MAC": "même MAC",
"saved": "enregistré",
"saved": "Enregistré",
"seconds (default)": "secondes (par défaut)",
"see log:": "voir le journal :",
"selected by default": "sélectionné par défaut",
@@ -8111,13 +8112,14 @@
"zfs-auto-snapshot removed (existing snapshots preserved on the pool)": "zfs-auto-snapshot supprimé (instantanés existants conservés sur le pool)",
"zpool command not found. Install zfsutils-linux and retry.": "Commande zpool introuvable. Installez zfsutils-linux et réessayez.",
"zpool not found. Install zfsutils-linux and retry.": "zpool introuvable. Installez zfsutils-linux et réessayez.",
"{count} saved account.": "compte enregistré {count}.",
"{count} saved accounts.": "comptes enregistrés {count}.",
"{count} saved account.": "Compte enregistré {count}.",
"{count} saved accounts.": "Comptes enregistrés {count}.",
"{path} already exists and belongs to another user of the host, so {app} cannot write to it.\n\nProxMenux can add access rules (ACL) to this directory, to everything inside it and to what is created there later, for the users and groups {app} runs as on the host (IDs {ids}). The owner of the files does not change and whatever reads or writes them today keeps doing so; the owner of the directory also gets access to the files {app} creates.\n\nGrant {app} access to this directory?": "{path} existe déjà et appartient à un autre utilisateur de l'hôte, donc {app} ne peut pas y écrire.\n\nProxMenux peut ajouter des règles d'accès (ACL) à ce répertoire, à tout ce qu'il contient et à ce qui y sera créé ensuite, pour les utilisateurs et les groupes sous lesquels {app} s'exécute sur l'hôte (ID {ids}). Le propriétaire des fichiers ne change pas et ce qui les lit ou les écrit aujourd'hui continue de le faire ; le propriétaire du répertoire a également accès aux fichiers créés par {app}.\n\nAccorder à {app} l'accès à ce répertoire ?",
"{path} already exists and belongs to another user of the host, so {app} cannot write to it.\n\nProxMenux can add an access rule (ACL) for the identity {app} uses on the host (UID {uid}). Nothing that is there changes owner or permissions: whatever reads or writes those files today keeps doing so, and the owner of the directory also gets access to the files {app} creates.\n\nGrant {app} access to this directory?": "{path} existe déjà et appartient à un autre utilisateur de l'hôte, donc {app} ne peut pas y écrire.\n\nProxMenux peut ajouter une règle d'accès (ACL) pour l'identité que {app} utilise sur l'hôte (UID {uid}).Rien de ce qui s'y trouve ne change le propriétaire ou les autorisations : tout ce qui lit ou écrit ces fichiers aujourd'hui continue de le faire, et le propriétaire du répertoire a également accès aux fichiers créés par {app}.\n\nAccorder à {app} l'accès à ce répertoire ?",
"{registry} answered with plain HTTP. Use a registry with HTTPS; TLS verification remains enabled.": "{registry} a répondu avec HTTP simple. Utilisez un registre avec HTTPS ;La vérification TLS reste activée.",
"{registry} did not respond within {timeout} seconds. Try again later.": "{registry} n'a pas répondu dans les secondes {timeout}.Réessayez plus tard.",
"{registry} answered with plain HTTP. Use a registry with HTTPS; TLS verification remains enabled.": "{registry} a répondu avec HTTP simple. Utilisez un registre avec HTTPS ; La vérification TLS reste activée.",
"{registry} did not respond within {timeout} seconds. Try again later.": "{registry} n'a pas répondu dans les secondes {timeout}. Réessayez plus tard.",
"{registry} is rate limiting requests. Wait a while and try again.": "{registry} correspond aux requêtes de limitation de débit. Attendez un peu et réessayez.",
"{registry} refused access to this image:\n{reference}\n\nIf the image is private, sign in with an account that can pull it.\n\nSign in now?": "{registry} a refusé l'accès à cette image :\n{reference}\n\nSi l'image est privée, connectez-vous avec un compte capable de l'extraire.\n\nConnectez-vous maintenant ?",
"{registry} reported a server error. Try again later.": "{registry} a signalé une erreur de serveur. Réessayez plus tard.",
"{registry} returned invalid or unsupported image metadata.": "{registry} a renvoyé des métadonnées d'image non valides ou non prises en charge.",
"— Full/Custom restore will skip kernel-tied paths": "— La restauration complète/personnalisée ignorera les chemins liés au noyau",
+76 -74
View File
@@ -192,7 +192,7 @@
"Access bridge for Tandoor": "Bridge di accesso per Tandoor",
"Access could not be granted completely; the application may be unable to write to:": "Non è stato possibile concedere completamente l'accesso; l'applicazione potrebbe non riuscire a scrivere a:",
"Access could not be granted; the application cannot write to:": "Impossibile concedere l'accesso; l'applicazione non può scrivere a:",
"Access denied by {registry}. Check the image name and sign in from Registry accounts.": "accesso negato da {registry}.Controlla il nome dell'immagine e accedi dagli account del Registro.",
"Access denied by {registry}. Check the image name and sign in from Registry accounts.": "Accesso negato da {registry}. Controlla il nome dell'immagine e accedi dagli account del Registro.",
"Access granted to the application on:": "Accesso concesso all'applicazione a:",
"Access password of the web interface (optional)": "Password di accesso all'interfaccia web (facoltativa)",
"Access profile:": "Profilo di accesso:",
@@ -311,7 +311,7 @@
"Advanced": "Avanzato",
"Advanced Diagnostics": "Diagnostica avanzata",
"Advanced Network Diagnostics": "Diagnostica di rete avanzata",
"Advanced settings": "impostazioni avanzate",
"Advanced settings": "Impostazioni avanzate",
"Advanced: every setting of the container": "Avanzata: tutte le impostazioni del container",
"Affected LXC containers": "Container LXC interessati",
"After completing GPU setup, start the VM manually when the host is ready.": "Dopo aver completato la configurazione della GPU, avvia manualmente la VM quando l'host è pronto.",
@@ -405,7 +405,7 @@
"Another OCI operation is using the instance registry. Wait for it to finish and open this menu again; no container is modified.": "Un'altra operazione OCI sta utilizzando il registro delle istanze. Attendere che termini e riaprire questo menu; nessun container è stato modificato.",
"Another OCI operation is using the instance registry. Wait for it to finish.": "Un’altra operazione OCI sta utilizzando il registro delle istanze. Attendi che termini.",
"Another OCI operation is using the registry. This operation was not started.": "Un’altra operazione OCI sta utilizzando il registro. Questa operazione non è stata avviata.",
"Another ProxMenux OCI operation is running. Try again when it finishes.": "è in esecuzione un'altra operazione ProxMenux OCI.Riprovare al termine.",
"Another ProxMenux OCI operation is running. Try again when it finishes.": "È in esecuzione un'altra operazione ProxMenux OCI. Riprovare al termine.",
"Another ZRAM configuration exists or could not be inspected; systemd-zram-generator was retained": "Esiste un'altra configurazione ZRAM o non è possibile controllarla; systemd-zram-generator è stato mantenuto",
"Another ZRAM generator configuration exists; refusing to overwrite it:": "Esiste un'altra configurazione del generatore ZRAM; rifiutandosi di sovrascriverlo:",
"Another ZRAM swap setup exists; refusing to replace it:": "Esiste un'altra configurazione di scambio ZRAM; rifiutandosi di sostituirlo:",
@@ -413,7 +413,7 @@
"Another instance uses": "Un'altra istanza usa",
"Another job that writes to the same storage still starts them.": "Un altro job che scrive sullo stesso storage continua ad avviarli.",
"Another node, typed by hand": "Altro nodo di dispositivo (manuale)",
"Another registry account operation is running. Try again when it finishes.": "è in esecuzione un'altra operazione sull'account del registro. Riprovare al termine.",
"Another registry account operation is running. Try again when it finishes.": "È in esecuzione un'altra operazione sull'account del registro. Riprovare al termine.",
"Another stack operation is pending": "È in sospeso un'altra operazione sullo stack",
"Application": "Applicazione",
"Application registered on this host:": "Applicazione registrata su questo host:",
@@ -506,7 +506,7 @@
"Authentication": "Autenticazione",
"Authentication & Security": "Autenticazione e sicurezza",
"Authentication Error": "Errore di autenticazione",
"Authentication failed for {registry}. Check the account and token permissions.": "Messaggio tecnico per Proxmox e IT.Traduzione: autenticazione non riuscita per {registry}.Controlla le autorizzazioni dell'account e del token.",
"Authentication failed for {registry}. Check the account and token permissions.": "Messaggio tecnico per Proxmox e IT. Traduzione: autenticazione non riuscita per {registry}. Controlla le autorizzazioni dell'account e del token.",
"Authentication failed.": "Autenticazione non riuscita.",
"Authentication required:": "Autenticazione richiesta:",
"Authentication:": "Autenticazione:",
@@ -744,7 +744,7 @@
"Cannot resolve the container home directory:": "Impossibile determinare la directory home del container:",
"Cannot validate credentials - no shares available for testing.": "Impossibile convalidare le credenziali: nessuna condivisione disponibile per il test.",
"Cannot verify the reused disk:": "Impossibile verificare il disco riutilizzato:",
"Cannot write the image archive to {storage}. Check storage access and mount status.": "impossibile scrivere l'archivio immagini su {storage}.Controlla l'accesso allo spazio di archiviazione e lo stato di montaggio.",
"Cannot write the image archive to {storage}. Check storage access and mount status.": "Impossibile scrivere l'archivio immagini su {storage}. Controlla l'accesso allo spazio di archiviazione e lo stato di montaggio.",
"Capabilities cannot be kept and all dropped at the same time": "Non è possibile conservare alcune capability e rimuoverle tutte contemporaneamente",
"Category": "Categoria",
"Caution: Maximum mode generates more heat.": "Attenzione: la modalità massima genera più calore.",
@@ -805,7 +805,7 @@
"Check Samba Status": "Controlla stato Samba",
"Check VM disk/PCI slots": "Controlla gli slot disco/PCI della VM",
"Check VM passthrough settings": "Controlla impostazioni passthrough VM",
"Check access to an image": "controlla l'accesso a un'immagine",
"Check access to an image": "Controlla l'accesso a un'immagine",
"Check connectivity with another host": "Controlla la connettività con un altro host",
"Check container mount points": "Controlla i punti di montaggio del container",
"Check if container is unprivileged:": "Controlla se il container non è privilegiato:",
@@ -818,7 +818,7 @@
"Check that:": "Controlla che:",
"Check the error messages above for details.": "Controlla i messaggi di errore qui sopra per i dettagli.",
"Check the image reference and registry access. If the registry is unavailable, try again later. A private registry needs credentials, which are not supported yet.": "Controllare il riferimento dell'immagine e l'accesso al registro. Se il registro non è disponibile, riprovare più tardi. Un registro privato richiede credenziali, che non sono ancora supportate.",
"Check the image reference and registry access. If the registry is unavailable, try again later. For a private image, sign in from Registry accounts in the OCI menu.": "controlla il riferimento all'immagine e l'accesso al registro. Se il registro non è disponibile, riprova più tardi. Per un'immagine privata, accedi dagli account del Registro nel menu OCI.",
"Check the image reference and registry access. If the registry is unavailable, try again later. For a private image, sign in from Registry accounts in the OCI menu.": "Controlla il riferimento all'immagine e l'accesso al registro. Se il registro non è disponibile, riprova più tardi. Per un'immagine privata, accedi dagli account del Registro nel menu OCI.",
"Check the service status manually if needed.": "Controlla manualmente lo stato del servizio, se necessario.",
"Checking MOTD configuration...": "Controllo della configurazione MOTD...",
"Checking NVIDIA driver status with nvidia-smi": "Controllo dello stato del driver NVIDIA con nvidia-smi",
@@ -832,7 +832,7 @@
"Checking free space in /var/cache/apt/archives...": "Controllo dello spazio libero in /var/cache/apt/archives...",
"Checking if system disk is SSD or M.2...": "Verifica se il disco di sistema è SSD o M.2...",
"Checking if the server belongs to OVH...": "Verifica se il server appartiene a OVH...",
"Checking image access and metadata. Please wait...": "controllo dell'accesso alle immagini e dei metadati. Attendere prego...",
"Checking image access and metadata. Please wait...": "Controllo dell'accesso alle immagini e dei metadati. Attendere prego...",
"Checking kernel headers and build tools...": "Controllo delle intestazioni kernel e degli strumenti di compilazione...",
"Checking remaining interfaces": "Controllo delle interfacce rimanenti",
"Checking that the container keeps running...": "Controllo che il container rimanga in esecuzione...",
@@ -906,7 +906,7 @@
"Choose iperf3 mode:": "Scegli la modalità iperf3:",
"Choose options to configure:": "Scegli le opzioni da configurare:",
"Choose specific VMs/CTs": "Scegli VM/CT specifici",
"Choose storage for the downloaded image.": "scegli lo spazio di archiviazione per l'immagine scaricata.",
"Choose storage for the downloaded image.": "Scegli lo spazio di archiviazione per l'immagine scaricata.",
"Choose the driver version for Coral M.2:": "Scegli la versione del driver per Coral M.2:",
"Choose the filesystem for the new partition:": "Scegli il filesystem per la nuova partizione:",
"Choose the release channel to use:": "Scegli il canale di rilascio da usare:",
@@ -1374,20 +1374,20 @@
"Could not publish pending restore. Previous pending restore was kept.": "Impossibile pubblicare il ripristino in sospeso. Il precedente ripristino in sospeso è stato mantenuto.",
"Could not push the key. Check the password and that": "Impossibile trasferire la chiave. Controlla la password e verifica che",
"Could not query the image registry": "Impossibile interrogare il registro delle immagini",
"Could not reach {registry}. Check its address, DNS and network access.": "impossibile raggiungere {registry}.Controlla il suo indirizzo, DNS e accesso alla rete.",
"Could not reach {registry}. Check its address, DNS and network access.": "Impossibile raggiungere {registry}. Controlla il suo indirizzo, DNS e accesso alla rete.",
"Could not read SMART data from": "Impossibile leggere i dati SMART da",
"Could not read VM configuration.": "Impossibile leggere la configurazione della VM.",
"Could not read the CUDA compute capability": "Impossibile leggere la compute capability CUDA",
"Could not read the NVIDIA driver version": "Impossibile leggere la versione del driver NVIDIA",
"Could not read the host firewall rules": "Impossibile leggere le regole del firewall dell’host",
"Could not read the image from {registry}. Check the reference and sign in from Registry accounts.": "impossibile leggere l'immagine da {registry}.Controlla il riferimento e accedi dagli account del Registro.",
"Could not read the image from {registry}. Check the reference and sign in from Registry accounts.": "Impossibile leggere l'immagine da {registry}. Controlla il riferimento e accedi dagli account del Registro.",
"Could not read this job.": "Impossibile leggere questo job.",
"Could not release ZRAM pages; existing profile remains active": "Impossibile rilasciare le pagine ZRAM; il profilo esistente rimane attivo",
"Could not remount automatically. Try manually or check credentials.": "Impossibile rimontare automaticamente. Prova manualmente o controlla le credenziali.",
"Could not remove VM automatically. Run manually:": "Impossibile rimuovere la VM automaticamente. Esegui manualmente:",
"Could not remove ZRAM profile; configuration was restored": "Impossibile rimuovere il profilo ZRAM; la configurazione è stata ripristinata",
"Could not remove ZRAM profile; configuration was restored but swap could not be restarted": "Impossibile rimuovere il profilo ZRAM; la configurazione è stata ripristinata ma non è stato possibile riavviare lo scambio",
"Could not remove credentials for {registry}; saved file credentials were not changed.": "Messaggio tecnico per Proxmox e IT.Traduzione: impossibile rimuovere le credenziali per {registry};le credenziali del file salvato non sono state modificate.",
"Could not remove credentials for {registry}; saved file credentials were not changed.": "Messaggio tecnico per Proxmox e IT. Traduzione: impossibile rimuovere le credenziali per {registry}; le credenziali del file salvato non sono state modificate.",
"Could not remove previous DKMS tree at": "Impossibile rimuovere l'albero DKMS precedente in",
"Could not reserve a private network for the stack": "Impossibile riservare una rete privata per lo stack",
"Could not resolve the Compose user:": "Impossibile risolvere l’utente Compose:",
@@ -1402,7 +1402,7 @@
"Could not set VM virtual display to vga: std": "Impossibile impostare il display virtuale della VM su vga: std",
"Could not set boot order for": "Impossibile impostare l'ordine di avvio per",
"Could not set the container entrypoint": "Impossibile impostare l'entrypoint del container",
"Could not sign in to {registry}. Check registry access and token permissions.": "impossibile accedere a {registry}.Controlla l'accesso al registro e le autorizzazioni del token.",
"Could not sign in to {registry}. Check registry access and token permissions.": "Impossibile accedere a {registry}. Controlla l'accesso al registro e le autorizzazioni del token.",
"Could not stage pending restore path:": "Impossibile preparare il percorso di ripristino in sospeso:",
"Could not stage pending restore. Nothing new was scheduled.": "Impossibile preparare il ripristino in sospeso. Non è stato pianificato nulla di nuovo.",
"Could not stop LXC": "Impossibile fermare LXC",
@@ -1490,13 +1490,14 @@
"Creating the temporary data container": "Creazione del container temporaneo per i dati",
"Creative & Design": "Creatività e design",
"Credential helper": "Assistente credenziali",
"Credential storage and access": "archiviazione e accesso alle credenziali",
"Credential storage and access": "Archiviazione e accesso alle credenziali",
"Credentials are correct": "Le credenziali sono corrette",
"Credentials cleared. jwt_secret and API tokens preserved.": "Credenziali cancellate. jwt_secret e token API conservati.",
"Credentials file created securely.": "File delle credenziali creato in sicurezza.",
"Credentials file removed.": "File delle credenziali rimosso.",
"Credentials file:": "File delle credenziali:",
"Credentials file:\n{path}\n\nOwned by root; directory mode 700 and file mode 600.\nBasic credentials are base64 encoded, not encrypted.\nCredential helpers use their own storage.\n\nUse an access token with permission to pull images.\nConfigure credentials on each node that downloads images.": "File delle credenziali:\n{path}\n\nDi proprietà di root;modalità directory 700 e modalità file 600.\nLe credenziali di base sono codificate base64, non crittografate.\nGli helper credenziali utilizzano il proprio spazio di archiviazione.\n\nUtilizza un token di accesso con l'autorizzazione per estrarre le immagini.\nConfigura le credenziali su ciascun nodo che scarica le immagini.",
"Credentials file:\n{path}\n\nOwned by root; directory mode 700 and file mode 600.\nBasic credentials are base64 encoded, not encrypted.\nCredential helpers use their own storage.\n\nUse an access token with permission to pull images.\nConfigure credentials on each node that downloads images.": "File delle credenziali:\n{path}\n\nDi proprietà di root; modalità directory 700 e modalità file 600.\nLe credenziali di base sono codificate base64, non crittografate.\nGli helper credenziali utilizzano il proprio spazio di archiviazione.\n\nUtilizza un token di accesso con l'autorizzazione per estrarre le immagini.\nConfigura le credenziali su ciascun nodo che scarica le immagini.",
"Credentials file:\n{path}\n\nOwned by root; directory mode 700 and file mode 600.\nBasic credentials are base64 encoded, not encrypted.\nCredential helpers use their own storage.\n\nUse an access token with permission to pull images.\nEvery node of the cluster uses the accounts saved here.": "File delle credenziali:\n{path}\n\nDi proprietà di root; modalità directory 700 e modalità file 600.\nLe credenziali di base sono codificate base64, non crittografate.\nGli helper credenziali utilizzano il proprio spazio di archiviazione.\n\nUtilizza un token di accesso con l'autorizzazione per estrarre le immagini.\nOgni nodo del cluster utilizza gli account salvati qui.",
"Credentials validated successfully": "Credenziali convalidate correttamente",
"Cross-host restore: guest IDs in backup overlap live IDs on target:": "Ripristino tra host: gli ID guest nel backup si sovrappongono agli ID presenti sulla destinazione:",
"Cross-kernel restore — kernel-tied paths merged, not copied": "Ripristino tra kernel diversi: percorsi legati al kernel uniti, non copiati",
@@ -1634,7 +1635,7 @@
"Default login": "Accesso predefinito",
"Default options": "Opzioni predefinite",
"Default options read/write": "Opzioni predefinite di lettura/scrittura",
"Default settings": "impostazioni predefinite",
"Default settings": "Impostazioni predefinite",
"Default will be used:": "Sarà usato il valore predefinito:",
"Default:": "Predefinito:",
"Default: only what the application needs": "Predefinita: solo ciò che serve all’applicazione",
@@ -1869,7 +1870,7 @@
"Doplarr_rs is a Discord bot for requesting media through *arr backends, written in Rust.": "Doplarr_rs è un bot Discord scritto in Rust per richiedere contenuti multimediali tramite i backend *arr.",
"Double Commander is a free cross platform open source file manager with two panels side by side. It is inspired by Total Commander and features some new ideas.": "Double Commander è un file manager gratuito, open source e multipiattaforma con due pannelli affiancati. Si ispira a Total Commander e introduce alcune nuove idee.",
"Download Spotify music with album art and metadata": "Scarica musica da Spotify con copertine album e metadati",
"Download an image to template storage": "scarica un'immagine nella memoria del modello",
"Download an image to template storage": "Scarica un'immagine nella memoria del modello",
"Download an oci-compose from an address": "Scarica un oci-compose da un indirizzo",
"Download failed for all attempted URLs": "Download non riuscito per tutti gli URL tentati",
"Download its Compose file from an address": "Scarica il file Compose da un indirizzo",
@@ -1885,7 +1886,7 @@
"Downloading Proxmology logo...": "Download del logo Proxmology...",
"Downloading UUP converter...": "Download del convertitore UUP...",
"Downloading amdgpu_top": "Download di amdgpu_top",
"Downloading and verifying the image.\nThis can take a few minutes. Please wait...": "download e verifica dell'immagine.\nL'operazione può richiedere alcuni minuti. Attendere prego...",
"Downloading and verifying the image.\nThis can take a few minutes. Please wait...": "Download e verifica dell'immagine.\nL'operazione può richiedere alcuni minuti. Attendere prego...",
"Downloading official installer...": "Download del programma di installazione ufficiale...",
"Downloading pre-existing encrypted backups from this host will fail unless you kept a copy of the current key.": "Il download di backup crittografati preesistenti da questo host fallirà a meno che tu non abbia conservato una copia della chiave corrente.",
"Downloading the image:": "Download dell'immagine:",
@@ -2019,11 +2020,11 @@
"Enter ZFS pool name for the selected disk:": "Inserisci il nome del pool ZFS per il disco selezionato:",
"Enter a name for the mount point (used as /mnt/<name>):": "Inserisci un nome per il punto di montaggio (usato come /mnt/<name>):",
"Enter a name for the new virtual machine:": "Inserisci un nome per la nuova VM:",
"Enter a non-empty password or access token on a single line.": "inserisci una password non vuota o un token di accesso su una singola riga.",
"Enter a non-empty password or access token on a single line.": "Inserisci una password non vuota o un token di accesso su una singola riga.",
"Enter a number, or write or paste a command:": "Inserisci un numero o scrivi o incolla un comando:",
"Enter a systemd calendar event, e.g.:": "Inserisci un evento di calendario systemd, ad esempio:",
"Enter a usable IPv4 address with its prefix, for example": "Inserisci un indirizzo IPv4 utilizzabile con il suo prefisso, per esempio",
"Enter a valid registry username.": "inserisci un nome utente di registro valido.",
"Enter a valid registry username.": "Inserisci un nome utente di registro valido.",
"Enter backup file (.zst):": "Inserisci file backup (.zst):",
"Enter backup path (.tar.zst):": "Inserisci percorso backup (.tar.zst):",
"Enter backup path (.vma.zst):": "Inserisci percorso backup (.vma.zst):",
@@ -2913,20 +2914,20 @@
"If your DHCP has a static reservation for the old MAC, update it.": "Se il tuo DHCP ha una prenotazione statica per il vecchio MAC, aggiornala.",
"Image": "Immagine",
"Image Source Directory": "Directory origine immagini",
"Image access confirmed.\n\n{reference}\n\nArchitecture: {architecture}\nVersion: {version}\nDownload size: {size}\nDigest: {digest}": "accesso alle immagini confermato.\n\n{reference}\n\nArchitettura: {architecture}\nVersione: {version}\nDimensioni del download: {size}\nDigestione: {digest}",
"Image access confirmed.\n\n{reference}\n\nArchitecture: {architecture}\nVersion: {version}\nDownload size: {size}\nDigest: {digest}": "Accesso alle immagini confermato.\n\n{reference}\n\nArchitettura: {architecture}\nVersione: {version}\nDimensioni del download: {size}\nDigestione: {digest}",
"Image cache": "Cache immagini",
"Image compatibility restored:": "Compatibilità dell'immagine ripristinata:",
"Image compatibility verified:": "Compatibilità dell'immagine verificata:",
"Image directory:": "Directory immagini:",
"Image download failed:": "Download dell'immagine non riuscito:",
"Image downloaded": "Immagine scaricata",
"Image downloaded and verified.\n\n{reference}\n\nStorage: {storage}\nArchive size: {size}\nArchive: {archive}\n\nNo container was created.\nProxMenux removes unused cached images after successful updates.": "immagine scaricata e verificata.\n\n{reference}\n\nConservazione: {storage}\nDimensione archivio: {size}\nArchivio: {archive}\n\nNon è stato creato alcun contenitore.\nProxMenux rimuove le immagini memorizzate nella cache inutilizzate dopo gli aggiornamenti riusciti.",
"Image downloaded and verified.\n\n{reference}\n\nStorage: {storage}\nArchive size: {size}\nArchive: {archive}\n\nNo container was created.\nProxMenux removes unused cached images after successful updates.": "Immagine scaricata e verificata.\n\n{reference}\n\nConservazione: {storage}\nDimensione archivio: {size}\nArchivio: {archive}\n\nNon è stato creato alcun contenitore.\nProxMenux rimuove le immagini memorizzate nella cache inutilizzate dopo gli aggiornamenti riusciti.",
"Image file not found:": "File immagine non trovato:",
"Image imported:": "Immagine importata:",
"Image integrity verification failed. The partial download was discarded; try again.": "verifica dell'integrità dell'immagine non riuscita. Il download parziale è stato scartato;riprova.",
"Image integrity verification failed. The partial download was discarded; try again.": "Verifica dell'integrità dell'immagine non riuscita. Il download parziale è stato scartato; riprova.",
"Image integrity verified": "Integrità dell’immagine verificata",
"Image not allowed for the host monitor profile": "Immagine non consentita per il profilo di monitoraggio dell'host",
"Image reference": "riferimento all'immagine",
"Image reference": "Riferimento all'immagine",
"Image reference (for example ghcr.io/user/application:latest)": "Riferimento immagine (ad esempio ghcr.io/user/application:latest)",
"Image selection was cancelled": "Selezione immagine annullata",
"Image that is not in the catalog": "Immagine non presente nel catalogo",
@@ -3054,7 +3055,7 @@
"Install Samba inside CT:": "Installa Samba nel CT:",
"Install ZFS auto-snapshot": "Installa ZFS auto-snapshot",
"Install a version from the branch the kernel names.": "Installa una versione del ramo indicato dal kernel.",
"Install an image as a native LXC": "installa un'immagine come LXC nativa",
"Install an image as a native LXC": "Installa un'immagine come LXC nativa",
"Install an image that is not in the catalog": "Installa un’immagine non presente nel catalogo",
"Install analysis tools": "Installa strumenti di analisi",
"Install and configure": "Installa e configura",
@@ -3268,7 +3269,7 @@
"Invalid host path:": "Percorso host non valido:",
"Invalid host-monitor firewall plan": "Piano firewall monitoraggio host non valido",
"Invalid image probe descriptor": "Descrittore verifica immagine non valido",
"Invalid image tag.": "tag immagine non valido.",
"Invalid image tag.": "Tag immagine non valido.",
"Invalid input": "Immissione non valida",
"Invalid internal volume": "Volume interno non valido",
"Invalid list:": "Elenco non valido:",
@@ -3326,7 +3327,7 @@
"Invalid suite application": "Applicazione suite non valida",
"Invalid sysctl value:": "Valore sysctl non valido:",
"Invalid template storage": "Storage dei template non valido",
"Invalid template storage name.": "nome di archiviazione del modello non valido.",
"Invalid template storage name.": "Nome di archiviazione del modello non valido.",
"Invalid tmpfs options:": "Opzioni tmpfs non valide:",
"Invalid tmpfs path:": "Percorso tmpfs non valido:",
"Invalid tmpfs size:": "Dimensione tmpfs non valida:",
@@ -3566,7 +3567,7 @@
"Log2RAM write scheduled every": "Scrittura Log2RAM programmata ogni",
"Log:": "Registro:",
"Logged-in users": "Utenti connessi",
"Login to {registry} timed out. Saved credentials were not changed.": "accesso a {registry} scaduto. Le credenziali salvate non sono state modificate.",
"Login to {registry} timed out. Saved credentials were not changed.": "Accesso a {registry} scaduto. Le credenziali salvate non sono state modificate.",
"Logout from {registry} timed out. Saved file credentials were not changed.": "Disconnessione da {registry} scaduta. Le credenziali del file salvato non sono state modificate.",
"Logrotate optimization completed": "Ottimizzazione Logrotate completata",
"Logrotate service restarted successfully": "Servizio Logrotate riavviato correttamente",
@@ -3630,8 +3631,8 @@
"Manage custom paths (add / remove your folders)": "Gestisci percorsi personalizzati (aggiungi/rimuovi le tue cartelle)",
"Manage installed OCI applications": "Gestisci le applicazioni OCI installate",
"Manage local backup target": "Gestisci la destinazione di backup locale",
"Manage private image registries.\nSaved credentials let ProxMenux access your private images.": "gestisci i registri di immagini private.\nLe credenziali salvate consentono a ProxMenux di accedere alle tue immagini private.",
"Manage registry accounts as root on the Proxmox node.": "gestisci gli account del registro come root sul nodo Proxmox.",
"Manage private image registries.\nSaved credentials let ProxMenux access your private images.": "Gestisci i registri di immagini private.\nLe credenziali salvate consentono a ProxMenux di accedere alle tue immagini private.",
"Manage registry accounts as root on the Proxmox node.": "Gestisci gli account del registro come root sul nodo Proxmox.",
"Managed disks must have backup enabled and a valid size": "I dischi gestiti devono avere il backup abilitato e una dimensione valida",
"Managing Nginx proxy hosts with a simple, powerful interface.": "Gestione degli host proxy Nginx tramite un'interfaccia semplice e potente.",
"Manual CLI Guide (Disk and Storage Manager)": "Guida CLI manuale (Gestione dischi e storage)",
@@ -4149,7 +4150,7 @@
"No accessible Samba servers found.": "Nessun server Samba accessibile trovato.",
"No accessible exports found.": "Nessuna esportazione accessibile trovata.",
"No accessible shares found.": "Nessuna condivisione accessibile trovata.",
"No active Proxmox storage accepts OCI template archives.": "nessuno spazio di archiviazione Proxmox attivo accetta archivi modello OCI.",
"No active Proxmox storage accepts OCI template archives.": "Nessuno spazio di archiviazione Proxmox attivo accetta archivi modello OCI.",
"No active exports or showmount not available": "Nessuna esportazione attiva o showmount non disponibile",
"No active session": "Nessuna sessione attiva",
"No active subscription and no usable PVE repository. Noninteractive mode cannot change APT sources; configure them in Node > Updates > Repositories.": "Nessun abbonamento attivo e nessun repository PVE utilizzabile. La modalità non interattiva non può modificare le origini APT; configurarle in Nodo > Aggiornamenti > Repository.",
@@ -4269,7 +4270,7 @@
"No recent": "Nessun server recente di tipo",
"No recent Samba servers found.": "Nessun server Samba recente trovato.",
"No registered OCI containers are available for selection on this host.": "Nessun container OCI registrato disponibile per la selezione su questo host.",
"No registry API was found at {registry}. Check the hostname and port.": "nessuna API di registro trovata in {registry}.Controlla il nome host e la porta.",
"No registry API was found at {registry}. Check the hostname and port.": "Nessuna API di registro trovata in {registry}. Controlla il nome host e la porta.",
"No restored OCI application is waiting to be recovered.": "Nessuna applicazione OCI ripristinata è in attesa di recupero.",
"No results": "Nessun risultato",
"No routing information found.": "Nessuna informazione di routing trovata.",
@@ -4336,7 +4337,7 @@
"Not currently mounted — skipping umount.": "Attualmente non montato: umount saltato.",
"Not declared": "Non dichiarato",
"Not enough free space for the backup": "Spazio libero insufficiente per il backup",
"Not enough free space on {storage}. Free some space or select another storage.": "Spazio libero insufficiente su {storage}.Libera spazio o seleziona un altro spazio di archiviazione.",
"Not enough free space on {storage}. Free some space or select another storage.": "Spazio libero insufficiente su {storage}. Libera spazio o seleziona un altro spazio di archiviazione.",
"Not found": "Non trovato",
"Not found in the OCI archive:": "Non trovato nell'archivio OCI:",
"Not imported:": "Non importato:",
@@ -4427,7 +4428,7 @@
"Only Intel/AMD DRM, Coral and USB nodes can be adopted automatically": "Solo i nodi DRM Intel/AMD, Coral e USB possono essere acquisiti automaticamente",
"Only Intel/AMD DRM, Coral, NPU and USB nodes can be adopted automatically": "Solo i nodi Intel/AMD DRM, Coral, NPU e USB possono essere adottati automaticamente",
"Only a Docker Swarm uses these settings, so they are not applied:": "Queste impostazioni si usano solo in Docker Swarm, quindi non vengono applicate:",
"Only a full sha256 image digest is supported.": "Messaggio tecnico per Proxmox e IT.Traduzione: è supportato solo un digest di immagini sha256 completo.",
"Only a full sha256 image digest is supported.": "Messaggio tecnico per Proxmox e IT. Traduzione: è supportato solo un digest di immagini sha256 completo.",
"Only an installed standalone OCI instance can adopt external changes": "Solo un’istanza OCI autonoma installata può acquisire modifiche esterne",
"Only backed-up Proxmox volumes can be adopted": "L'adozione dei volumi Proxmox richiede l'opzione backup=1",
"Only convert to privileged if absolutely necessary for your use case.": "Converti in privilegiato solo se assolutamente necessario per il tuo caso d'uso.",
@@ -4581,7 +4582,7 @@
"Passthrough may still work without a ROM file.": "Il passthrough potrebbe funzionare anche senza un file ROM.",
"Passthrough may work, but startup/restart reliability is not guaranteed.": "Il passthrough potrebbe funzionare, ma l'affidabilità di avvio/riavvio non è garantita.",
"Password": "Password",
"Password / access token (image pull permission)": "password/token di accesso (autorizzazione al pull dell'immagine)",
"Password / access token (image pull permission)": "Password/token di accesso (autorizzazione al pull dell'immagine)",
"Password Mismatch": "Password non corrispondenti",
"Password cannot be empty.": "La password non può essere vuota.",
"Password confirmation cannot be empty.": "La conferma della password non può essere vuota.",
@@ -4970,7 +4971,7 @@
"Reading SMART data...": "Lettura dei dati SMART...",
"Reading SMART self-test log...": "Lettura del registro dell'autotest SMART...",
"Reading full SMART report...": "Lettura del rapporto SMART completo...",
"Reading image metadata. Please wait...": "lettura dei metadati dell'immagine. Attendere prego...",
"Reading image metadata. Please wait...": "Lettura dei metadati dell'immagine. Attendere prego...",
"Real-time Performance Monitoring": "Monitoraggio prestazioni in tempo reale",
"Real-time bandwidth usage (press q to exit)": "Utilizzo banda in tempo reale (premi q per uscire)",
"Real-time collaborative document editor": "Editor collaborativo di documenti in tempo reale",
@@ -5064,7 +5065,7 @@
"Registering disk as Proxmox storage...": "Registrazione disco come storage Proxmox...",
"Registering module with DKMS...": "Registrazione del modulo con DKMS...",
"Registry accounts": "Conti del Registro di sistema",
"Registry hostname": "nome host del registro",
"Registry hostname": "Nome host del registro",
"Registry: {registry}\nAccount: {account}\nAuthentication: {method}\n\nSaved credentials are verified when an image is accessed.": "Registro: {registry}\nConto: {account}\nAutenticazione: {method}\n\nLe credenziali salvate vengono verificate quando si accede a un'immagine.",
"Reinstall / update Coral drivers": "Reinstalla/aggiorna i driver Coral",
"Reinstall Fail2Ban": "Reinstalla Fail2Ban",
@@ -5137,10 +5138,10 @@
"Remove obsolete systemd-boot meta-package": "Rimuovi il metapacchetto systemd-boot obsoleto",
"Remove old repository files:": "Rimuovi i vecchi file del repository:",
"Remove passthrough device from VM": "Rimuovi dispositivo passthrough dalla VM",
"Remove saved credentials": "rimuovi le credenziali salvate",
"Remove saved credentials": "Rimuovi le credenziali salvate",
"Remove subscription banner": "Rimuovi il banner di abbonamento",
"Remove the application? Its container disks are deleted, and only a backup can bring them back.": "Rimuovere l’applicazione? I dischi dei suoi container vengono eliminati e solo un backup può ripristinarli.",
"Remove the saved credentials for {registry}?\nRunning apps will keep working.": "rimuovere le credenziali salvate per {registry}?\nLe app in esecuzione continueranno a funzionare.",
"Remove the saved credentials for {registry}?\nRunning apps will keep working.": "Rimuovere le credenziali salvate per {registry}?\nLe app in esecuzione continueranno a funzionare.",
"Remove the unprivileged flag from configuration:": "Rimuovi il flag unprivileged dalla configurazione:",
"Remove unused packages and their config": "Rimuovi i pacchetti non utilizzati e la loro configurazione",
"Remove: delete the application and its containers": "Rimuovi: elimina l'applicazione e i suoi container",
@@ -5462,7 +5463,7 @@
"Save and classify articles. Read them later. Freely.": "Salva e classifica gli articoli. Leggili più tardi. Liberamente.",
"Save the passphrase somewhere safe NOW, before continuing.": "Salva la passphrase in un posto sicuro ORA, prima di continuare.",
"Save this Borg target so you don't need to enter the details again?": "Salvare questa destinazione Borg per non dover reinserire i dettagli?",
"Saved credentials for {registry} were removed.\nOther Skopeo/Docker credential files are managed separately.": "le credenziali salvate per {registry} sono state rimosse.\nGli altri file di credenziali Skopeo/Docker vengono gestiti separatamente.",
"Saved credentials for {registry} were removed.\nOther Skopeo/Docker credential files are managed separately.": "Le credenziali salvate per {registry} sono state rimosse.\nGli altri file di credenziali Skopeo/Docker vengono gestiti separatamente.",
"Saved record removed": "Registrazione salvata rimossa",
"Saving changes...": "Salvataggio delle modifiche...",
"Saving the new configuration": "Salvataggio della nuova configurazione",
@@ -5843,11 +5844,11 @@
"Shutdown timeout": "Timeout di spegnimento",
"SiYuan access code": "Codice di accesso SiYuan",
"SickGear provides management of TV shows and/or Anime, it detects new episodes, links downloader apps, and more..": "SickGear gestisce serie TV e/o anime, rileva nuovi episodi, si collega alle applicazioni di download e altro ancora.",
"Sign in to a registry": "accedi a un registro",
"Sign in to a registry": "Accedi a un registro",
"Sign in to the panel and create a Samba user in Settings before publishing a directory over SMB.": "Accedi al pannello e crea un utente Samba in Impostazioni prima di pubblicare una directory su SMB.",
"Signal is a messaging app with privacy at its core. It is free and easy to use, with strong end-to-end encryption that keeps your communication completely private.": "Signal è un'app di messaggistica che mette la privacy al centro. È gratuita e facile da usare, con una robusta crittografia end-to-end che protegge la riservatezza delle comunicazioni.",
"Signatures removed. Partition table preserved.": "Firme rimosse. Tabella delle partizioni conservata.",
"Signed in to {registry} as {username}.\n\nCredentials are saved for ProxMenux.\nSelect the account to check, download or install an image.": "accesso a {registry} come {username}.\n\nLe credenziali vengono salvate per ProxMenux.\nSeleziona l'account per controllare, scaricare o installare un'immagine.",
"Signed in to {registry} as {username}.\n\nCredentials are saved for ProxMenux.\nSelect the account to check, download or install an image.": "Accesso a {registry} come {username}.\n\nLe credenziali vengono salvate per ProxMenux.\nSeleziona l'account per controllare, scaricare o installare un'immagine.",
"Simple and easy to use DDNS": "DDNS semplice e facile da usare",
"Single GPU Warning": "Avviso GPU singola",
"Single target found — selected automatically:": "Unica destinazione trovata - selezionata automaticamente:",
@@ -5874,7 +5875,7 @@
"Skipping installation.": "Installazione saltata.",
"Skipping manual patches — feranick fork already supports this kernel.": "Patch manuali saltate: il fork feranick supporta già questo kernel.",
"Skopeo is not available. Restore the ProxMenux OCI dependencies and try again.": "Scopeo non è disponibile. Ripristinare le dipendenze ProxMenux OCI e riprovare.",
"Skopeo returned an invalid credential file; saved credentials were not changed.": "Skopeo ha restituito un file di credenziali non valido;le credenziali salvate non sono state modificate.",
"Skopeo returned an invalid credential file; saved credentials were not changed.": "Skopeo ha restituito un file di credenziali non valido; le credenziali salvate non sono state modificate.",
"Sleek podcast downloader with GPodder sync": "Downloader podcast intuitivo con sincronizzazione GPodder",
"Smart restore plan — hardware compatibility check": "Piano di ripristino intelligente: verifica compatibilità hardware",
"Smokeping keeps track of your network latency. For a full example of what this application is capable of visit UCDavis.": "Smokeping monitora la latenza della rete. Per un esempio completo delle sue funzionalità, visita UCDavis.",
@@ -6132,7 +6133,7 @@
"TCP optimizations configuration completed": "Configurazione ottimizzazioni TCP completata",
"TCP optimizations reverted (defaults restored on next reboot)": "Ottimizzazioni TCP rimosse (valori predefiniti ripristinati al prossimo riavvio)",
"TCP port 5201 is reachable (firewall on server)": "La porta TCP 5201 è raggiungibile (firewall sul server)",
"TLS verification failed for {registry}. Install the registry CA in /etc/containers/certs.d/{registry}/ca.crt.": "verifica TLS non riuscita per {registry}.Installare la CA del registro in /etc/containers/certs.d/{registry}/ca.crt.",
"TLS verification failed for {registry}. Install the registry CA in /etc/containers/certs.d/{registry}/ca.crt.": "Verifica TLS non riuscita per {registry}. Installare la CA del registro in /etc/containers/certs.d/{registry}/ca.crt.",
"TPM device added to VM": "Dispositivo TPM aggiunto alla VM",
"TPM storage selection failed or was cancelled. VM creation aborted.": "Selezione storage TPM non riuscita o annullata. Creazione VM interrotta.",
"TROUBLESHOOTING:": "RISOLUZIONE DEI PROBLEMI:",
@@ -6326,7 +6327,7 @@
"The configuration must run as root on Proxmox VE": "La configurazione deve essere eseguita come root su Proxmox VE",
"The configuration of a new member changed after it was created": "La configurazione di un nuovo componente è cambiata dopo la creazione",
"The configuration stopped because of an unexpected error": "La configurazione si è interrotta per un errore imprevisto",
"The configured credential helper could not be used. Check its installation and credential store.": "non è stato possibile utilizzare l'assistente credenziali configurato. Controlla la sua installazione e l'archivio credenziali.",
"The configured credential helper could not be used. Check its installation and credential store.": "Non è stato possibile utilizzare l'assistente credenziali configurato. Controlla la sua installazione e l'archivio credenziali.",
"The console of the container could not be configured": "Impossibile configurare la console del container",
"The consume/export volumes need at least 1 GB": "I volumi consume/export richiedono almeno 1 GB",
"The container could not be removed automatically:": "Impossibile rimuovere automaticamente il container:",
@@ -6365,7 +6366,7 @@
"The containers do not need them any more; an update downloads the new versions when there are any.": "I container non ne hanno più bisogno; un aggiornamento scarica le nuove versioni, se disponibili.",
"The containers were created from downloaded OCI images": "I container sono stati creati da immagini OCI scaricate",
"The coordinated backup was modified": "Il backup coordinato è stato modificato",
"The credential file changed during this operation. Try again; it was not overwritten.": "il file delle credenziali è stato modificato durante questa operazione. Riprova;non è stato sovrascritto.",
"The credential file changed during this operation. Try again; it was not overwritten.": "Il file delle credenziali è stato modificato durante questa operazione. Riprova;non è stato sovrascritto.",
"The current driver will be completely uninstalled before installing the new version. Continue?": "Il driver corrente verrà completamente disinstallato prima di installare la nuova versione. Continuare?",
"The current image of the saved channel will be checked and downloaded. Resources, paths and GPU are kept. The CT is stopped during the replacement and a native backup is created first.": "L'immagine corrente del canale salvato verrà controllata e scaricata. Risorse, percorsi e GPU sono tenuti. La CT viene fermata durante la sostituzione e viene creato un backup nativo prima.",
"The current record is missing for": "Manca il record attuale per",
@@ -6448,9 +6449,9 @@
"The host-monitor firewall subnet changed; no firewall rule was added": "La sottorete del firewall per il monitoraggio dell’host è cambiata; non è stata aggiunta alcuna regola",
"The host-monitor web interface uses the host network.": "L’interfaccia web del monitor usa la rete dell’host.",
"The identity of a member was replaced": "L'identità di un membro è stata sostituita",
"The image cache path is unsafe. Check the template storage before trying again.": "il percorso della cache delle immagini non è sicuro. Controlla la memorizzazione del modello prima di riprovare.",
"The image cache path is unsafe. Check the template storage before trying again.": "Il percorso della cache delle immagini non è sicuro. Controlla la memorizzazione del modello prima di riprovare.",
"The image changes the user expected by the adapter": "L'immagine modifica l'utente previsto dall'adattatore",
"The image could not be downloaded or verified. Check registry and storage access, then try again.": "non è stato possibile scaricare o verificare l'immagine. Controlla l'accesso al registro e allo spazio di archiviazione, quindi riprova.",
"The image could not be downloaded or verified. Check registry and storage access, then try again.": "Non è stato possibile scaricare o verificare l'immagine. Controlla l'accesso al registro e allo spazio di archiviazione, quindi riprova.",
"The image could not be read from its registry:": "Impossibile leggere l’immagine dal relativo registry:",
"The image declares data paths that are still stored in the rootfs": "L’immagine dichiara percorsi dei dati che sono ancora archiviati nel rootfs",
"The image did not grant the application user access to the devices; check its native init. Host permissions were not relaxed.": "L’immagine non ha consentito all’utente dell’applicazione di accedere ai dispositivi; verificare l’inizializzazione nativa. I permessi sull’host non sono stati allentati.",
@@ -6463,8 +6464,8 @@
"The image is in its registry, for one architecture.": "L’immagine è presente nel relativo registry per una sola architettura.",
"The image is in its registry.": "L’immagine è presente nel relativo registry.",
"The image is in its registry:": "L’immagine è presente nel relativo registry:",
"The image manifest failed integrity verification. Try again or contact the image publisher.": "il manifest dell'immagine non ha superato la verifica dell'integrità. Riprova o contatta l'editore dell'immagine.",
"The image or tag was not found on {registry}, or this account cannot access it. Check the reference.": "l'immagine o il tag non è stato trovato su {registry} oppure questo account non può accedervi. Controllare il riferimento.",
"The image manifest failed integrity verification. Try again or contact the image publisher.": "Il manifest dell'immagine non ha superato la verifica dell'integrità. Riprova o contatta l'editore dell'immagine.",
"The image or tag was not found on {registry}, or this account cannot access it. Check the reference.": "L'immagine o il tag non è stato trovato su {registry} oppure questo account non può accedervi. Controllare il riferimento.",
"The image requests NVIDIA, but the host has no working NVIDIA driver": "L'immagine richiede NVIDIA, ma l'host non ha un driver NVIDIA funzionante",
"The image requests disabling part of the AppArmor or seccomp confinement. Continue only if you trust the image and accept this risk.": "L’immagine richiede di disabilitare parte dell’isolamento AppArmor o seccomp. Continuare solo se si ritiene affidabile l’immagine e si accetta il rischio.",
"The image requests disabling part of the AppArmor or seccomp confinement. The Compose offers an optional AppArmor or seccomp relaxation; it will stay disabled unless the user selects it. Continue only if you trust the image and accept this risk.": "L’immagine richiede di disabilitare parte dell’isolamento AppArmor o seccomp. Compose consente di allentare queste restrizioni; l’opzione resta disattivata salvo selezione dell’utente. Continuare solo se si ritiene affidabile l’immagine e si accetta il rischio.",
@@ -6602,15 +6603,15 @@
"The record or diagnosis could not be completed; no update was run.": "Non è stato possibile completare la registrazione o la diagnosi; non è stato eseguito alcun aggiornamento.",
"The recovery did not complete. Review the log and choose \"Recover\" again for this container in the OCI management menu.": "Il recupero non è completo. Rivedere il registro e scegliere \"Recuperare\" di nuovo per questo contenitore nel menu di gestione OCI.",
"The recovery did not complete. Review the log and choose \"{choice}\" again for this container in the OCI management menu.": "Il ripristino non è stato completato. Controllare il log e scegliere di nuovo \"{choice}\" per questo container nel menu di gestione OCI.",
"The registry authentication file is invalid; it was not changed.": "il file di autenticazione del registro non è valido;non è stato cambiato.",
"The registry authentication file must be owned by root with mode 600.": "il file di autenticazione del registro deve essere di proprietà di root con modalità 600.",
"The registry authentication file must have an absolute path.": "il file di autenticazione del registro deve avere un percorso assoluto.",
"The registry authentication path cannot contain symbolic links.": "il percorso di autenticazione del registro non può contenere collegamenti simbolici.",
"The registry authentication path has an unsafe parent directory.": "il percorso di autenticazione del registro ha una directory principale non sicura.",
"The registry credential directory must be owned by root with mode 700.": "la directory delle credenziali del registro deve essere di proprietà di root con modalità 700.",
"The registry authentication file is invalid; it was not changed.": "Il file di autenticazione del registro non è valido;non è stato cambiato.",
"The registry authentication file must be owned by root with mode 600.": "Il file di autenticazione del registro deve essere di proprietà di root con modalità 600.",
"The registry authentication file must have an absolute path.": "Il file di autenticazione del registro deve avere un percorso assoluto.",
"The registry authentication path cannot contain symbolic links.": "Il percorso di autenticazione del registro non può contenere collegamenti simbolici.",
"The registry authentication path has an unsafe parent directory.": "Il percorso di autenticazione del registro ha una directory principale non sicura.",
"The registry credential directory must be owned by root with mode 700.": "La directory delle credenziali del registro deve essere di proprietà di root con modalità 700.",
"The registry did not return the saved image digest": "Il registry non ha restituito il digest salvato dell’immagine",
"The registry returned incomplete or unsupported image metadata.": "il registro ha restituito metadati dell'immagine incompleti o non supportati.",
"The registry returned invalid or unsupported image metadata.": "il registro ha restituito metadati dell'immagine non validi o non supportati.",
"The registry returned incomplete or unsupported image metadata.": "Il registro ha restituito metadati dell'immagine incompleti o non supportati.",
"The registry returned invalid or unsupported image metadata.": "Il registro ha restituito metadati dell'immagine non validi o non supportati.",
"The remote does not exist; create and authorize it first in the WebUI:": "Il remote non esiste; crearlo e autorizzarlo prima nella WebUI:",
"The remote installer must run as root on Proxmox VE": "L'installer remoto deve essere eseguito come root su Proxmox VE",
"The remote must already be created and authorized in the Rclone web UI. This operation restarts the CT and publishes two FUSE views on the host.": "Il remote deve essere già creato e autorizzato nell’interfaccia web Rclone. Questa operazione riavvia il CT e pubblica due viste FUSE sull’host.",
@@ -6769,7 +6770,7 @@
"This GPU is considered incompatible with GPU passthrough to a VM in ProxMenux.": "Questa GPU è considerata incompatibile con il passthrough GPU a una VM in ProxMenux.",
"This NFS share is fully restricted — even the host root cannot write to it.": "Questa condivisione NFS è completamente limitata: nemmeno l'utente root dell'host può scrivervi.",
"This VM requires extra installation steps, see install guide at:\nhttps://github.com/community-scripts/ProxmoxVE/discussions/144": "Questa VM richiede ulteriori passaggi di installazione; vedere la guida:\nhttps://github.com/community-scripts/ProxmoxVE/discussions/144",
"This account is for {registry}. Enter an image from that registry.": "questo account è per {registry}.Inserisci un'immagine da quel registro.",
"This account is for {registry}. Enter an image from that registry.": "Questo account è per {registry}. Inserisci un'immagine da quel registro.",
"This action will:": "Questa azione:",
"This application cannot be recovered yet:": "Questa applicazione non può ancora essere recuperata:",
"This application cannot be recovered yet; nothing was changed:": "Questa applicazione non può ancora essere recuperata; non è cambiato nulla:",
@@ -6801,10 +6802,10 @@
"This explicitly marks the container as privileged": "Ciò contrassegna esplicitamente il container come privilegiato",
"This file decides what is mounted and with which privileges. Install it only if it comes from a source you trust.": "Questo file decide cosa viene montato e con quali privilegi. Installarlo solo se proviene da una fonte attendibile.",
"This guarantees that device nodes are available before applying LXC GPU config.": "Garantisce la disponibilità dei nodi dispositivo prima di applicare la configurazione GPU LXC.",
"This host architecture is not supported by the OCI image importer.": "questa architettura host non è supportata dall'importatore di immagini OCI.",
"This host architecture is not supported by the OCI image importer.": "Questa architettura host non è supportata dall'importatore di immagini OCI.",
"This host has no active subscription, switch to the no-subscription repository? The inaccessible Enterprise PVE source will be disabled. Enterprise Ceph sources, if present, will be disabled without choosing a replacement Ceph channel; configure Ceph separately if needed.": "Questo host non ha un abbonamento attivo, passare al repository senza abbonamento? L'origine PVE Enterprise, non accessibile, verrà disabilitata. Le origini Ceph Enterprise, se presenti, verranno disabilitate senza scegliere un canale Ceph sostitutivo; configurare Ceph separatamente se necessario.",
"This image cannot be installed as it is described:": "L’immagine non può essere installata secondo la descrizione fornita:",
"This image has no compatible Linux image for this host ({architecture}).": "questa immagine non ha un'immagine Linux compatibile per questo host ({architecture}).",
"This image has no compatible Linux image for this host ({architecture}).": "Questa immagine non ha un'immagine Linux compatibile per questo host ({architecture}).",
"This image requires the host module": "Questa immagine richiede il modulo dell’host",
"This import rejects these paths without checking whether they are files or directories.": "Questa importazione rifiuta questi percorsi senza verificare se sono file o directory.",
"This installation will:": "Questa installazione:",
@@ -6920,7 +6921,7 @@
"To use the GPU again in LXC, run Add GPU to LXC from GPUs and Coral-TPU Menu": "Per riutilizzare la GPU in LXC, eseguire Aggiungi GPU a LXC dal Menu GPU e Coral-TPU",
"To use the VM without issues, the host must be restarted before starting it.": "Per utilizzare la VM senza problemi, è necessario riavviare l'host prima di avviarla.",
"To use this share from an LXC, bind-mount it via:": "Per usare questa condivisione da un LXC, eseguire il bind-mount tramite:",
"Token": "gettone",
"Token": "Gettone",
"Tool exit code:": "Codice di uscita strumento:",
"Tool output:": "Output strumento:",
"Tools": "Strumenti",
@@ -7065,7 +7066,7 @@
"Unsafe private configuration path": "Percorso configurazione privata non sicuro",
"Unsafe qBittorrent configuration path": "Percorso configurazione qBittorrent non sicuro",
"Unsafe record": "Record non sicuro",
"Unsafe registry credential lock.": "blocco delle credenziali del registro non sicuro.",
"Unsafe registry credential lock.": "Blocco delle credenziali del registro non sicuro.",
"Unsafe registry directory": "Directory registro non sicura",
"Unsafe registry lock": "Lock registro non sicuro",
"Unsafe rootfs for the capture": "Rootfs non sicura per l'acquisizione",
@@ -7130,7 +7131,7 @@
"Update cancelled by user": "Aggiornamento annullato dall'utente",
"Update completed. Data kept.": "Aggiornamento completato. Dati conservati.",
"Update completed. Press Enter to continue...": "Aggiornamento completato. Premere Invio per continuare...",
"Update credentials": "aggiorna le credenziali",
"Update credentials": "Aggiorna le credenziali",
"Update every container of the application": "Aggiorna tutti i container dell’applicazione",
"Update kernel to compatible version": "Aggiorna il kernel alla versione compatibile",
"Update now?": "Aggiornare ora?",
@@ -7197,10 +7198,10 @@
"Use a custom path": "Usa percorso personalizzato",
"Use a privileged LXC for NFS server/client workflows.": "Usare un LXC privilegiato per le operazioni server/client NFS.",
"Use a privileged LXC for Samba client/server workflows.": "Usare un LXC privilegiato per le operazioni client/server Samba.",
"Use a registry hostname, for example ghcr.io or registry.example.com:5000.": "utilizza un nome host del registro, ad esempio ghcr.io o registry.example.com:5000.",
"Use a registry hostname, for example ghcr.io or registry.example.com:5000.": "Utilizza un nome host del registro, ad esempio ghcr.io o registry.example.com:5000.",
"Use an existing SSH private key file on this host": "Usa un file di chiave privata SSH esistente su questo host",
"Use an existing keyfile": "Usa file di chiavi esistente",
"Use an image reference, for example ghcr.io/owner/app:latest.": "utilizza un riferimento a un'immagine, ad esempio ghcr.io/owner/app:latest.",
"Use an image reference, for example ghcr.io/owner/app:latest.": "Utilizza un riferimento a un'immagine, ad esempio ghcr.io/owner/app:latest.",
"Use as-is — keep data and filesystem": "Usa così com’è — conserva dati e file system",
"Use content types according to your use case.": "Usare i tipi di contenuto adatti al caso d’uso.",
"Use default": "Usa impostazione predefinita",
@@ -7240,7 +7241,7 @@
"User-friendly WebUI for LLMs (Formerly Ollama WebUI)": "Interfaccia web intuitiva per LLM (in precedenza Ollama WebUI)",
"Username": "Nome utente",
"Username (e.g. root@pam or user@pbs!token):": "Nome utente (ad esempio root@pam o user@pbs!token):",
"Username / token": "nome utente/token",
"Username / token": "Nome utente/token",
"Username and password": "Nome utente e password",
"Username and password will be cleared.": "Nome utente e password verranno cancellati.",
"Username cannot be empty.": "Il nome utente non può essere vuoto.",
@@ -7340,7 +7341,7 @@
"Verifying Ceph packages availability...": "Verifica disponibilità pacchetti Ceph...",
"Verifying all utilities status": "Verifica stato di tutte le utilità",
"Verifying disk accessibility in CT": "Verifica accessibilità disco nel CT",
"Verifying registry access. Please wait...": "verifica dell'accesso al registro. Attendere prego...",
"Verifying registry access. Please wait...": "Verifica dell'accesso al registro. Attendere prego...",
"Verifying the backups...": "Verifica backup...",
"Verifying the image integrity...": "Verifica integrità immagine...",
"Version": "Versione",
@@ -7640,7 +7641,7 @@
"assembling": "assemblaggio",
"automatically. Install it manually inside the container.": "automaticamente. Installalo manualmente all'interno del container.",
"automatically. Reboot LXC to fully release.": "automaticamente. Riavviare LXC per il rilascio completo.",
"available": "disponibile",
"available": "Disponibile",
"available for LXC bind-mounts via 'LXC Mount Manager'": "disponibile per bind mount LXC tramite Gestore montaggi LXC",
"available in this same GPU and TPU menu.": "disponibile nello stesso menu GPU e TPU.",
"backup at /etc/fstab.proxmenux.bak": "backup su /etc/fstab.proxmenux.bak",
@@ -7993,7 +7994,7 @@
"runs in": "usa",
"safe paths now (configs, packages, /etc, /root, ...)": "percorsi sicuri ora (configurazioni, pacchetti, /etc, /root, ...)",
"same MAC": "stesso MAC",
"saved": "salvato",
"saved": "Salvato",
"seconds (default)": "secondi (predefinito)",
"see log:": "vedi registro:",
"selected by default": "selezionata per impostazione predefinita",
@@ -8112,13 +8113,14 @@
"zfs-auto-snapshot removed (existing snapshots preserved on the pool)": "zfs-auto-snapshot rimosso (snapshot esistenti conservati nel pool)",
"zpool command not found. Install zfsutils-linux and retry.": "Comando zpool non trovato. Installare zfsutils-linux e riprovare.",
"zpool not found. Install zfsutils-linux and retry.": "zpool non trovato. Installare zfsutils-linux e riprovare.",
"{count} saved account.": "account salvato {count}.",
"{count} saved accounts.": "account salvati {count}.",
"{count} saved account.": "Account salvato {count}.",
"{count} saved accounts.": "Account salvati {count}.",
"{path} already exists and belongs to another user of the host, so {app} cannot write to it.\n\nProxMenux can add access rules (ACL) to this directory, to everything inside it and to what is created there later, for the users and groups {app} runs as on the host (IDs {ids}). The owner of the files does not change and whatever reads or writes them today keeps doing so; the owner of the directory also gets access to the files {app} creates.\n\nGrant {app} access to this directory?": "{path} esiste già e appartiene a un altro utente dell'host, quindi {app} non può scrivervi.\n\nProxMenux può aggiungere regole di accesso (ACL) a questa directory, a tutto ciò che contiene e a ciò che vi verrà creato in seguito, per gli utenti e i gruppi con cui {app} viene eseguito sull'host (ID {ids}). Il proprietario dei file non cambia e chi oggi li legge o li scrive continua a farlo; anche il proprietario della directory ottiene l'accesso ai file creati da {app}.\n\nConcedere a {app} l'accesso a questa directory?",
"{path} already exists and belongs to another user of the host, so {app} cannot write to it.\n\nProxMenux can add an access rule (ACL) for the identity {app} uses on the host (UID {uid}). Nothing that is there changes owner or permissions: whatever reads or writes those files today keeps doing so, and the owner of the directory also gets access to the files {app} creates.\n\nGrant {app} access to this directory?": "{path} esiste già e appartiene a un altro utente dell'host, quindi {app} non può scrivervi.\n\nProxMenux può aggiungere una regola di accesso (ACL) per l'identità utilizzata da {app} sull'host (UID {uid}).Niente di ciò che c'è cambia proprietario o autorizzazioni: qualunque cosa legga o scriva quei file oggi continua a farlo, e anche il proprietario della directory ottiene l'accesso ai file creati da {app}.\n\nConcedere a {app} l'accesso a questa directory?",
"{registry} answered with plain HTTP. Use a registry with HTTPS; TLS verification remains enabled.": "{registry} ha risposto con un semplice HTTP.Utilizzare un registro con HTTPS;La verifica TLS rimane abilitata.",
"{registry} answered with plain HTTP. Use a registry with HTTPS; TLS verification remains enabled.": "{registry} ha risposto con un semplice HTTP. Utilizzare un registro con HTTPS; La verifica TLS rimane abilitata.",
"{registry} did not respond within {timeout} seconds. Try again later.": "{registry} non ha risposto entro {timeout} secondi. Riprova più tardi.",
"{registry} is rate limiting requests. Wait a while and try again.": "{registry} è una richiesta di limitazione della velocità. Aspetta un po' e riprova.",
"{registry} refused access to this image:\n{reference}\n\nIf the image is private, sign in with an account that can pull it.\n\nSign in now?": "{registry} ha rifiutato l'accesso a questa immagine:\n{reference}\n\nSe l'immagine è privata, accedi con un account che possa recuperarla.\n\nAccedi adesso?",
"{registry} reported a server error. Try again later.": "{registry} ha segnalato un errore del server. Riprova più tardi.",
"{registry} returned invalid or unsupported image metadata.": "{registry} ha restituito metadati dell'immagine non validi o non supportati.",
"— Full/Custom restore will skip kernel-tied paths": "— il ripristino completo/personalizzato salterà i percorsi legati al kernel",
+37 -35
View File
@@ -192,7 +192,7 @@
"Access bridge for Tandoor": "Ponte de acesso para Tandoor",
"Access could not be granted completely; the application may be unable to write to:": "O acesso não pôde ser concedido completamente; o aplicativo pode não conseguir gravar em:",
"Access could not be granted; the application cannot write to:": "O acesso não pôde ser concedido; o aplicativo não pode gravar em:",
"Access denied by {registry}. Check the image name and sign in from Registry accounts.": "Acesso negado por {registry}.Verifique o nome da imagem e faça login nas contas do Registro.",
"Access denied by {registry}. Check the image name and sign in from Registry accounts.": "Acesso negado por {registry}. Verifique o nome da imagem e faça login nas contas do Registro.",
"Access granted to the application on:": "Acesso concedido ao aplicativo em:",
"Access password of the web interface (optional)": "Senha de acesso da interface web (opcional)",
"Access profile:": "Perfil de acesso:",
@@ -311,7 +311,7 @@
"Advanced": "Avançado",
"Advanced Diagnostics": "Diagnóstico Avançado",
"Advanced Network Diagnostics": "Diagnóstico avançado de rede",
"Advanced settings": "configurações avançadas",
"Advanced settings": "Configurações avançadas",
"Advanced: every setting of the container": "Avançado: cada configuração do recipiente",
"Affected LXC containers": "Contêineres LXC afetados",
"After completing GPU setup, start the VM manually when the host is ready.": "Depois de concluir a configuração da GPU, inicie a VM manualmente quando o host estiver pronto.",
@@ -506,7 +506,7 @@
"Authentication": "Autenticação",
"Authentication & Security": "Autenticação e segurança",
"Authentication Error": "Erro de autenticação",
"Authentication failed for {registry}. Check the account and token permissions.": "Falha na autenticação para {registry}.Verifique as permissões da conta e do token.",
"Authentication failed for {registry}. Check the account and token permissions.": "Falha na autenticação para {registry}. Verifique as permissões da conta e do token.",
"Authentication failed.": "Falha na autenticação.",
"Authentication required:": "Autenticação necessária:",
"Authentication:": "Autenticação:",
@@ -744,7 +744,7 @@
"Cannot resolve the container home directory:": "Não é possível resolver o diretório inicial do contêiner:",
"Cannot validate credentials - no shares available for testing.": "Não é possível validar credenciais – não há compartilhamentos disponíveis para teste.",
"Cannot verify the reused disk:": "Não foi possível verificar o disco reutilizado:",
"Cannot write the image archive to {storage}. Check storage access and mount status.": "Não é possível gravar o arquivo de imagem em {storage}.Verifique o acesso ao armazenamento e o status de montagem.",
"Cannot write the image archive to {storage}. Check storage access and mount status.": "Não é possível gravar o arquivo de imagem em {storage}. Verifique o acesso ao armazenamento e o status de montagem.",
"Capabilities cannot be kept and all dropped at the same time": "Capacidades não podem ser mantidas e todas retiradas ao mesmo tempo",
"Category": "Categoria",
"Caution: Maximum mode generates more heat.": "Cuidado: O modo máximo gera mais calor.",
@@ -805,7 +805,7 @@
"Check Samba Status": "Verifique o status do Samba",
"Check VM disk/PCI slots": "Verifique os slots de disco/PCI da VM",
"Check VM passthrough settings": "Verifique as configurações de passagem da VM",
"Check access to an image": "verifique o acesso a uma imagem",
"Check access to an image": "Verifique o acesso a uma imagem",
"Check connectivity with another host": "Verifique a conectividade com outro host",
"Check container mount points": "Verifique os pontos de montagem do contêiner",
"Check if container is unprivileged:": "Verifique se o contêiner não tem privilégios:",
@@ -1374,20 +1374,20 @@
"Could not publish pending restore. Previous pending restore was kept.": "não foi possível publicar a restauração pendente. A restauração pendente anterior foi mantida.",
"Could not push the key. Check the password and that": "Não foi possível pressionar a chave. Verifique a senha e isso",
"Could not query the image registry": "Não foi possível consultar o registro de imagem",
"Could not reach {registry}. Check its address, DNS and network access.": "Não foi possível acessar {registry}.Verifique seu endereço, DNS e acesso à rede.",
"Could not reach {registry}. Check its address, DNS and network access.": "Não foi possível acessar {registry}. Verifique seu endereço, DNS e acesso à rede.",
"Could not read SMART data from": "Não foi possível ler os dados SMART de",
"Could not read VM configuration.": "Não foi possível ler a configuração da VM.",
"Could not read the CUDA compute capability": "Não foi possível ler a capacidade de computação do CUDA",
"Could not read the NVIDIA driver version": "Não foi possível ler a versão do driver NVIDIA",
"Could not read the host firewall rules": "Não foi possível ler as regras do firewall do host",
"Could not read the image from {registry}. Check the reference and sign in from Registry accounts.": "Não foi possível ler a imagem do {registry}.Verifique a referência e faça login nas contas do Registro.",
"Could not read the image from {registry}. Check the reference and sign in from Registry accounts.": "Não foi possível ler a imagem do {registry}. Verifique a referência e faça login nas contas do Registro.",
"Could not read this job.": "Não foi possível ler este trabalho.",
"Could not release ZRAM pages; existing profile remains active": "Não foi possível liberar páginas ZRAM; o perfil existente permanece ativo",
"Could not remount automatically. Try manually or check credentials.": "Não foi possível remontar automaticamente. Tente manualmente ou verifique as credenciais.",
"Could not remove VM automatically. Run manually:": "Não foi possível remover a VM automaticamente. Execute manualmente:",
"Could not remove ZRAM profile; configuration was restored": "Não foi possível remover o perfil ZRAM; a configuração foi restaurada",
"Could not remove ZRAM profile; configuration was restored but swap could not be restarted": "Não foi possível remover o perfil ZRAM; a configuração foi restaurada, mas o swap não pôde ser reiniciado",
"Could not remove credentials for {registry}; saved file credentials were not changed.": "não foi possível remover as credenciais do {registry};as credenciais do arquivo salvo não foram alteradas.",
"Could not remove credentials for {registry}; saved file credentials were not changed.": "Não foi possível remover as credenciais do {registry}; as credenciais do arquivo salvo não foram alteradas.",
"Could not remove previous DKMS tree at": "Não foi possível remover a árvore DKMS anterior em",
"Could not reserve a private network for the stack": "Não foi possível reservar uma rede privada para a pilha",
"Could not resolve the Compose user:": "Não foi possível resolver o usuário Compose:",
@@ -1402,7 +1402,7 @@
"Could not set VM virtual display to vga: std": "Não foi possível definir a exibição virtual da VM como vga: std",
"Could not set boot order for": "Não foi possível definir a ordem de inicialização para",
"Could not set the container entrypoint": "Não foi possível definir o ponto de entrada do recipiente",
"Could not sign in to {registry}. Check registry access and token permissions.": "não foi possível fazer login no {registry}.Verifique o acesso ao registro e as permissões de token.",
"Could not sign in to {registry}. Check registry access and token permissions.": "Não foi possível fazer login no {registry}. Verifique o acesso ao registro e as permissões de token.",
"Could not stage pending restore path:": "Não foi possível preparar o caminho de restauração pendente:",
"Could not stage pending restore. Nothing new was scheduled.": "não foi possível preparar a restauração pendente. Nada de novo foi programado.",
"Could not stop LXC": "Não foi possível parar o LXC",
@@ -1489,14 +1489,15 @@
"Creating the private network...": "Criando a rede privada...",
"Creating the temporary data container": "Criando o recipiente de dados temporário",
"Creative & Design": "Criatividade e design",
"Credential helper": "auxiliar de credencial",
"Credential storage and access": "armazenamento e acesso de credenciais",
"Credential helper": "Auxiliar de credencial",
"Credential storage and access": "Armazenamento e acesso de credenciais",
"Credentials are correct": "As credenciais estão corretas",
"Credentials cleared. jwt_secret and API tokens preserved.": "Credenciais apagadas. jwt_secret e tokens de API preservados.",
"Credentials file created securely.": "Arquivo de credenciais criado com segurança.",
"Credentials file removed.": "Arquivo de credenciais removido.",
"Credentials file:": "Arquivo de credenciais:",
"Credentials file:\n{path}\n\nOwned by root; directory mode 700 and file mode 600.\nBasic credentials are base64 encoded, not encrypted.\nCredential helpers use their own storage.\n\nUse an access token with permission to pull images.\nConfigure credentials on each node that downloads images.": "arquivo de credenciais:\n{path}\n\nPropriedade do root;modo de diretório 700 e modo de arquivo 600.\nAs credenciais básicas são codificadas em base64, não criptografadas.\nOs auxiliares de credenciais usam seu próprio armazenamento.\n\nUse um token de acesso com permissão para extrair imagens.\nConfigure credenciais em cada nó que baixa imagens.",
"Credentials file:\n{path}\n\nOwned by root; directory mode 700 and file mode 600.\nBasic credentials are base64 encoded, not encrypted.\nCredential helpers use their own storage.\n\nUse an access token with permission to pull images.\nConfigure credentials on each node that downloads images.": "Arquivo de credenciais:\n{path}\n\nPropriedade do root; modo de diretório 700 e modo de arquivo 600.\nAs credenciais básicas são codificadas em base64, não criptografadas.\nOs auxiliares de credenciais usam seu próprio armazenamento.\n\nUse um token de acesso com permissão para extrair imagens.\nConfigure credenciais em cada nó que baixa imagens.",
"Credentials file:\n{path}\n\nOwned by root; directory mode 700 and file mode 600.\nBasic credentials are base64 encoded, not encrypted.\nCredential helpers use their own storage.\n\nUse an access token with permission to pull images.\nEvery node of the cluster uses the accounts saved here.": "Arquivo de credenciais:\n{path}\n\nPropriedade do root; modo de diretório 700 e modo de arquivo 600.\nAs credenciais básicas são codificadas em base64, não criptografadas.\nOs auxiliares de credenciais usam seu próprio armazenamento.\n\nUse um token de acesso com permissão para extrair imagens.\nCada nó do cluster usa as contas salvas aqui.",
"Credentials validated successfully": "Credenciais validadas com sucesso",
"Cross-host restore: guest IDs in backup overlap live IDs on target:": "Restauração entre hosts: os IDs de convidados no backup se sobrepõem aos Live IDs no destino:",
"Cross-kernel restore — kernel-tied paths merged, not copied": "Restauração entre kernels – caminhos vinculados ao kernel mesclados, não copiados",
@@ -1634,7 +1635,7 @@
"Default login": "Utilizador por omissão",
"Default options": "Opções padrão",
"Default options read/write": "Opções padrão leitura/gravação",
"Default settings": "configurações padrão",
"Default settings": "Configurações padrão",
"Default will be used:": "O padrão será usado:",
"Default:": "Padrão:",
"Default: only what the application needs": "Padrão: somente o que a aplicação precisa",
@@ -2923,7 +2924,7 @@
"Image downloaded and verified.\n\n{reference}\n\nStorage: {storage}\nArchive size: {size}\nArchive: {archive}\n\nNo container was created.\nProxMenux removes unused cached images after successful updates.": "Imagem baixada e verificada.\n\n{reference}\n\nArmazenamento: {storage}\nTamanho do arquivo: {size}\nArquivo: {archive}\n\nNenhum contêiner foi criado.\nProxMenux remove imagens em cache não utilizadas após atualizações bem-sucedidas.",
"Image file not found:": "Arquivo de imagem não encontrado:",
"Image imported:": "Imagem importada:",
"Image integrity verification failed. The partial download was discarded; try again.": "falha na verificação da integridade da imagem. O download parcial foi descartado;tente novamente.",
"Image integrity verification failed. The partial download was discarded; try again.": "Falha na verificação da integridade da imagem. O download parcial foi descartado; tente novamente.",
"Image integrity verified": "Integridade da imagem verificada",
"Image not allowed for the host monitor profile": "Imagem não permitida para o perfil do monitor da máquina",
"Image reference": "Referência de imagem",
@@ -3094,7 +3095,7 @@
"Installation finished but drivers are not loaded. A reboot may be required.": "A instalação foi concluída, mas os drivers não foram carregados. Uma reinicialização pode ser necessária.",
"Installation incomplete. These containers and their data are kept:": "Instalação incompleta. Estes contentores e os seus dados são conservados:",
"Installation log:": "Registro de instalação:",
"Installation settings": "configurações de instalação",
"Installation settings": "Configurações de instalação",
"Installation summary": "Resumo da instalação",
"Installed": "Instalado",
"Installed at:": "Instalado em:",
@@ -3268,7 +3269,7 @@
"Invalid host path:": "Caminho da máquina inválido:",
"Invalid host-monitor firewall plan": "Plano de firewall de monitor de host inválido",
"Invalid image probe descriptor": "descritor de sonda de imagem inválido",
"Invalid image tag.": "tag de imagem inválida.",
"Invalid image tag.": "Tag de imagem inválida.",
"Invalid input": "Entrada inválida",
"Invalid internal volume": "Volume interno inválido",
"Invalid list:": "Lista inválida:",
@@ -4269,7 +4270,7 @@
"No recent": "Nenhum recente",
"No recent Samba servers found.": "Nenhum servidor Samba recente encontrado.",
"No registered OCI containers are available for selection on this host.": "Nenhum contêiner OCI registrado está disponível para seleção neste host.",
"No registry API was found at {registry}. Check the hostname and port.": "Nenhuma API de registro foi encontrada em {registry}.Verifique o nome do host e a porta.",
"No registry API was found at {registry}. Check the hostname and port.": "Nenhuma API de registro foi encontrada em {registry}. Verifique o nome do host e a porta.",
"No restored OCI application is waiting to be recovered.": "Nenhum aplicativo OCI restaurado está aguardando para ser recuperado.",
"No results": "Nenhum resultado",
"No routing information found.": "Nenhuma informação de roteamento encontrada.",
@@ -4336,7 +4337,7 @@
"Not currently mounted — skipping umount.": "Atualmente não montado – ignorando umount.",
"Not declared": "Não declarado",
"Not enough free space for the backup": "Não há espaço livre suficiente para o backup",
"Not enough free space on {storage}. Free some space or select another storage.": "Não há espaço livre suficiente no {storage}.Libere espaço ou selecione outro armazenamento.",
"Not enough free space on {storage}. Free some space or select another storage.": "Não há espaço livre suficiente no {storage}. Libere espaço ou selecione outro armazenamento.",
"Not found": "Não encontrado",
"Not found in the OCI archive:": "Não encontrado no arquivo OCI:",
"Not imported:": "Não importado:",
@@ -4427,7 +4428,7 @@
"Only Intel/AMD DRM, Coral and USB nodes can be adopted automatically": "Somente nós Intel/AMD DRM, Coral e USB podem ser adotados automaticamente",
"Only Intel/AMD DRM, Coral, NPU and USB nodes can be adopted automatically": "Somente nós Intel/AMD DRM, Coral, NPU e USB podem ser adotados automaticamente",
"Only a Docker Swarm uses these settings, so they are not applied:": "Apenas um Swarm Docker usa estas configurações, então elas não são aplicadas:",
"Only a full sha256 image digest is supported.": "apenas um resumo completo da imagem sha256 é suportado.",
"Only a full sha256 image digest is supported.": "Apenas um resumo completo da imagem sha256 é suportado.",
"Only an installed standalone OCI instance can adopt external changes": "Somente uma instância OCI autônoma instalada pode adotar alterações externas",
"Only backed-up Proxmox volumes can be adopted": "Somente volumes Proxmox com backup podem ser adotados",
"Only convert to privileged if absolutely necessary for your use case.": "Converta para privilegiado apenas se for absolutamente necessário para o seu caso de uso.",
@@ -5063,8 +5064,8 @@
"Register mount path in Proxmox:": "Registre o caminho de montagem no Proxmox:",
"Registering disk as Proxmox storage...": "Registrando disco como armazenamento Proxmox...",
"Registering module with DKMS...": "Registrando módulo com DKMS...",
"Registry accounts": "contas de registro",
"Registry hostname": "nome de host do registro",
"Registry accounts": "Contas de registro",
"Registry hostname": "Nome de host do registro",
"Registry: {registry}\nAccount: {account}\nAuthentication: {method}\n\nSaved credentials are verified when an image is accessed.": "Registro: {registry}\nConta: {account}\nAutenticação: {method}\n\nAs credenciais salvas são verificadas quando uma imagem é acessada.",
"Reinstall / update Coral drivers": "Reinstale / atualize os drivers Coral",
"Reinstall Fail2Ban": "Reinstale o Fail2Ban",
@@ -5462,7 +5463,7 @@
"Save and classify articles. Read them later. Freely.": "Salvar e classificar artigos. Lê-os depois. Livremente.",
"Save the passphrase somewhere safe NOW, before continuing.": "Salve a senha em algum lugar seguro AGORA, antes de continuar.",
"Save this Borg target so you don't need to enter the details again?": "Salvar este alvo Borg para não precisar inserir os detalhes novamente?",
"Saved credentials for {registry} were removed.\nOther Skopeo/Docker credential files are managed separately.": "as credenciais salvas para {registry} foram removidas.\nOutros arquivos de credenciais Skopeo/Docker são gerenciados separadamente.",
"Saved credentials for {registry} were removed.\nOther Skopeo/Docker credential files are managed separately.": "As credenciais salvas para {registry} foram removidas.\nOutros arquivos de credenciais Skopeo/Docker são gerenciados separadamente.",
"Saved record removed": "Gravação salva removida",
"Saving changes...": "Salvando alterações...",
"Saving the new configuration": "Salvando a nova configuração",
@@ -5847,7 +5848,7 @@
"Sign in to the panel and create a Samba user in Settings before publishing a directory over SMB.": "Faça login no painel e crie um usuário Samba em Configurações antes de publicar um diretório no SMB.",
"Signal is a messaging app with privacy at its core. It is free and easy to use, with strong end-to-end encryption that keeps your communication completely private.": "Signal é um aplicativo de mensagens com privacidade em seu núcleo. É livre e fácil de usar, com criptografia de ponta a ponta forte que mantém sua comunicação completamente privada.",
"Signatures removed. Partition table preserved.": "Assinaturas removidas. Tabela de partição preservada.",
"Signed in to {registry} as {username}.\n\nCredentials are saved for ProxMenux.\nSelect the account to check, download or install an image.": "conectado ao {registry} como {username}.\n\nAs credenciais são salvas para ProxMenux.\nSelecione a conta para verificar, baixar ou instalar uma imagem.",
"Signed in to {registry} as {username}.\n\nCredentials are saved for ProxMenux.\nSelect the account to check, download or install an image.": "Conectado ao {registry} como {username}.\n\nAs credenciais são salvas para ProxMenux.\nSelecione a conta para verificar, baixar ou instalar uma imagem.",
"Simple and easy to use DDNS": "Simples e fácil de usar DDNS",
"Single GPU Warning": "Aviso de GPU única",
"Single target found — selected automatically:": "Único alvo encontrado — selecionado automaticamente:",
@@ -5874,7 +5875,7 @@
"Skipping installation.": "Ignorando a instalação.",
"Skipping manual patches — feranick fork already supports this kernel.": "Ignorando patches manuais – feranick fork já suporta este kernel.",
"Skopeo is not available. Restore the ProxMenux OCI dependencies and try again.": "Skopeo não está disponível. Restaure as dependências do ProxMenux OCI e tente novamente.",
"Skopeo returned an invalid credential file; saved credentials were not changed.": "Skopeo retornou um arquivo de credenciais inválido;as credenciais salvas não foram alteradas.",
"Skopeo returned an invalid credential file; saved credentials were not changed.": "Skopeo retornou um arquivo de credenciais inválido; as credenciais salvas não foram alteradas.",
"Sleek podcast downloader with GPodder sync": "Baixador de podcast elegante com sincronização GPodder",
"Smart restore plan — hardware compatibility check": "Plano de restauração inteligente – verificação de compatibilidade de hardware",
"Smokeping keeps track of your network latency. For a full example of what this application is capable of visit UCDavis.": "Smokeping acompanha a latência da sua rede. Para um exemplo completo do que esta aplicação é capaz de visitar UCDavis.",
@@ -6132,7 +6133,7 @@
"TCP optimizations configuration completed": "Configuração de otimizações TCP concluída",
"TCP optimizations reverted (defaults restored on next reboot)": "Otimizações de TCP revertidas (padrões restaurados na próxima reinicialização)",
"TCP port 5201 is reachable (firewall on server)": "A porta TCP 5201 está acessível (firewall no servidor)",
"TLS verification failed for {registry}. Install the registry CA in /etc/containers/certs.d/{registry}/ca.crt.": "falha na verificação de TLS para {registry}.Instale a CA do registro em /etc/containers/certs.d/{registry}/ca.crt.",
"TLS verification failed for {registry}. Install the registry CA in /etc/containers/certs.d/{registry}/ca.crt.": "Falha na verificação de TLS para {registry}. Instale a CA do registro em /etc/containers/certs.d/{registry}/ca.crt.",
"TPM device added to VM": "Dispositivo TPM adicionado à VM",
"TPM storage selection failed or was cancelled. VM creation aborted.": "A seleção de armazenamento TPM falhou ou foi cancelada. Criação de VM abortada.",
"TROUBLESHOOTING:": "SOLUÇÃO DE PROBLEMAS:",
@@ -6609,8 +6610,8 @@
"The registry authentication path has an unsafe parent directory.": "O caminho de autenticação do registro possui um diretório pai inseguro.",
"The registry credential directory must be owned by root with mode 700.": "O diretório de credenciais do registro deve pertencer ao root com modo 700.",
"The registry did not return the saved image digest": "O registro não retornou o digest de imagem salvo",
"The registry returned incomplete or unsupported image metadata.": "o registro retornou metadados de imagem incompletos ou não suportados.",
"The registry returned invalid or unsupported image metadata.": "o registro retornou metadados de imagem inválidos ou não suportados.",
"The registry returned incomplete or unsupported image metadata.": "O registro retornou metadados de imagem incompletos ou não suportados.",
"The registry returned invalid or unsupported image metadata.": "O registro retornou metadados de imagem inválidos ou não suportados.",
"The remote does not exist; create and authorize it first in the WebUI:": "O remoto não existe; crie e autorize-o primeiro na WebUI:",
"The remote installer must run as root on Proxmox VE": "O instalador remoto deve correr como root no Proxmox VE",
"The remote must already be created and authorized in the Rclone web UI. This operation restarts the CT and publishes two FUSE views on the host.": "O controle remoto já deve ser criado e autorizado na interface web Rclone. Esta operation reinicia o CT e publica duas visualizações FUSE no host.",
@@ -6769,7 +6770,7 @@
"This GPU is considered incompatible with GPU passthrough to a VM in ProxMenux.": "Esta GPU é considerada incompatível com a passagem de GPU para uma VM no ProxMenux.",
"This NFS share is fully restricted — even the host root cannot write to it.": "Este compartilhamento NFS é totalmente restrito — até mesmo o host root não pode gravar nele.",
"This VM requires extra installation steps, see install guide at:\nhttps://github.com/community-scripts/ProxmoxVE/discussions/144": "Esta VM requer etapas extras de instalação. Consulte o guia de instalação em:\nhttps://github.com/community-scripts/ProxmoxVE/discussions/144",
"This account is for {registry}. Enter an image from that registry.": "Esta conta é para {registry}.Insira uma imagem desse registro.",
"This account is for {registry}. Enter an image from that registry.": "Esta conta é para {registry}. Insira uma imagem desse registro.",
"This action will:": "Esta ação irá:",
"This application cannot be recovered yet:": "Este aplicativo ainda não pode ser recuperado:",
"This application cannot be recovered yet; nothing was changed:": "Este aplicativo ainda não pode ser recuperado; nada foi alterado:",
@@ -7065,7 +7066,7 @@
"Unsafe private configuration path": "Caminho de configuração privado inseguro",
"Unsafe qBittorrent configuration path": "Caminho de configuração não seguro do qBittorrent",
"Unsafe record": "Registo inseguro",
"Unsafe registry credential lock.": "bloqueio de credencial de registro inseguro.",
"Unsafe registry credential lock.": "Bloqueio de credencial de registro inseguro.",
"Unsafe registry directory": "Diretório de registro inseguro",
"Unsafe registry lock": "Bloqueio de registo inseguro",
"Unsafe rootfs for the capture": "Rootfs inseguros para a captura",
@@ -7640,7 +7641,7 @@
"assembling": "montagem",
"automatically. Install it manually inside the container.": "automaticamente. Instale-o manualmente dentro do contêiner.",
"automatically. Reboot LXC to fully release.": "automaticamente. Reinicie o LXC para liberar completamente.",
"available": "disponível",
"available": "Disponível",
"available for LXC bind-mounts via 'LXC Mount Manager'": "disponível para montagens vinculadas LXC via 'LXC Mount Manager'",
"available in this same GPU and TPU menu.": "disponível neste mesmo menu GPU e TPU.",
"backup at /etc/fstab.proxmenux.bak": "backup em /etc/fstab.proxmenux.bak",
@@ -7993,7 +7994,7 @@
"runs in": "corre para dentro",
"safe paths now (configs, packages, /etc, /root, ...)": "caminhos seguros agora (configs, pacotes, /etc, /root, ...)",
"same MAC": "mesmo MAC",
"saved": "salvo",
"saved": "Salvo",
"seconds (default)": "segundos (padrão)",
"see log:": "veja o log:",
"selected by default": "selecionado por padrão",
@@ -8112,13 +8113,14 @@
"zfs-auto-snapshot removed (existing snapshots preserved on the pool)": "zfs-auto-snapshot removido (instantâneos existentes preservados no pool)",
"zpool command not found. Install zfsutils-linux and retry.": "Comando zpool não encontrado. Instale zfsutils-linux e tente novamente.",
"zpool not found. Install zfsutils-linux and retry.": "zpool não encontrado. Instale zfsutils-linux e tente novamente.",
"{count} saved account.": "conta salva {count}.",
"{count} saved accounts.": "contas salvas {count}.",
"{count} saved account.": "Conta salva {count}.",
"{count} saved accounts.": "Contas salvas {count}.",
"{path} already exists and belongs to another user of the host, so {app} cannot write to it.\n\nProxMenux can add access rules (ACL) to this directory, to everything inside it and to what is created there later, for the users and groups {app} runs as on the host (IDs {ids}). The owner of the files does not change and whatever reads or writes them today keeps doing so; the owner of the directory also gets access to the files {app} creates.\n\nGrant {app} access to this directory?": "{path} já existe e pertence a outro usuário do host, portanto {app} não pode gravar nele.\n\nProxMenux pode adicionar regras de acesso (ACL) a este diretório, a tudo o que ele contém e ao que for criado nele depois, para os usuários e grupos com os quais {app} é executado no host (IDs {ids}). O proprietário dos arquivos não muda e o que hoje os lê ou grava continua fazendo isso; o proprietário do diretório também obtém acesso aos arquivos que {app} cria.\n\nConceder acesso ao {app} a este diretório?",
"{path} already exists and belongs to another user of the host, so {app} cannot write to it.\n\nProxMenux can add an access rule (ACL) for the identity {app} uses on the host (UID {uid}). Nothing that is there changes owner or permissions: whatever reads or writes those files today keeps doing so, and the owner of the directory also gets access to the files {app} creates.\n\nGrant {app} access to this directory?": "{path} já existe e pertence a outro usuário do host, portanto {app} não pode gravar nele.\n\nProxMenux pode adicionar uma regra de acesso (ACL) para a identidade que {app} usa no host (UID {uid}).Nada do que existe muda o proprietário ou as permissões: tudo o que lê ou grava esses arquivos hoje continua fazendo isso, e o proprietário do diretório também obtém acesso aos arquivos que {app} cria.\n\nConceder acesso ao {app} a este diretório?",
"{registry} answered with plain HTTP. Use a registry with HTTPS; TLS verification remains enabled.": "{registry} respondeu com HTTP simples. Utilize um registro com HTTPS;A verificação TLS permanece habilitada.",
"{registry} answered with plain HTTP. Use a registry with HTTPS; TLS verification remains enabled.": "{registry} respondeu com HTTP simples. Utilize um registro com HTTPS; A verificação TLS permanece habilitada.",
"{registry} did not respond within {timeout} seconds. Try again later.": "{registry} não respondeu em {timeout} segundos. Tente novamente mais tarde.",
"{registry} is rate limiting requests. Wait a while and try again.": "Mensagem técnica para Proxmox e TI.Traduzindo: {registry} é uma solicitação de limitação de taxa. Espere um pouco e tente novamente.",
"{registry} is rate limiting requests. Wait a while and try again.": "Mensagem técnica para Proxmox e TI. Traduzindo: {registry} é uma solicitação de limitação de taxa. Espere um pouco e tente novamente.",
"{registry} refused access to this image:\n{reference}\n\nIf the image is private, sign in with an account that can pull it.\n\nSign in now?": "{registry} recusou acesso a esta imagem:\n{reference}\n\nSe a imagem for privada, faça login com uma conta que possa obtê-la.\n\nEntrar agora?",
"{registry} reported a server error. Try again later.": "{registry} relatou um erro no servidor. Tente novamente mais tarde.",
"{registry} returned invalid or unsupported image metadata.": "{registry} retornou metadados de imagem inválidos ou não suportados.",
"— Full/Custom restore will skip kernel-tied paths": "- A restauração completa/personalizada irá ignorar os caminhos vinculados ao kernel",
+17 -15
View File
@@ -192,7 +192,7 @@
"Access bridge for Tandoor": "Prístupový mostík pre Tandoor",
"Access could not be granted completely; the application may be unable to write to:": "Prístup nebolo možné úplne udeliť; aplikácia možno nebude môcť zapisovať do:",
"Access could not be granted; the application cannot write to:": "Prístup nebolo možné udeliť; aplikácia nemôže písať na:",
"Access denied by {registry}. Check the image name and sign in from Registry accounts.": "Prístup odmietnutý {registry}.Skontrolujte názov obrázka a prihláste sa z účtov Registry.",
"Access denied by {registry}. Check the image name and sign in from Registry accounts.": "Prístup odmietnutý {registry}. Skontrolujte názov obrázka a prihláste sa z účtov Registry.",
"Access granted to the application on:": "Prístup udelený aplikácii dňa:",
"Access password of the web interface (optional)": "Heslo na prístup do webového rozhrania (voliteľné)",
"Access profile:": "Profil prístupu:",
@@ -405,7 +405,7 @@
"Another OCI operation is using the instance registry. Wait for it to finish and open this menu again; no container is modified.": "Ďalšia OCI operation používa inštančný register. Počkajte, kým to dokončíte a znovu otvoríte toto menu; žiadna nádoba nie je upravená.",
"Another OCI operation is using the instance registry. Wait for it to finish.": "Ďalšia operácia OCI používa register inštancií. Počkajte, kým to skončí.",
"Another OCI operation is using the registry. This operation was not started.": "Ďalšia OCI operation používa register. Táto operation sa nezačala.",
"Another ProxMenux OCI operation is running. Try again when it finishes.": "Prebieha ďalšia operácia ProxMenux OCI.Skúste to znova, keď to skončí.",
"Another ProxMenux OCI operation is running. Try again when it finishes.": "Prebieha ďalšia operácia ProxMenux OCI. Skúste to znova, keď to skončí.",
"Another ZRAM configuration exists or could not be inspected; systemd-zram-generator was retained": "Existuje iná konfigurácia ZRAM alebo ju nebolo možné skontrolovať; systemd-zram-generator bol zachovaný",
"Another ZRAM generator configuration exists; refusing to overwrite it:": "Existuje iná konfigurácia generátora ZRAM; refusing to overwrite it:",
"Another ZRAM swap setup exists; refusing to replace it:": "Existuje ďalšie nastavenie výmeny ZRAM; odmietnutie jeho výmeny:",
@@ -744,7 +744,7 @@
"Cannot resolve the container home directory:": "Nedá sa vyriešiť domovský adresár kontajnera:",
"Cannot validate credentials - no shares available for testing.": "Prihlasovacie údaje sa nedajú overiť - nie sú dostupné žiadne zdieľania na test.",
"Cannot verify the reused disk:": "Nie je možné overiť znovu použitý disk:",
"Cannot write the image archive to {storage}. Check storage access and mount status.": "Nie je možné zapísať archív obrázkov do {storage}.Skontrolujte prístup k úložisku a stav pripojenia.",
"Cannot write the image archive to {storage}. Check storage access and mount status.": "Nie je možné zapísať archív obrázkov do {storage}. Skontrolujte prístup k úložisku a stav pripojenia.",
"Capabilities cannot be kept and all dropped at the same time": "Nie je možné udržať si schopnosti a zároveň ich znížiť.",
"Category": "Kategória",
"Caution: Maximum mode generates more heat.": "Pozor: maximálny režim vytvára viac tepla.",
@@ -1374,20 +1374,20 @@
"Could not publish pending restore. Previous pending restore was kept.": "Nepodarilo sa zverejniť čakajúce obnovenie. Predchádzajúce čakajúce obnovenie bolo zachované.",
"Could not push the key. Check the password and that": "Kľúč sa nepodarilo odoslať. Skontrolujte heslo a to, že",
"Could not query the image registry": "Nepodarilo sa nájsť obrazový register",
"Could not reach {registry}. Check its address, DNS and network access.": "Nepodarilo sa dosiahnuť {registry}.Skontrolujte jeho adresu, DNS a prístup k sieti.",
"Could not reach {registry}. Check its address, DNS and network access.": "Nepodarilo sa dosiahnuť {registry}. Skontrolujte jeho adresu, DNS a prístup k sieti.",
"Could not read SMART data from": "SMART dáta sa nepodarilo prečítať z",
"Could not read VM configuration.": "Nastavenie VM sa nepodarilo prečítať.",
"Could not read the CUDA compute capability": "Nepodarilo sa prečítať výpočtovú schopnosť CUDA",
"Could not read the NVIDIA driver version": "Nepodarilo sa prečítať verziu ovládača NVIDIA",
"Could not read the host firewall rules": "Pravidlá firewallu hostiteľa sa nepodarilo načítať",
"Could not read the image from {registry}. Check the reference and sign in from Registry accounts.": "Nepodarilo sa prečítať obrázok z {registry}.Skontrolujte referenciu a prihláste sa z účtov Registra.",
"Could not read the image from {registry}. Check the reference and sign in from Registry accounts.": "Nepodarilo sa prečítať obrázok z {registry}. Skontrolujte referenciu a prihláste sa z účtov Registra.",
"Could not read this job.": "Túto úlohu sa nepodarilo prečítať.",
"Could not release ZRAM pages; existing profile remains active": "Nepodarilo sa uvoľniť stránky ZRAM; existujúci profil zostáva aktívny",
"Could not remount automatically. Try manually or check credentials.": "Automatické znovupripojenie zlyhalo. Skúste to ručne alebo skontrolujte prihlasovacie údaje.",
"Could not remove VM automatically. Run manually:": "VM sa nepodarilo odstrániť automaticky. Spustite ručne:",
"Could not remove ZRAM profile; configuration was restored": "Nepodarilo sa odstrániť profil ZRAM; konfigurácia bola obnovená",
"Could not remove ZRAM profile; configuration was restored but swap could not be restarted": "Nepodarilo sa odstrániť profil ZRAM; konfigurácia bola obnovená, ale swap nebolo možné reštartovať",
"Could not remove credentials for {registry}; saved file credentials were not changed.": "Nepodarilo sa odstrániť poverenia pre {registry};poverenia uloženého súboru neboli zmenené.",
"Could not remove credentials for {registry}; saved file credentials were not changed.": "Nepodarilo sa odstrániť poverenia pre {registry}; poverenia uloženého súboru neboli zmenené.",
"Could not remove previous DKMS tree at": "Nepodarilo sa odstrániť predchádzajúci DKMS strom v",
"Could not reserve a private network for the stack": "Nepodarilo sa rezervovať súkromnú sieť pre stack",
"Could not resolve the Compose user:": "Nepodarilo sa vyriešiť používateľa Compose:",
@@ -1402,7 +1402,7 @@
"Could not set VM virtual display to vga: std": "Virtuálne zobrazenie VM sa nepodarilo nastaviť na vga: std",
"Could not set boot order for": "Poradie bootovania sa nepodarilo nastaviť pre",
"Could not set the container entrypoint": "Nepodarilo sa nastaviť vstupný bod kontajnera",
"Could not sign in to {registry}. Check registry access and token permissions.": "Nepodarilo sa prihlásiť do {registry}.Skontrolujte prístup k registrom a povolenia tokenov.",
"Could not sign in to {registry}. Check registry access and token permissions.": "Nepodarilo sa prihlásiť do {registry}. Skontrolujte prístup k registrom a povolenia tokenov.",
"Could not stage pending restore path:": "Nepodarilo sa pripraviť cestu obnovenia:",
"Could not stage pending restore. Nothing new was scheduled.": "Nepodarilo sa pripraviť čakajúce obnovenie. Nič nové nebolo naplánované.",
"Could not stop LXC": "LXC sa nepodarilo zastaviť",
@@ -1496,7 +1496,8 @@
"Credentials file created securely.": "Súbor s prihlasovacími údajmi bol bezpečne vytvorený.",
"Credentials file removed.": "Súbor s prihlasovacími údajmi bol odstránený.",
"Credentials file:": "Súbor s prihlasovacími údajmi:",
"Credentials file:\n{path}\n\nOwned by root; directory mode 700 and file mode 600.\nBasic credentials are base64 encoded, not encrypted.\nCredential helpers use their own storage.\n\nUse an access token with permission to pull images.\nConfigure credentials on each node that downloads images.": "Súbor poverení:\n{path}\n\nVo vlastníctve root;režim adresárov 700 a režim súborov 600.\nZákladné poverenia sú zakódované pomocou base64, nie sú zašifrované.\nPomocníci poverení využívajú svoje vlastné úložisko.\n\nPoužite prístupový token s povolením na stiahnutie obrázkov.\nNakonfigurujte poverenia na každom uzle, ktorý sťahuje obrázky.",
"Credentials file:\n{path}\n\nOwned by root; directory mode 700 and file mode 600.\nBasic credentials are base64 encoded, not encrypted.\nCredential helpers use their own storage.\n\nUse an access token with permission to pull images.\nConfigure credentials on each node that downloads images.": "Súbor poverení:\n{path}\n\nVo vlastníctve root; režim adresárov 700 a režim súborov 600.\nZákladné poverenia sú zakódované pomocou base64, nie sú zašifrované.\nPomocníci poverení využívajú svoje vlastné úložisko.\n\nPoužite prístupový token s povolením na stiahnutie obrázkov.\nNakonfigurujte poverenia na každom uzle, ktorý sťahuje obrázky.",
"Credentials file:\n{path}\n\nOwned by root; directory mode 700 and file mode 600.\nBasic credentials are base64 encoded, not encrypted.\nCredential helpers use their own storage.\n\nUse an access token with permission to pull images.\nEvery node of the cluster uses the accounts saved here.": "Súbor poverení:\n{path}\n\nVo vlastníctve root; režim adresárov 700 a režim súborov 600.\nZákladné poverenia sú zakódované pomocou base64, nie sú zašifrované.\nPomocníci poverení využívajú svoje vlastné úložisko.\n\nPoužite prístupový token s povolením na stiahnutie obrázkov.\nKaždý uzol klastra používa tu uložené účty.",
"Credentials validated successfully": "Prihlasovacie údaje boli úspešne overené",
"Cross-host restore: guest IDs in backup overlap live IDs on target:": "Obnova medzi hostami: ID hostí zo zálohy sa prekrývajú so živými ID na cieli:",
"Cross-kernel restore — kernel-tied paths merged, not copied": "Obnova medzi kernelmi - cesty viazané na kernel boli zlúčené, nie skopírované",
@@ -2923,7 +2924,7 @@
"Image downloaded and verified.\n\n{reference}\n\nStorage: {storage}\nArchive size: {size}\nArchive: {archive}\n\nNo container was created.\nProxMenux removes unused cached images after successful updates.": "Obrázok bol stiahnutý a overený.\n\n{reference}\n\nSkladovanie: {storage}\nVeľkosť archívu: {size}\nArchív: {archive}\n\nNebol vytvorený žiadny kontajner.\nProxMenux po úspešných aktualizáciách odstráni nepoužívané obrázky z vyrovnávacej pamäte.",
"Image file not found:": "Súbor obrazu sa nenašiel:",
"Image imported:": "Obraz importovaný:",
"Image integrity verification failed. The partial download was discarded; try again.": "Overenie integrity obrázka zlyhalo. Čiastočné stiahnutie bolo zahodené;skúste to znova.",
"Image integrity verification failed. The partial download was discarded; try again.": "Overenie integrity obrázka zlyhalo. Čiastočné stiahnutie bolo zahodené; skúste to znova.",
"Image integrity verified": "Potvrdená integrita obrázku",
"Image not allowed for the host monitor profile": "Obrázok nie je povolený pre profil monitora hostiteľa",
"Image reference": "Odkaz na obrázok",
@@ -4336,7 +4337,7 @@
"Not currently mounted — skipping umount.": "Nie je pripojené, odpojenie preskakujem.",
"Not declared": "Nedeklarované",
"Not enough free space for the backup": "Nedostatok voľného priestoru pre zálohu",
"Not enough free space on {storage}. Free some space or select another storage.": "Nedostatok voľného miesta na {storage}.Uvoľnite miesto alebo vyberte iné úložisko.",
"Not enough free space on {storage}. Free some space or select another storage.": "Nedostatok voľného miesta na {storage}. Uvoľnite miesto alebo vyberte iné úložisko.",
"Not found": "Nenájdené",
"Not found in the OCI archive:": "Nenájdené v archíve OCI:",
"Not imported:": "Neimportované:",
@@ -5876,7 +5877,7 @@
"Skipping installation.": "Inštalácia sa preskakuje.",
"Skipping manual patches — feranick fork already supports this kernel.": "Ručné záplaty preskakujem - fork feranick už tento kernel podporuje.",
"Skopeo is not available. Restore the ProxMenux OCI dependencies and try again.": "Skopeo nie je k dispozícii. Obnovte závislosti ProxMenux OCI a skúste to znova.",
"Skopeo returned an invalid credential file; saved credentials were not changed.": "Skopeo vrátilo neplatný súbor poverení;uložené prihlasovacie údaje neboli zmenené.",
"Skopeo returned an invalid credential file; saved credentials were not changed.": "Skopeo vrátilo neplatný súbor poverení; uložené prihlasovacie údaje neboli zmenené.",
"Sleek podcast downloader with GPodder sync": "Sleek podcast downloader s GPodder synchronizácia",
"Smart restore plan — hardware compatibility check": "Inteligentný plán obnovy - kontrola kompatibility hardvéru",
"Smokeping keeps track of your network latency. For a full example of what this application is capable of visit UCDavis.": "Smokeping sleduje latenciu vašej siete. Úplný príklad toho, čo je táto aplikácia schopná navštíviť UCDavis.",
@@ -6770,7 +6771,7 @@
"This GPU is considered incompatible with GPU passthrough to a VM in ProxMenux.": "Táto GPU sa v ProxMenux považuje za nekompatibilnú s GPU passthrough do VM.",
"This NFS share is fully restricted — even the host root cannot write to it.": "Toto NFS zdieľanie je úplne obmedzené - ani root na hostovi doň nevie zapisovať.",
"This VM requires extra installation steps, see install guide at:\nhttps://github.com/community-scripts/ProxmoxVE/discussions/144": "Táto VM vyžaduje ďalšie kroky inštalácie. Návod nájdete tu:\nhttps://github.com/community-scripts/ProxmoxVE/discussions/144",
"This account is for {registry}. Enter an image from that registry.": "Tento účet je pre {registry}.Zadajte obrázok z tohto registra.",
"This account is for {registry}. Enter an image from that registry.": "Tento účet je pre {registry}. Zadajte obrázok z tohto registra.",
"This action will:": "Táto akcia vykoná:",
"This application cannot be recovered yet:": "Túto aplikáciu zatiaľ nie je možné obnoviť:",
"This application cannot be recovered yet; nothing was changed:": "Túto aplikáciu zatiaľ nie je možné obnoviť; nič sa nezmenilo:",
@@ -7641,7 +7642,7 @@
"assembling": "montáž",
"automatically. Install it manually inside the container.": "automaticky. Nainštalujte ho ručne vo vnútri kontajnera.",
"automatically. Reboot LXC to fully release.": "automaticky. Pre úplné uvoľnenie reštartujte LXC.",
"available": "k dispozícii",
"available": "K dispozícii",
"available for LXC bind-mounts via 'LXC Mount Manager'": "dostupné pre LXC bind mounty cez 'Správca LXC mountov'",
"available in this same GPU and TPU menu.": "dostupnej v tomto istom GPU a TPU menu.",
"backup at /etc/fstab.proxmenux.bak": "záloha v /etc/fstab.proxmenux.bak",
@@ -7994,7 +7995,7 @@
"runs in": "beží v",
"safe paths now (configs, packages, /etc, /root, ...)": "bezpečné cesty teraz (nastavenia, balíky, /etc, /root, ...)",
"same MAC": "rovnaká MAC",
"saved": "uložené",
"saved": "Uložené",
"seconds (default)": "sekúnd (predvolené)",
"see log:": "pozrite záznam:",
"selected by default": "vybrané štandardne",
@@ -8117,9 +8118,10 @@
"{count} saved accounts.": "{count} uložené účty.",
"{path} already exists and belongs to another user of the host, so {app} cannot write to it.\n\nProxMenux can add access rules (ACL) to this directory, to everything inside it and to what is created there later, for the users and groups {app} runs as on the host (IDs {ids}). The owner of the files does not change and whatever reads or writes them today keeps doing so; the owner of the directory also gets access to the files {app} creates.\n\nGrant {app} access to this directory?": "{path} už existuje a patrí inému používateľovi hostiteľa, takže {app} naň nemôže zapisovať.\n\nProxMenux môže pridať pravidlá prístupu (ACL) k tomuto adresáru, ku všetkému v ňom a k tomu, čo sa v ňom vytvorí neskôr, pre používateľov a skupiny, pod ktorými {app} beží na hostiteľovi (ID {ids}). Vlastník súborov sa nemení a čokoľvek, čo ich dnes číta alebo zapisuje, to robí aj naďalej; vlastník adresára tiež získa prístup k súborom, ktoré {app} vytvorí.\n\nUdeliť {app} prístup k tomuto adresáru?",
"{path} already exists and belongs to another user of the host, so {app} cannot write to it.\n\nProxMenux can add an access rule (ACL) for the identity {app} uses on the host (UID {uid}). Nothing that is there changes owner or permissions: whatever reads or writes those files today keeps doing so, and the owner of the directory also gets access to the files {app} creates.\n\nGrant {app} access to this directory?": "{path} už existuje a patrí inému používateľovi hostiteľa, takže {app} naň nemôže zapisovať.\n\nProxMenux môže pridať pravidlo prístupu (ACL) pre identitu, ktorú {app} používa na hostiteľovi (UID {uid}).Nič z toho, čo tam je, nemení vlastníka ani oprávnenia: čokoľvek, čo dnes číta alebo zapisuje tieto súbory, to robí aj naďalej a vlastník adresára tiež získa prístup k súborom, ktoré {app} vytvorí.\n\nUdeliť {app} prístup k tomuto adresáru?",
"{registry} answered with plain HTTP. Use a registry with HTTPS; TLS verification remains enabled.": "{registry} odpovedal jednoduchým HTTP.Použite register s HTTPS;Overenie TLS zostáva povolené.",
"{registry} answered with plain HTTP. Use a registry with HTTPS; TLS verification remains enabled.": "{registry} odpovedal jednoduchým HTTP. Použite register s HTTPS; Overenie TLS zostáva povolené.",
"{registry} did not respond within {timeout} seconds. Try again later.": "{registry} neodpovedal do {timeout} sekúnd. Skúste to znova neskôr.",
"{registry} is rate limiting requests. Wait a while and try again.": "{registry} sú požiadavky obmedzujúce rýchlosť. Chvíľu počkajte a skúste to znova.",
"{registry} refused access to this image:\n{reference}\n\nIf the image is private, sign in with an account that can pull it.\n\nSign in now?": "{registry} odmietol prístup k tomuto obrázku:\n{reference}\n\nAk je obrázok súkromný, prihláste sa pomocou účtu, ktorý ho môže stiahnuť.\n\nPrihláste sa teraz?",
"{registry} reported a server error. Try again later.": "{registry} ohlásil chybu servera. Skúste to znova neskôr.",
"{registry} returned invalid or unsupported image metadata.": "{registry} vrátilo neplatné alebo nepodporované metadáta obrázka.",
"— Full/Custom restore will skip kernel-tied paths": "- úplná/vlastná obnova preskočí cesty viazané na kernel",
+21 -19
View File
@@ -192,7 +192,7 @@
"Access bridge for Tandoor": "Tillgångsbro för Tandoor",
"Access could not be granted completely; the application may be unable to write to:": "Åtkomst kunde inte beviljas fullständigt; applikationen kanske inte kan skriva till:",
"Access could not be granted; the application cannot write to:": "Åtkomst kunde inte beviljas; ansökan kan inte skriva till:",
"Access denied by {registry}. Check the image name and sign in from Registry accounts.": "Åtkomst nekad av {registry}.Kontrollera bildnamnet och logga in från registerkonton.",
"Access denied by {registry}. Check the image name and sign in from Registry accounts.": "Åtkomst nekad av {registry}. Kontrollera bildnamnet och logga in från registerkonton.",
"Access granted to the application on:": "Tillgång beviljad till ansökan på:",
"Access password of the web interface (optional)": "Åtkomstlösenord för webbgränssnittet (valfritt)",
"Access profile:": "Åtkomstprofil:",
@@ -506,7 +506,7 @@
"Authentication": "Autentisering",
"Authentication & Security": "Autentisering och säkerhet",
"Authentication Error": "Autentiseringsfel",
"Authentication failed for {registry}. Check the account and token permissions.": "Autentisering misslyckades för {registry}.Kontrollera konto- och tokenbehörigheterna.",
"Authentication failed for {registry}. Check the account and token permissions.": "Autentisering misslyckades för {registry}. Kontrollera konto- och tokenbehörigheterna.",
"Authentication failed.": "Autentiseringen misslyckades.",
"Authentication required:": "Autentisering krävs:",
"Authentication:": "Autentisering:",
@@ -744,7 +744,7 @@
"Cannot resolve the container home directory:": "Kan inte lösa behållarens hemkatalog:",
"Cannot validate credentials - no shares available for testing.": "Kan inte validera autentiseringsuppgifter - inga delningar tillgängliga för testning.",
"Cannot verify the reused disk:": "Kan inte verifiera den återanvända disken:",
"Cannot write the image archive to {storage}. Check storage access and mount status.": "Kan inte skriva bildarkivet till {storage}.Kontrollera lagringsåtkomst och monteringsstatus.",
"Cannot write the image archive to {storage}. Check storage access and mount status.": "Kan inte skriva bildarkivet till {storage}. Kontrollera lagringsåtkomst och monteringsstatus.",
"Capabilities cannot be kept and all dropped at the same time": "Förmågor kan inte hållas och alla tappas samtidigt",
"Category": "Kategori",
"Caution: Maximum mode generates more heat.": "Varning: Maximalt läge genererar mer värme.",
@@ -1374,20 +1374,20 @@
"Could not publish pending restore. Previous pending restore was kept.": "Kunde inte publicera väntande återställning. Tidigare pågående återställning behölls.",
"Could not push the key. Check the password and that": "Kunde inte trycka på nyckeln. Kolla lösenordet och så",
"Could not query the image registry": "Kunde inte fråga bildregistret",
"Could not reach {registry}. Check its address, DNS and network access.": "Kunde inte nå {registry}.Kontrollera dess adress, DNS och nätverksåtkomst.",
"Could not reach {registry}. Check its address, DNS and network access.": "Kunde inte nå {registry}. Kontrollera dess adress, DNS och nätverksåtkomst.",
"Could not read SMART data from": "Det gick inte att läsa SMART-data från",
"Could not read VM configuration.": "Det gick inte att läsa VM-konfigurationen.",
"Could not read the CUDA compute capability": "Kunde inte läsa CUDA-beräkningsförmågan",
"Could not read the NVIDIA driver version": "Kan inte läsa NVIDIA-förarversionen",
"Could not read the host firewall rules": "Kunde inte läsa värdbrandväggens regler",
"Could not read the image from {registry}. Check the reference and sign in from Registry accounts.": "Kunde inte läsa bilden från {registry}.Kontrollera referensen och logga in från registerkonton.",
"Could not read the image from {registry}. Check the reference and sign in from Registry accounts.": "Kunde inte läsa bilden från {registry}. Kontrollera referensen och logga in från registerkonton.",
"Could not read this job.": "Kunde inte läsa det här jobbet.",
"Could not release ZRAM pages; existing profile remains active": "Kunde inte släppa ZRAM-sidor; befintlig profil förblir aktiv",
"Could not remount automatically. Try manually or check credentials.": "Kunde inte montera om automatiskt. Försök manuellt eller kontrollera autentiseringsuppgifterna.",
"Could not remove VM automatically. Run manually:": "Det gick inte att ta bort VM automatiskt. Kör manuellt:",
"Could not remove ZRAM profile; configuration was restored": "Kunde inte ta bort ZRAM-profilen; konfigurationen återställdes",
"Could not remove ZRAM profile; configuration was restored but swap could not be restarted": "Kunde inte ta bort ZRAM-profilen; konfigurationen återställdes men swap kunde inte startas om",
"Could not remove credentials for {registry}; saved file credentials were not changed.": "Kunde inte ta bort inloggningsuppgifter för {registry};sparade autentiseringsuppgifter för filen ändrades inte.",
"Could not remove credentials for {registry}; saved file credentials were not changed.": "Kunde inte ta bort inloggningsuppgifter för {registry}; sparade autentiseringsuppgifter för filen ändrades inte.",
"Could not remove previous DKMS tree at": "Det gick inte att ta bort tidigare DKMS-träd kl",
"Could not reserve a private network for the stack": "Kunde inte reservera ett privat nätverk för stacken",
"Could not resolve the Compose user:": "Kunde inte lösa Compose-användaren:",
@@ -1402,7 +1402,7 @@
"Could not set VM virtual display to vga: std": "Det gick inte att ställa in virtuell skärm på vga: std",
"Could not set boot order for": "Det gick inte att ställa in startordning för",
"Could not set the container entrypoint": "Kan inte ställa in behållarens ingångspunkt",
"Could not sign in to {registry}. Check registry access and token permissions.": "Kunde inte logga in på {registry}.Kontrollera registeråtkomst och tokenbehörigheter.",
"Could not sign in to {registry}. Check registry access and token permissions.": "Kunde inte logga in på {registry}. Kontrollera registeråtkomst och tokenbehörigheter.",
"Could not stage pending restore path:": "Kunde inte scenen väntande återställningssökväg:",
"Could not stage pending restore. Nothing new was scheduled.": "Kunde inte scenen väntande återställning. Inget nytt var inplanerat.",
"Could not stop LXC": "Kunde inte stoppa LXC",
@@ -1496,7 +1496,8 @@
"Credentials file created securely.": "Autentiseringsfil skapad på ett säkert sätt.",
"Credentials file removed.": "Autentiseringsfilen har tagits bort.",
"Credentials file:": "Autentiseringsfil:",
"Credentials file:\n{path}\n\nOwned by root; directory mode 700 and file mode 600.\nBasic credentials are base64 encoded, not encrypted.\nCredential helpers use their own storage.\n\nUse an access token with permission to pull images.\nConfigure credentials on each node that downloads images.": "Autentiseringsfil:\n{path}\n\nÄgs av roten;katalogläge 700 och filläge 600.\nGrundläggande referenser är base64-kodade, inte krypterade.\nCredential hjälpare använder sin egen förvaring.\n\nAnvänd en åtkomsttoken med behörighet att dra bilder.\nKonfigurera autentiseringsuppgifter på varje nod som laddar ner bilder.",
"Credentials file:\n{path}\n\nOwned by root; directory mode 700 and file mode 600.\nBasic credentials are base64 encoded, not encrypted.\nCredential helpers use their own storage.\n\nUse an access token with permission to pull images.\nConfigure credentials on each node that downloads images.": "Autentiseringsfil:\n{path}\n\nÄgs av roten; katalogläge 700 och filläge 600.\nGrundläggande referenser är base64-kodade, inte krypterade.\nCredential hjälpare använder sin egen förvaring.\n\nAnvänd en åtkomsttoken med behörighet att dra bilder.\nKonfigurera autentiseringsuppgifter på varje nod som laddar ner bilder.",
"Credentials file:\n{path}\n\nOwned by root; directory mode 700 and file mode 600.\nBasic credentials are base64 encoded, not encrypted.\nCredential helpers use their own storage.\n\nUse an access token with permission to pull images.\nEvery node of the cluster uses the accounts saved here.": "Autentiseringsfil:\n{path}\n\nÄgs av roten; katalogläge 700 och filläge 600.\nGrundläggande referenser är base64-kodade, inte krypterade.\nCredential hjälpare använder sin egen förvaring.\n\nAnvänd en åtkomsttoken med behörighet att dra bilder.\nVarje nod i klustret använder de konton som sparats här.",
"Credentials validated successfully": "Inloggningsuppgifterna har validerats",
"Cross-host restore: guest IDs in backup overlap live IDs on target:": "Cross-host-återställning: gäst-ID:n i säkerhetskopia överlappar live-ID:n på målet:",
"Cross-kernel restore — kernel-tied paths merged, not copied": "Korskärnåterställning — kärnbundna sökvägar sammanslagna, inte kopierade",
@@ -2923,7 +2924,7 @@
"Image downloaded and verified.\n\n{reference}\n\nStorage: {storage}\nArchive size: {size}\nArchive: {archive}\n\nNo container was created.\nProxMenux removes unused cached images after successful updates.": "Bild har laddats ner och verifierats.\n\n{reference}\n\nLagring: {storage}\nArkivstorlek: {size}\nArkiv: {archive}\n\nIngen behållare skapades.\nProxMenux tar bort oanvända cachade bilder efter lyckade uppdateringar.",
"Image file not found:": "Bildfilen hittades inte:",
"Image imported:": "Bild importerad:",
"Image integrity verification failed. The partial download was discarded; try again.": "Verifiering av bildintegritet misslyckades. Den partiella nedladdningen kasserades;försök igen.",
"Image integrity verification failed. The partial download was discarded; try again.": "Verifiering av bildintegritet misslyckades. Den partiella nedladdningen kasserades; försök igen.",
"Image integrity verified": "Bildintegritet verifierad",
"Image not allowed for the host monitor profile": "Bild som inte är tillåten för värdmonitorprofilen",
"Image reference": "Bildreferens",
@@ -4269,7 +4270,7 @@
"No recent": "Inga nya",
"No recent Samba servers found.": "Inga nya Samba-servrar hittades.",
"No registered OCI containers are available for selection on this host.": "Inga registrerade OCI-behållare är tillgängliga för val på denna värd.",
"No registry API was found at {registry}. Check the hostname and port.": "Inget register-API hittades på {registry}.Kontrollera värdnamnet och porten.",
"No registry API was found at {registry}. Check the hostname and port.": "Inget register-API hittades på {registry}. Kontrollera värdnamnet och porten.",
"No restored OCI application is waiting to be recovered.": "Ingen återställd OCI-applikation väntar på att återställas.",
"No results": "Inga resultat",
"No routing information found.": "Ingen ruttinformation hittades.",
@@ -4336,7 +4337,7 @@
"Not currently mounted — skipping umount.": "Ej monterad för närvarande — hoppar över umount.",
"Not declared": "Ej deklarerad",
"Not enough free space for the backup": "Inte tillräckligt med ledigt utrymme för backup",
"Not enough free space on {storage}. Free some space or select another storage.": "Inte tillräckligt med ledigt utrymme på {storage}.Frigör lite utrymme eller välj ett annat lagringsutrymme.",
"Not enough free space on {storage}. Free some space or select another storage.": "Inte tillräckligt med ledigt utrymme på {storage}. Frigör lite utrymme eller välj ett annat lagringsutrymme.",
"Not found": "Hittade inte",
"Not found in the OCI archive:": "Finns inte i OCI-arkivet:",
"Not imported:": "Ej importerad:",
@@ -5874,7 +5875,7 @@
"Skipping installation.": "Hoppa över installationen.",
"Skipping manual patches — feranick fork already supports this kernel.": "Hoppa över manuella patchar — feranick fork stöder redan denna kärna.",
"Skopeo is not available. Restore the ProxMenux OCI dependencies and try again.": "Skopeo är inte tillgängligt. Återställ ProxMenux OCI beroenden och försök igen.",
"Skopeo returned an invalid credential file; saved credentials were not changed.": "Skopeo returnerade en ogiltig autentiseringsfil;sparade referenser ändrades inte.",
"Skopeo returned an invalid credential file; saved credentials were not changed.": "Skopeo returnerade en ogiltig autentiseringsfil; sparade referenser ändrades inte.",
"Sleek podcast downloader with GPodder sync": "Sleek podcast downloader med GPodder sync",
"Smart restore plan — hardware compatibility check": "Smart återställningsplan — kontroll av hårdvarukompatibilitet",
"Smokeping keeps track of your network latency. For a full example of what this application is capable of visit UCDavis.": "Smokeping håller reda på din nätverks latens. För ett fullständigt exempel på vad denna ansökan kan besöka UCDavis.",
@@ -6132,7 +6133,7 @@
"TCP optimizations configuration completed": "TCP-optimeringskonfigurationen är klar",
"TCP optimizations reverted (defaults restored on next reboot)": "TCP-optimeringar har återställts (standarderna återställs vid nästa omstart)",
"TCP port 5201 is reachable (firewall on server)": "TCP-port 5201 är nåbar (brandvägg på servern)",
"TLS verification failed for {registry}. Install the registry CA in /etc/containers/certs.d/{registry}/ca.crt.": "TLS-verifiering misslyckades för {registry}.Installera registret CA i /etc/containers/certs.d/{registry}/ca.crt.",
"TLS verification failed for {registry}. Install the registry CA in /etc/containers/certs.d/{registry}/ca.crt.": "TLS-verifiering misslyckades för {registry}. Installera registret CA i /etc/containers/certs.d/{registry}/ca.crt.",
"TPM device added to VM": "TPM-enhet har lagts till VM",
"TPM storage selection failed or was cancelled. VM creation aborted.": "Val av TPM-lagring misslyckades eller avbröts. VM-skapandet avbröts.",
"TROUBLESHOOTING:": "FELSÖKNING:",
@@ -6365,7 +6366,7 @@
"The containers do not need them any more; an update downloads the new versions when there are any.": "Behållarna behöver dem inte längre; en uppdatering laddar ner de nya versionerna när det finns några.",
"The containers were created from downloaded OCI images": "Behållarna skapades från nedladdade OCI-bilder",
"The coordinated backup was modified": "Den samordnade backupen modifierades",
"The credential file changed during this operation. Try again; it was not overwritten.": "Autentiseringsfilen ändrades under denna operation. Försök igen;den skrevs inte över.",
"The credential file changed during this operation. Try again; it was not overwritten.": "Autentiseringsfilen ändrades under denna operation. Försök igen; den skrevs inte över.",
"The current driver will be completely uninstalled before installing the new version. Continue?": "Den aktuella drivrutinen kommer att avinstalleras helt innan den nya versionen installeras. Fortsätta?",
"The current image of the saved channel will be checked and downloaded. Resources, paths and GPU are kept. The CT is stopped during the replacement and a native backup is created first.": "Den aktuella bilden av den sparade kanalen kontrolleras och laddas ner. Resurser, vägar och GPU hålls. CT stoppas under ersättningen och en infödd säkerhetskopia skapas först.",
"The current record is missing for": "Nuvarande rekord saknas för",
@@ -6602,7 +6603,7 @@
"The record or diagnosis could not be completed; no update was run.": "Rekordet eller diagnosen kunde inte slutföras; ingen uppdatering kördes.",
"The recovery did not complete. Review the log and choose \"Recover\" again for this container in the OCI management menu.": "Återhämtningen slutfördes inte. Granska loggen och välj \"Recover\" igen för den här behållaren i OCI-hanteringsmenyn.",
"The recovery did not complete. Review the log and choose \"{choice}\" again for this container in the OCI management menu.": "Återställningen slutfördes inte. Granska loggen och välj \"{choice}\" igen för den här containern i OCI-hanteringsmenyn.",
"The registry authentication file is invalid; it was not changed.": "Registerautentiseringsfilen är ogiltig;det ändrades inte.",
"The registry authentication file is invalid; it was not changed.": "Registerautentiseringsfilen är ogiltig; det ändrades inte.",
"The registry authentication file must be owned by root with mode 600.": "Registerautentiseringsfilen måste ägas av root med läge 600.",
"The registry authentication file must have an absolute path.": "Registerautentiseringsfilen måste ha en absolut sökväg.",
"The registry authentication path cannot contain symbolic links.": "Registerautentiseringssökvägen kan inte innehålla symboliska länkar.",
@@ -6769,7 +6770,7 @@
"This GPU is considered incompatible with GPU passthrough to a VM in ProxMenux.": "Denna GPU anses vara inkompatibel med GPU-genomföring till en virtuell dator i ProxMenux.",
"This NFS share is fully restricted — even the host root cannot write to it.": "Denna NFS-resurs är helt begränsad — även värdroten kan inte skriva till den.",
"This VM requires extra installation steps, see install guide at:\nhttps://github.com/community-scripts/ProxmoxVE/discussions/144": "Denna virtuella dator kräver extra installationssteg, se installationsguiden på:\nhttps://github.com/community-scripts/ProxmoxVE/discussions/144",
"This account is for {registry}. Enter an image from that registry.": "Detta konto är för {registry}.Ange en bild från det registret.",
"This account is for {registry}. Enter an image from that registry.": "Detta konto är för {registry}. Ange en bild från det registret.",
"This action will:": "Denna åtgärd kommer att:",
"This application cannot be recovered yet:": "Denna applikation kan inte återställas ännu:",
"This application cannot be recovered yet; nothing was changed:": "Denna applikation kan inte återställas ännu; ingenting ändrades:",
@@ -7640,7 +7641,7 @@
"assembling": "montering",
"automatically. Install it manually inside the container.": "automatiskt. Installera den manuellt inuti behållaren.",
"automatically. Reboot LXC to fully release.": "automatiskt. Starta om LXC för att släppa helt.",
"available": "tillgänglig",
"available": "Tillgänglig",
"available for LXC bind-mounts via 'LXC Mount Manager'": "tillgänglig för LXC bind-mounts via \"LXC Mount Manager\"",
"available in this same GPU and TPU menu.": "tillgänglig i samma GPU- och TPU-meny.",
"backup at /etc/fstab.proxmenux.bak": "säkerhetskopia på /etc/fstab.proxmenux.bak",
@@ -7993,7 +7994,7 @@
"runs in": "springs in",
"safe paths now (configs, packages, /etc, /root, ...)": "säkra sökvägar nu (konfigurationer, paket, /etc, /root, ...)",
"same MAC": "samma MAC",
"saved": "sparad",
"saved": "Sparad",
"seconds (default)": "sekunder (standard)",
"see log:": "se logg:",
"selected by default": "valt som standard",
@@ -8116,9 +8117,10 @@
"{count} saved accounts.": "{count} sparade konton.",
"{path} already exists and belongs to another user of the host, so {app} cannot write to it.\n\nProxMenux can add access rules (ACL) to this directory, to everything inside it and to what is created there later, for the users and groups {app} runs as on the host (IDs {ids}). The owner of the files does not change and whatever reads or writes them today keeps doing so; the owner of the directory also gets access to the files {app} creates.\n\nGrant {app} access to this directory?": "{path} finns redan och tillhör en annan användare på värden, så {app} kan inte skriva till den.\n\nProxMenux kan lägga till åtkomstregler (ACL) för den här katalogen, för allt i den och för det som skapas där senare, för de användare och grupper som {app} körs som på värden (ID {ids}). Ägaren till filerna ändras inte och det som läser eller skriver dem i dag fortsätter att göra det; katalogens ägare får också åtkomst till filerna som {app} skapar.\n\nGe {app} åtkomst till den här katalogen?",
"{path} already exists and belongs to another user of the host, so {app} cannot write to it.\n\nProxMenux can add an access rule (ACL) for the identity {app} uses on the host (UID {uid}). Nothing that is there changes owner or permissions: whatever reads or writes those files today keeps doing so, and the owner of the directory also gets access to the files {app} creates.\n\nGrant {app} access to this directory?": "{path} finns redan och tillhör en annan användare av värden, så {app} kan inte skriva till den.\n\nProxMenux kan lägga till en åtkomstregel (ACL) för identiteten {app} använder på värden (UID {uid}).Inget som finns där ändrar ägare eller behörigheter: vad som än läser eller skriver dessa filer idag fortsätter att göra det, och ägaren av katalogen får också tillgång till filerna som {app} skapar.\n\nGe {app} åtkomst till den här katalogen?",
"{registry} answered with plain HTTP. Use a registry with HTTPS; TLS verification remains enabled.": "{registry} besvarades med vanlig HTTP.Använd ett register med HTTPS;TLS-verifiering förblir aktiverad.",
"{registry} answered with plain HTTP. Use a registry with HTTPS; TLS verification remains enabled.": "{registry} besvarades med vanlig HTTP. Använd ett register med HTTPS; TLS-verifiering förblir aktiverad.",
"{registry} did not respond within {timeout} seconds. Try again later.": "{registry} svarade inte inom {timeout} sekunder. Försök igen senare.",
"{registry} is rate limiting requests. Wait a while and try again.": "{registry} är hastighetsbegränsande förfrågningar. Vänta ett tag och försök igen.",
"{registry} refused access to this image:\n{reference}\n\nIf the image is private, sign in with an account that can pull it.\n\nSign in now?": "{registry} vägrade tillgång till denna bild:\n{reference}\n\nOm bilden är privat, logga in med ett konto som kan dra den.\n\nLogga in nu?",
"{registry} reported a server error. Try again later.": "{registry} rapporterade ett serverfel. Försök igen senare.",
"{registry} returned invalid or unsupported image metadata.": "{registry} returnerade ogiltig eller ostödd bildmetadata.",
"— Full/Custom restore will skip kernel-tied paths": "— Full/Custom-återställning hoppar över kärnbundna sökvägar",
+13 -6
View File
@@ -72,10 +72,17 @@ Select a saved account to check access to an image, download it to template
storage, install it with the existing LXC wizard, update its credentials or
remove them. Image references retain their tag or full `sha256` digest.
The normal custom-image importer can also use the saved credentials, including
Compose files whose services come from private registries.
Compose files whose services come from private registries. When a registry
refuses an image there, the importer offers to sign in on the spot and reads
the image again. Updates, Modify, Recreate, the watchdog and the update check
of the Monitor use the saved accounts too.
Skopeo stores credentials in `/root/.config/containers/auth.json` by default.
`REGISTRY_AUTH_FILE` and `XDG_CONFIG_HOME` overrides are respected. The
ProxMenux keeps the accounts in `/etc/pve/priv/proxmenux/registry-auth.json`,
where Proxmox keeps its own storage passwords: readable only by root and shared
by every node of the cluster. The host backup includes it, and uninstalling
ProxMenux removes it. A `REGISTRY_AUTH_FILE` set by the user is respected;
without the cluster filesystem, Skopeo's default `/root/.config/containers/auth.json`
is used. The
credential directory must be owned by root with mode `700`, and the file with
mode `600`. Basic credentials are base64 encoded, not encrypted. Configured
Skopeo credential helpers use their own stores. Failed sign-in attempts leave
@@ -84,9 +91,9 @@ applications unchanged. Other Skopeo/Docker authentication files are managed
separately and may still grant access.
TLS verification remains enabled. Install a private registry CA in
`/etc/containers/certs.d/REGISTRY[:PORT]/ca.crt` when required. Configure accounts
on each node that pulls images; registry credentials are not written into the
application template or copied into its LXC.
`/etc/containers/certs.d/REGISTRY[:PORT]/ca.crt` when required, on each node
that pulls images. Registry credentials are not written into the application
template or copied into its LXC.
Image access checks have a 30-second timeout per request; sign-in has a 45-second
timeout. Errors identify rejected credentials, missing images, incompatible
+4
View File
@@ -1,5 +1,9 @@
#!/usr/bin/env bash
set -Eeuo pipefail
# A registry login saved by ProxMenux lets skopeo read private images.
if [[ -z ${REGISTRY_AUTH_FILE:-} && -f /etc/pve/priv/proxmenux/registry-auth.json ]]; then
export REGISTRY_AUTH_FILE=/etc/pve/priv/proxmenux/registry-auth.json
fi
TEMPLATE_FILE=${1:?template JSON required}
DEPLOYMENT_FILE=${2:?deployment JSON required}
+4
View File
@@ -1,5 +1,9 @@
#!/usr/bin/env bash
set -Eeuo pipefail
# A registry login saved by ProxMenux lets skopeo read private images.
if [[ -z ${REGISTRY_AUTH_FILE:-} && -f /etc/pve/priv/proxmenux/registry-auth.json ]]; then
export REGISTRY_AUTH_FILE=/etc/pve/priv/proxmenux/registry-auth.json
fi
TEMPLATE_FILE=${1:?template JSON required}
DEPLOYMENT_FILE=${2:?deployment JSON required}
+4
View File
@@ -1,5 +1,9 @@
#!/usr/bin/env bash
set -Eeuo pipefail
# A registry login saved by ProxMenux lets skopeo read private images.
if [[ -z ${REGISTRY_AUTH_FILE:-} && -f /etc/pve/priv/proxmenux/registry-auth.json ]]; then
export REGISTRY_AUTH_FILE=/etc/pve/priv/proxmenux/registry-auth.json
fi
TEMPLATE_FILE=${1:?template JSON required}
DEPLOYMENT_FILE=${2:?deployment JSON required}
+4
View File
@@ -1,5 +1,9 @@
#!/usr/bin/env bash
set -Eeuo pipefail
# A registry login saved by ProxMenux lets skopeo read private images.
if [[ -z ${REGISTRY_AUTH_FILE:-} && -f /etc/pve/priv/proxmenux/registry-auth.json ]]; then
export REGISTRY_AUTH_FILE=/etc/pve/priv/proxmenux/registry-auth.json
fi
TEMPLATE_FILE=${1:?template JSON required}
DEPLOYMENT_FILE=${2:?deployment JSON required}
+4
View File
@@ -1,5 +1,9 @@
#!/usr/bin/env bash
set -Eeuo pipefail
# A registry login saved by ProxMenux lets skopeo read private images.
if [[ -z ${REGISTRY_AUTH_FILE:-} && -f /etc/pve/priv/proxmenux/registry-auth.json ]]; then
export REGISTRY_AUTH_FILE=/etc/pve/priv/proxmenux/registry-auth.json
fi
TEMPLATE_FILE=${1:?template JSON required}
DEPLOYMENT_FILE=${2:?deployment JSON required}
+5
View File
@@ -19,6 +19,11 @@ import uuid
from oci_ui import translate, msg_error, msg_ok
# A registry login saved by ProxMenux lets skopeo read private images.
REGISTRY_AUTH_FILE = '/etc/pve/priv/proxmenux/registry-auth.json'
if not os.environ.get('REGISTRY_AUTH_FILE') and os.path.isfile(REGISTRY_AUTH_FILE):
os.environ['REGISTRY_AUTH_FILE'] = REGISTRY_AUTH_FILE
ROOT = Path('/var/lib/proxmenux/oci-installations')
FIELDS = ('Entrypoint', 'Cmd', 'Env', 'User', 'WorkingDir', 'StopSignal', 'Volumes', 'ExposedPorts', 'Healthcheck')
VERSION_ENV_RE = re.compile(r'^([A-Z][A-Z0-9_]*)_VERSION$')
+5
View File
@@ -16,6 +16,11 @@ import oci_work_backup as work_backup
from oci_installation_state import image_from_archive, same_image
from oci_ui import translate, msg_info, msg_ok, msg_warn, msg_error, msg_info2
# A registry login saved by ProxMenux lets skopeo read private images.
REGISTRY_AUTH_FILE = '/etc/pve/priv/proxmenux/registry-auth.json'
if not os.environ.get('REGISTRY_AUTH_FILE') and os.path.isfile(REGISTRY_AUTH_FILE):
os.environ['REGISTRY_AUTH_FILE'] = REGISTRY_AUTH_FILE
def repository(reference):
repo = reference.split('@', 1)[0]
+5
View File
@@ -1,3 +1,8 @@
"""ProxMenux LinuxServer-to-Proxmox OCI laboratory tools."""
from .registry_auth import use_cluster_auth_file as _use_cluster_auth_file
__version__ = "0.1.0"
# Every skopeo call of the engine reads the registry accounts kept for the cluster.
_use_cluster_auth_file()
+23 -2
View File
@@ -22,7 +22,7 @@ from .i18n import source_text
from .installer import ADVANCED_MODE, DEFAULT_MODE
from .converter import ConversionError
from .i18n import translate
from .registry_auth import RegistryError, validate_image
from .registry_auth import RegistryError, refuses_access, validate_image
from .ui import UserCancelled
def _valid_image_reference(reference: str) -> bool:
@@ -523,6 +523,12 @@ def read_definition(ui) -> tuple[str, str]:
return compose_from_docker_run(_read_pasted(ui, translate('docker run command of the application'))), \
translate('docker run command')
reference = ui.ask(translate('Image reference (for example ghcr.io/user/application:latest)'), '')
try:
return compose_from_image(reference), translate('image itself')
except ConversionError as error:
from .registry_accounts import offer_sign_in
if not (refuses_access(error) and offer_sign_in(ui, reference)):
raise
return compose_from_image(reference), translate('image itself')
@@ -618,6 +624,16 @@ def registry_report(reference: str) -> tuple[bool, str]:
return True, f"{translate('The image is in its registry:')} {', '.join(architectures)}"
def _registry_refused(reference: str) -> bool:
"""Whether the registry answered that the image needs an account."""
try:
result = subprocess.run(['skopeo', 'inspect', '--raw', f'docker://{reference}'],
capture_output=True, text=True, check=False, timeout=120)
except (OSError, subprocess.TimeoutExpired):
return False
return result.returncode != 0 and refuses_access(result.stderr)
def describe(template: dict[str, Any]) -> str:
"""What the translation understood, in the words of the installer, with
everything that changes how the container is created."""
@@ -728,7 +744,12 @@ def explore(ui) -> None:
template = template_from_compose(text)
title = translate('Image that is not in the catalog')
summary = describe(template) + (describe_oci_compose(template) if written else '')
available, report = registry_report(template['container_contract']['image']['reference'])
reference = template['container_contract']['image']['reference']
available, report = registry_report(reference)
if not available and _registry_refused(reference):
from .registry_accounts import offer_sign_in
if offer_sign_in(ui, reference, title):
available, report = registry_report(reference)
summary += '\n\n' + report
if notes:
summary += '\n\n' + '\n'.join(notes)
+29 -1
View File
@@ -200,7 +200,7 @@ def registry_accounts_menu(ui, engine=ENGINE_ROOT, auth=None):
'Basic credentials are base64 encoded, not encrypted.\n'
'Credential helpers use their own storage.\n\n'
'Use an access token with permission to pull images.\n'
'Configure credentials on each node that downloads images.').format(path=auth.path), title)
'Every node of the cluster uses the accounts saved here.').format(path=auth.path), title)
elif choice in {'add', 'login'}:
registry = row['registry'].split('/', 1)[0] if row else ui.ask(translate('Registry hostname'), 'ghcr.io')
try:
@@ -280,3 +280,31 @@ def open_registry_accounts(ui):
registry_accounts_menu(ui)
except (RegistryError, OSError, ValueError) as error:
ui.message(clean(error, 600), translate('Registry accounts'))
def offer_sign_in(ui, reference, title=None):
"""When a registry refuses an image, an account for it can be added on the
spot; the image is then read again with it."""
try:
registry = validate_registry(registry_of(reference))
except RegistryError:
return False
question = translate('{registry} refused access to this image:\n{reference}\n\n'
'If the image is private, sign in with an account that can pull it.\n\n'
'Sign in now?').format(registry=registry, reference=clean(reference, 300))
if not ui.confirm(question, True, title=title):
return False
cancelled = importlib.import_module('proxmenux_oci.ui').UserCancelled
try:
require_root()
username = ui.ask(translate('Username'))
password = ui.password(translate('Password / access token (image pull permission)'))
ui.info(translate('Verifying registry access. Please wait...'))
RegistryAuth().login(registry, username, password)
del password
except cancelled:
return False
except (RegistryError, OSError, ValueError) as error:
ui.message(clean(error, 600), title)
return False
return True
+21 -4
View File
@@ -33,6 +33,13 @@ import tempfile
from .i18n import translate
ANSI = re.compile(r'\x1b\][^\x07]*(?:\x07|\x1b\\)|\x1b\[[0-?]*[ -/]*[@-~]')
# Where Proxmox keeps its own storage passwords: readable only by root and
# shared by every node of the cluster.
CLUSTER_AUTH_FILE = Path('/etc/pve/priv/proxmenux/registry-auth.json')
ACCESS_REFUSED = ('unauthorized', 'authentication required', 'denied', 'forbidden', 'invalid username',
'invalid password', 'invalid credentials', 'username/password',
'statuscode: 401', 'statuscode: 403', 'status code from registry 401',
'status code from registry 403')
class RegistryError(RuntimeError):
@@ -120,6 +127,19 @@ def validate_image(value):
return value
def use_cluster_auth_file(environment=os.environ):
"""ProxMenux keeps its registry accounts in the cluster filesystem, so
every node installs and updates private images with them."""
if not environment.get('REGISTRY_AUTH_FILE') and os.path.ismount(CLUSTER_AUTH_FILE.parents[2]):
environment['REGISTRY_AUTH_FILE'] = str(CLUSTER_AUTH_FILE)
def refuses_access(error) -> bool:
"""Whether a registry error says the image needs an account."""
detail = str(error).casefold()
return any(word in detail for word in ACCESS_REFUSED)
def registry_error(registry, error='', login=False):
"""Classify errors without echoing registry-controlled text or a token."""
detail = str(error).casefold()
@@ -133,10 +153,7 @@ def registry_error(registry, error='', login=False):
'statuscode: 504', 'status code: 504', 'status: 504',
'internal server error', 'service unavailable', 'bad gateway')):
return translate('{registry} reported a server error. Try again later.').format(registry=registry)
if any(word in detail for word in ('unauthorized', 'authentication required', 'denied', 'forbidden', 'invalid username',
'invalid password', 'invalid credentials', 'username/password',
'statuscode: 401', 'statuscode: 403', 'status code from registry 401',
'status code from registry 403')):
if refuses_access(detail):
return (translate('Authentication failed for {registry}. Check the account and token permissions.').format(registry=registry) if login else
translate('Access denied by {registry}. Check the image name and sign in from Registry accounts.').format(registry=registry))
if any(word in detail for word in ('http response to https client',
+145
View File
@@ -0,0 +1,145 @@
"""Registry accounts are kept for the whole cluster, offered when a registry
refuses an image, and read by every program that downloads images."""
from pathlib import Path
import re
import sys
from types import SimpleNamespace
import unittest
from unittest.mock import MagicMock, patch
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT / "src"))
from proxmenux_oci import custom, registry_accounts, registry_auth
from proxmenux_oci.ui import UserCancelled
CLUSTER_FILE = "/etc/pve/priv/proxmenux/registry-auth.json"
GHCR_PRIVATE = ('time="2026-10-16T18:06:24+02:00" level=fatal msg="Error parsing image name '
'\\"docker://ghcr.io/macrimi/private-test:latest\\": Requesting bearer token: '
'invalid status code from registry 403 (Forbidden)"')
HUB_PRIVATE = 'reading manifest latest in docker.io/macrimi/private-test: requested access to the resource is denied'
class FakeUI:
def __init__(self, answers=(), confirms=(True,)):
self.answers = list(answers)
self.confirms = list(confirms)
self.messages = []
def ask(self, text, default=None, required=True):
answer = self.answers.pop(0)
if answer is UserCancelled:
raise UserCancelled(text)
return answer
def password(self, text, required=True):
return self.answers.pop(0)
def confirm(self, text, default=False, title=None):
return self.confirms.pop(0)
def info(self, text, title=None):
pass
def message(self, text, title=None):
self.messages.append(text)
class ClusterFile(unittest.TestCase):
def test_the_cluster_file_is_used_when_the_cluster_filesystem_is_mounted(self):
environment = {}
with patch.object(registry_auth.os.path, "ismount", return_value=True):
registry_auth.use_cluster_auth_file(environment)
self.assertEqual(environment, {"REGISTRY_AUTH_FILE": CLUSTER_FILE})
def test_nothing_is_chosen_without_the_cluster_filesystem(self):
environment = {}
with patch.object(registry_auth.os.path, "ismount", return_value=False):
registry_auth.use_cluster_auth_file(environment)
self.assertEqual(environment, {})
def test_a_file_chosen_by_the_user_is_kept(self):
environment = {"REGISTRY_AUTH_FILE": "/root/own.json"}
with patch.object(registry_auth.os.path, "ismount", return_value=True):
registry_auth.use_cluster_auth_file(environment)
self.assertEqual(environment, {"REGISTRY_AUTH_FILE": "/root/own.json"})
def test_the_accounts_menu_reads_and_writes_the_cluster_file(self):
with patch.dict(registry_auth.os.environ, {"REGISTRY_AUTH_FILE": CLUSTER_FILE}):
self.assertEqual(str(registry_auth.RegistryAuth().path), CLUSTER_FILE)
class RefusedAccess(unittest.TestCase):
def test_a_refusal_is_told_apart_from_other_failures(self):
for text in (GHCR_PRIVATE, HUB_PRIVATE, "unauthorized: authentication required"):
self.assertTrue(registry_auth.refuses_access(text), text)
for text in ("dial tcp: lookup ghcr.io: no such host", "manifest unknown", ""):
self.assertFalse(registry_auth.refuses_access(text), text)
def test_the_classifier_still_names_the_refusal(self):
self.assertIn("Access denied by ghcr.io", registry_auth.registry_error("ghcr.io", GHCR_PRIVATE))
class SignInFromTheImporter(unittest.TestCase):
def sign_in(self, ui, login=None):
auth = MagicMock()
if login:
auth.login.side_effect = login
with patch.object(registry_accounts, "require_root"), \
patch.object(registry_accounts, "RegistryAuth", return_value=auth):
result = registry_accounts.offer_sign_in(ui, "ghcr.io/macrimi/app:latest", "Title")
return result, auth
def test_an_accepted_account_is_saved(self):
ui = FakeUI(["macrimi", "ghp_secret"])
result, auth = self.sign_in(ui)
self.assertTrue(result)
auth.login.assert_called_once_with("ghcr.io", "macrimi", "ghp_secret")
def test_a_declined_offer_asks_nothing(self):
ui = FakeUI([], confirms=[False])
result, auth = self.sign_in(ui)
self.assertFalse(result)
auth.login.assert_not_called()
def test_a_cancelled_question_returns_without_signing_in(self):
ui = FakeUI([UserCancelled])
result, auth = self.sign_in(ui)
self.assertFalse(result)
auth.login.assert_not_called()
def test_a_refused_account_is_explained(self):
ui = FakeUI(["macrimi", "wrong"])
refused = registry_auth.RegistryError("Authentication failed for ghcr.io.")
result, _ = self.sign_in(ui, login=refused)
self.assertFalse(result)
self.assertEqual(ui.messages, ["Authentication failed for ghcr.io."])
def test_a_refused_image_is_checked_again_after_signing_in(self):
compose = "services:\n app:\n image: ghcr.io/macrimi/app:latest\n"
reports = iter([(False, "Could not inspect the image in its registry"), (True, "The image is in its registry")])
ui = SimpleNamespace(message=lambda *a, **k: None, review=lambda *a, **k: False)
with patch.object(custom, "read_definition", return_value=(compose, "pasted Compose file")), \
patch.object(custom, "registry_report", side_effect=lambda _: next(reports)) as report, \
patch.object(custom, "_registry_refused", return_value=True), \
patch.object(registry_accounts, "offer_sign_in", return_value=True) as offer:
custom.explore(ui)
offer.assert_called_once()
self.assertEqual(report.call_count, 2)
class EveryImageReaderUsesTheAccounts(unittest.TestCase):
def test_every_program_that_runs_skopeo_reads_the_cluster_file(self):
readers = [path for path in sorted((ROOT / "remote").iterdir())
if path.suffix in {".sh", ".py"}
and re.search(r"skopeo['\",]*\s+(inspect|copy)|'skopeo',\s*'(inspect|copy)'", path.read_text())]
self.assertGreaterEqual(len(readers), 7)
for path in readers:
with self.subTest(path=path.name):
self.assertIn(CLUSTER_FILE, path.read_text())
self.assertIn("_use_cluster_auth_file()", (ROOT / "src/proxmenux_oci/__init__.py").read_text())
if __name__ == "__main__":
unittest.main()
@@ -607,6 +607,22 @@ hb_prepare_staging() {
(( jobs_covered )) || paths+=("$HB_BACKUP_JOBS_DIR")
fi
# The logins to private image registries are needed to update the
# applications installed from them, whatever the profile selects.
local registry_logins=/etc/pve/priv/proxmenux/registry-auth.json
if [[ -e "$registry_logins" ]]; then
local logins_covered=0 candidate normalized
for candidate in "${paths[@]}"; do
normalized="${candidate%/}"
[[ -z "$normalized" ]] && normalized="/"
if [[ "$registry_logins" == "$normalized" || "$registry_logins" == "$normalized"/* ]]; then
logins_covered=1
break
fi
done
(( logins_covered )) || paths+=("$registry_logins")
fi
rm -rf "$staging_root"
mkdir -p "$staging_root/rootfs" "$staging_root/metadata"
+6
View File
@@ -45,6 +45,7 @@
# 6 post-update restart failed
# 7 another ProxMenux update is already running for this CT
# 8 started CT could not record its verification handoff identity
# 9 scheduled run skipped because the CT was intentionally stopped
#
# The frontend surfaces exit code + duration in a follow-up POST to
# /api/lxc-updates/<vmid>/applied so the notification event fires with
@@ -163,6 +164,11 @@ fi
# 2) CT must be running for pct exec. Auto-start stopped CTs, then
# restore their original stopped state on every exit path.
STATE=$(pct status "$VMID" | awk '{print $2}')
if [[ "$STATE" != "running" && "${EXECUTION_MODE:-}" == "scheduled" ]]; then
[[ -n "${SCHEDULED_STOPPED_MARKER:-}" ]] && printf '%s\n' "$SCHEDULED_STOPPED_MARKER"
echo "SKIPPED: CT $VMID is stopped; a scheduled update will not start it."
exit 9
fi
STARTED_BY_PROXMENUX=0
OBSERVATION_ATTEMPTED=0
capture_before_stop() {
+11
View File
@@ -82,6 +82,16 @@ remove_monitor_notification_target() {
echo " - Notification target removed from Proxmox"
}
# The logins to private image registries go with ProxMenux. /etc/pve is shared
# by the cluster, so the other nodes lose them too.
remove_registry_logins() {
mountpoint -q /etc/pve || return 0
[[ -f /etc/pve/priv/proxmenux/registry-auth.json ]] || return 0
pmx_record_execution "Remove private registry logins" "rm -f /etc/pve/priv/proxmenux/registry-auth.json"
rm -f /etc/pve/priv/proxmenux/registry-auth.json /etc/pve/priv/proxmenux/.registry-auth.json.proxmenux.lock
rmdir /etc/pve/priv/proxmenux 2>/dev/null || true
}
uninstall_proxmenux_monitor() {
# 1. Stop service if it is running
@@ -809,6 +819,7 @@ uninstall_proxmenu() {
pmx_remove_file "$INSTALL_DIR/$MENU_SCRIPT"
pmx_record_execution "Remove ProxMenux application directory" "rm -rf $BASE_DIR"
rm -rf "$BASE_DIR"
remove_registry_logins
# Remove selected dependencies
if [ -n "$deps_to_remove" ]; then
+9
View File
@@ -162,6 +162,15 @@ run_case stopped_restore RUN_HELPER=0 UPDATE_COMMAND='update-custom' MOCK_INITIA
[[ $(count 'pct start 101') -eq 1 ]] || fail "stopped CT was not started exactly once"
[[ $(count 'pct shutdown 101 --timeout 60') -eq 1 ]] || fail "stopped CT state was not restored"
run_case scheduled_stopped RUN_HELPER=0 UPDATE_COMMAND='update-custom' \
EXECUTION_MODE=scheduled SCHEDULED_STOPPED_MARKER='fixture-stopped-marker' MOCK_INITIAL_STATE=stopped
[[ $CASE_RC -eq 9 ]] || fail "scheduled_stopped returned $CASE_RC"
[[ $(count 'pct start 101') -eq 0 ]] || fail "scheduled update started a stopped CT"
[[ $(count 'pct exec') -eq 0 ]] || fail "scheduled update executed inside a stopped CT"
[[ $(count CUSTOM_EXEC) -eq 0 ]] || fail "scheduled update ran a custom updater"
grep -qF 'fixture-stopped-marker' "$TEST_ROOT/scheduled_stopped.out" \
|| fail "scheduled stopped result did not include its marker"
run_case locked RUN_HELPER=0 UPDATE_COMMAND='update-custom' MOCK_FLOCK_FAIL=1
[[ $CASE_RC -eq 7 ]] || fail "locked expected 7, got $CASE_RC"
[[ $(count CUSTOM_EXEC) -eq 0 ]] || fail "locked run executed an updater"
+9 -3
View File
@@ -78,7 +78,7 @@ function walk(node) {
if (ts.isVariableDeclaration(node)) {
const name = node.name.getText(tree)
if (wanted.has(name)) definitions.push(`const ${node.getText(tree)};`)
if (["applySchedulePayload", "loadSchedule", "loadBulkUpdate"].includes(name))
if (["LEGACY_STOPPED_SCHEDULE_REASONS", "scheduleReasonCodeFromPersisted", "applySchedulePayload", "loadSchedule", "loadBulkUpdate"].includes(name))
preferenceDefinitions.push(`const ${node.getText(tree)};`)
if (["osUpdateStale", "osUpdateStatusKnown", "hasOsUpdates"].includes(name))
status.push(`const ${node.getText(tree)};`)
@@ -325,11 +325,11 @@ context.selectedVMRef.current = { vmid: 100 }
}
for (const name of ["ScheduleEnabled", "ScheduleConfigured", "ScheduleCron", "SchedulePreset",
"ScheduleTarget", "ScheduleTargets", "ScheduleReleaseDelayDays", "ApplyBackup", "ApplyBackupStorage",
"ApplyRestart", "ScheduleLastRunAt", "ScheduleLastRunStatus", "ScheduleLastRunReason", "ScheduleLastRunLog",
"ApplyRestart", "ScheduleLastRunAt", "ScheduleLastRunStatus", "ScheduleLastRunReason", "ScheduleLastRunReasonCode", "ScheduleLastRunLog",
"ScheduleLastRunRebootRequired", "ScheduleLastRunRebootPackages", "ExternalCron", "ScheduleError",
"ScheduleLoaded", "BulkError", "BulkLoaded", "BulkEditMode", "BulkConfigured", "BulkTargets", "BulkPersistedTargets"])
preferenceContext[`set${name}`] = value => { preferenceState[name] = value }
assert.equal(preferenceDefinitions.length, 3)
assert.equal(preferenceDefinitions.length, 5)
const preferences = compile(preferenceDefinitions.join("\n") + `
exports.apply = applySchedulePayload; exports.schedule = loadSchedule; exports.bulk = loadBulkUpdate;
`, preferenceContext)
@@ -340,6 +340,12 @@ context.selectedVMRef.current = { vmid: 100 }
assert.equal(preferenceState.ApplyRestart, false, "missing restart cannot inherit a reboot")
preferences.apply({ backup: false, backup_storage: "", restart: false })
assert.equal(preferenceState.ApplyBackupStorage, "")
preferences.apply({ last_run_reason_code: "stopped_container", last_run_reason: "raw stopped reason" })
assert.equal(preferenceState.ScheduleLastRunReasonCode, "stopped_container",
"schedule payload publishes its structured stopped reason")
preferences.apply({})
assert.equal(preferenceState.ScheduleLastRunReasonCode, null,
"a missing reason code cannot leak from the previously selected guest")
preferenceContext.vmModalCacheRef.current.schedule.set(213, { backup: true, backup_storage: "local", restart: true })
const previousSchedule = preferences.schedule(213)
assert.equal(preferenceState.ApplyBackup, true, "use only the selected guest's own cache")
@@ -0,0 +1,102 @@
// Execute the real scheduled-run detail JSX: a known backend reason code is
// localized, while an unknown/missing code keeps its raw diagnostic text.
const assert = require('node:assert/strict')
const fs = require('node:fs')
const path = require('node:path')
const vm = require('node:vm')
const root = path.resolve(__dirname, '../../AppImage')
const ts = require(path.join(root, 'node_modules/typescript'))
const source = fs.readFileSync(path.join(root, 'components/virtual-machines.tsx'), 'utf8')
const tree = ts.createSourceFile('vm.tsx', source, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX)
let declaration
let legacyReasons
let reasonCodeHelper
function walk(node) {
if (ts.isVariableDeclaration(node) && node.name.getText(tree) === 'renderScheduleRunDetails') declaration = node.getText(tree)
if (ts.isVariableDeclaration(node) && node.name.getText(tree) === 'LEGACY_STOPPED_SCHEDULE_REASONS') legacyReasons = node.getText(tree)
if (ts.isVariableDeclaration(node) && node.name.getText(tree) === 'scheduleReasonCodeFromPersisted') reasonCodeHelper = node.getText(tree)
ts.forEachChild(node, walk)
}
walk(tree)
assert(declaration, 'scheduled run detail renderer must exist')
assert(legacyReasons, 'legacy stopped-reason list must exist')
assert(reasonCodeHelper, 'persisted schedule reason-code helper must exist')
function compile(context) {
const result = ts.transpileModule(`const ${declaration}; exports.render = renderScheduleRunDetails;`, {
compilerOptions: { target: ts.ScriptTarget.ES2020, module: ts.ModuleKind.CommonJS, jsx: ts.JsxEmit.ReactJSX },
reportDiagnostics: true,
})
assert.equal(result.diagnostics.length, 0)
vm.runInNewContext(result.outputText, context)
return context.exports.render
}
function compileReasonCodeHelper() {
const result = ts.transpileModule(`const ${legacyReasons}; const ${reasonCodeHelper}; exports.reasonCode = scheduleReasonCodeFromPersisted;`, {
compilerOptions: { target: ts.ScriptTarget.ES2020, module: ts.ModuleKind.CommonJS },
reportDiagnostics: true,
})
assert.equal(result.diagnostics.length, 0)
const context = { exports: {}, Set }
vm.runInNewContext(result.outputText, context)
return context.exports.reasonCode
}
function flattenText(node) {
if (Array.isArray(node)) return node.map(flattenText).join(' ')
if (!node || typeof node !== 'object') return typeof node === 'string' ? node : ''
return flattenText(node.props?.children)
}
const persistedReasonCode = compileReasonCodeHelper()
assert.equal(persistedReasonCode('stopped_container', 'anything'), 'stopped_container')
assert.equal(persistedReasonCode(null, 'Container is stopped; scheduled update was skipped'), 'stopped_container')
assert.equal(persistedReasonCode(null, 'container was stopped before scheduled update could begin'), 'stopped_container')
assert.equal(persistedReasonCode('future_reason', 'raw diagnostic'), 'future_reason')
assert.equal(persistedReasonCode(null, 'raw diagnostic'), null)
for (const locale of ['en', 'sk']) {
const messages = JSON.parse(fs.readFileSync(path.join(root, `messages/${locale}/common.json`), 'utf8'))
const t = (key, variables = {}) => {
const message = key.split('.').reduce((value, part) => value?.[part], messages)
return String(message ?? key).replace(/\{([^}]+)\}/g, (_, name) => String(variables[name] ?? `{${name}}`))
}
const context = {
exports: {}, t, selectedVM: { vmid: 100, status: 'stopped' }, scheduleLastRunAt: '2026-10-16T05:10:02Z',
scheduleLastRunStatus: 'skipped', scheduleLastRunReasonCode: 'stopped_container',
scheduleLastRunReason: 'container is stopped; scheduled update was skipped',
scheduleLastRunRebootRequired: false, scheduleLastRunRebootPackages: [], scheduleLastRunLog: null,
openScheduleLog() {}, AlertTriangle: 'AlertTriangle', FileText: 'FileText',
require: () => ({ jsx: (type, props) => ({ type, props }), jsxs: (type, props) => ({ type, props }), Fragment: 'Fragment' }),
}
const render = compile(context)
const translated = flattenText(render(true))
const expectedCurrentReason = t('vmLxc.scheduled.reasonStoppedContainer')
const expectedHistoricalReason = t('vmLxc.scheduled.reasonStoppedContainerHistorical')
const skippedLabel = t('vmLxc.scheduled.runSkippedStatus')
const expectedCurrentText = locale === 'sk'
? 'Kontajner je vypnutý; plánovaná aktualizácia sa preskočila.'
: 'Container is stopped; scheduled update was skipped.'
const expectedHistoricalText = locale === 'sk'
? 'Kontajner bol v čase plánovanej aktualizácie vypnutý.'
: 'Container was stopped at the scheduled update time.'
assert.equal(expectedCurrentReason, expectedCurrentText,
`${locale}: stopped CT must describe its current stopped state`)
assert.equal(expectedHistoricalReason, expectedHistoricalText,
`${locale}: running CT must describe the stopped state at the prior scheduled run`)
assert(translated.includes(expectedCurrentReason), `${locale}: currently stopped CT must use the present-state catalog`)
assert(!translated.includes(expectedHistoricalReason), `${locale}: currently stopped CT must not use historical wording`)
assert(translated.includes(skippedLabel), `${locale}: skipped run must not claim that no updates are pending`)
assert(!translated.includes(context.scheduleLastRunReason), `${locale}: raw stopped reason must not leak into UI`)
context.selectedVM.status = 'running'
const historical = flattenText(render(true))
assert(historical.includes(expectedHistoricalReason), `${locale}: running CT must use historical wording for a past skipped run`)
assert(!historical.includes(expectedCurrentReason), `${locale}: running CT must not claim it is currently stopped`)
context.scheduleLastRunReasonCode = 'unknown_reason'
const fallback = flattenText(render(true))
assert(fallback.includes(context.scheduleLastRunReason), `${locale}: unknown code must retain the raw diagnostic`)
}
console.log('PASS scheduled reason i18n: EN/SK structured stopped reason and raw fallback')
@@ -119,7 +119,8 @@ raise SystemExit(h.main())
self.write("sleep", "#!/bin/sh\nexit 0\n")
self.write("flock", "#!/bin/sh\nexit 0\n")
names = {"_finalize_lxc_update", "_terminal_lxc_update_completed",
"api_lxc_updates_applied", "_run_scheduled_update"}
"api_lxc_updates_applied", "_run_scheduled_update",
"_scheduled_runner_reported_stopped"}
nodes = [n for n in ast.parse(observed.SERVER.read_text()).body
if isinstance(n, ast.FunctionDef) and n.name in names]
self.scope = self.fixture.scope
@@ -134,6 +135,7 @@ raise SystemExit(h.main())
"_json_list": lambda value: json.loads(value or '[]'),
"_lxc_update_finalizations": {}, "_lxc_update_finalization_lock": threading.RLock(),
"_LXC_UPDATE_FINALIZATION_TTL": 3600,
"_SCHEDULED_STOPPED_EXIT": 9,
"_fast_guest_status": lambda *_: self.state.read_text(),
"_lxc_update_snapshot": lambda *_: {"ct_name": "fixture"},
"_lxc_update_target_labels": lambda *_: ["OS"],
@@ -315,6 +317,7 @@ raise SystemExit(h.main())
self.scope['notification_manager'].emit_event.assert_called_once()
def test_scheduled_path_executes_real_runner_and_real_finalization(self):
self.state.write_text("running")
def run(command, **kwargs):
kwargs['env'].update({key: value for key, value in self.env.items()
if key != 'RUN_ID'})
@@ -322,7 +325,7 @@ raise SystemExit(h.main())
self.scope['subprocess'] = SimpleNamespace(run=run, TimeoutExpired=subprocess.TimeoutExpired)
result = self.scope['_run_scheduled_update'](100, {'targets': ['os'], 'target': 'os'})
self.assertEqual(result['status'], 'success', result)
self.assertEqual(self.state.read_text(), 'stopped')
self.assertEqual(self.state.read_text(), 'running')
self.assertEqual(self.fixture.row()['update_check']['count'], 0)
def test_legacy_cli_without_run_id_preserves_update_and_original_state(self):
+156
View File
@@ -1,4 +1,7 @@
import ast
import json
import os
import re
import sys
import subprocess
import tempfile
@@ -312,6 +315,159 @@ class AppCacheWriteThroughContractTests(unittest.TestCase):
self.assertIn("before_snapshot=before", scheduler_block)
class ScheduledStoppedContainerTests(unittest.TestCase):
@staticmethod
def _worker(scope):
source = ast.parse((REPO_ROOT / "AppImage" / "scripts" / "flask_server.py").read_text())
node = next(item for item in source.body
if isinstance(item, ast.FunctionDef) and item.name == "_run_scheduled_update")
exec(compile(ast.Module(body=[node], type_ignores=[]), "scheduled-update", "exec"), scope)
return scope["_run_scheduled_update"]
@staticmethod
def _stopped_marker_reader(scope):
source = ast.parse((REPO_ROOT / "AppImage" / "scripts" / "flask_server.py").read_text())
node = next(item for item in source.body
if isinstance(item, ast.FunctionDef) and item.name == "_scheduled_runner_reported_stopped")
exec(compile(ast.Module(body=[node], type_ignores=[]), "scheduled-marker", "exec"), scope)
return scope["_scheduled_runner_reported_stopped"]
def test_stopped_container_skips_before_runner_or_any_guest_effect(self):
runner = MagicMock()
finalizer = MagicMock(return_value={"recorded": True})
append_log = MagicMock()
scope = {
"time": SimpleNamespace(monotonic=MagicMock(return_value=10.0)),
"uuid": SimpleNamespace(uuid4=lambda: SimpleNamespace(hex="a" * 32)),
"datetime": __import__("datetime").datetime,
"subprocess": SimpleNamespace(run=runner, STDOUT=object(), TimeoutExpired=subprocess.TimeoutExpired),
"_create_lxc_update_log": lambda _vmid, _run_id: ("fixture.log", "/tmp/fixture.log"),
"_fast_guest_status": MagicMock(return_value="stopped"),
"_normalise_schedule_targets": lambda _sched: ["os"],
"_lxc_update_snapshot": lambda _vmid: {"ct_name": "fixture"},
"_lxc_update_target_labels": lambda *_: ["OS"],
"_append_lxc_update_log": append_log,
"_prune_lxc_update_logs": MagicMock(),
"_finalize_lxc_update": finalizer,
}
outcome = self._worker(scope)(101, {"target": "os"})
self.assertEqual(outcome["status"], "skipped")
self.assertEqual(outcome["executed_targets"], [])
self.assertIn("container is stopped", outcome["reason"])
self.assertEqual(outcome["reason_code"], "stopped_container")
runner.assert_not_called()
self.assertEqual(finalizer.call_args.kwargs["status"], "skipped")
self.assertEqual(finalizer.call_args.kwargs["source"], "scheduled")
def test_stopped_marker_requires_the_scheduler_token_not_only_exit_code(self):
marker = "PROXMENUX_SCHEDULED_STOPPED:fixture"
reader = self._stopped_marker_reader({"_SCHEDULED_STOPPED_EXIT": 9, "os": os})
self.assertTrue(reader(SimpleNamespace(returncode=9, stdout=marker, stderr=""), None, marker))
self.assertFalse(reader(SimpleNamespace(returncode=9, stdout="", stderr=""), None, marker))
self.assertFalse(reader(SimpleNamespace(returncode=8, stdout=marker, stderr=""), None, marker))
self.assertFalse(reader(SimpleNamespace(returncode=4, stdout=marker, stderr=""), None, marker))
with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8") as log:
log.write("prefix\\n" + marker + "\\n")
log.flush()
self.assertTrue(reader(SimpleNamespace(returncode=9, stdout="", stderr=""), log.name, marker))
def test_runner_race_to_stopped_is_reported_as_skipped_without_reboot_probe(self):
runner = MagicMock(return_value=SimpleNamespace(returncode=9, stdout="", stderr=""))
finalizer = MagicMock(return_value={"recorded": True})
reboot_probe = MagicMock()
stopped_marker = MagicMock(return_value=True)
lxc = SimpleNamespace(
_read_sidecar=lambda _vmid: {"apps": []},
partition_scheduled_release_targets=lambda targets, _apps: (set(), targets),
)
scope = {
"time": SimpleNamespace(monotonic=MagicMock(return_value=10.0)),
"uuid": SimpleNamespace(uuid4=lambda: SimpleNamespace(hex="b" * 32)),
"datetime": __import__("datetime").datetime,
"subprocess": SimpleNamespace(run=runner, STDOUT=object(), TimeoutExpired=subprocess.TimeoutExpired),
"os": os,
"json": json,
"_APPLY_UPDATES_SCRIPT": "/bin/true",
"_SCHEDULED_STOPPED_EXIT": 9,
"_DOCKER_ENGINE_INTEGRATED_COMMAND": "integrated-docker",
"_create_lxc_update_log": lambda _vmid, _run_id: (None, None),
"_fast_guest_status": MagicMock(return_value="running"),
"_normalise_schedule_targets": lambda _sched: ["os"],
"_lxc_update_snapshot": lambda _vmid: {"ct_name": "fixture"},
"_lxc_update_target_labels": lambda *_: ["OS"],
"_append_lxc_update_log": MagicMock(),
"_prune_lxc_update_logs": MagicMock(),
"_finalize_lxc_update": finalizer,
"_scheduled_helper_enabled": lambda *_: False,
"_compose_scheduled_update_command": lambda *_: "",
"_inspect_lxc_reboot_requirement": reboot_probe,
"_scheduled_runner_reported_stopped": stopped_marker,
}
with patch.dict(sys.modules, {"lxc_apps": lxc}):
outcome = self._worker(scope)(101, {"target": "os"})
self.assertEqual(outcome["status"], "skipped")
self.assertEqual(outcome["executed_targets"], [])
self.assertIn("before scheduled update could begin", outcome["reason"])
self.assertEqual(outcome["reason_code"], "stopped_container")
self.assertEqual(runner.call_args.args[0], ["bash", "/bin/true"])
self.assertEqual(runner.call_args.kwargs["env"]["EXECUTION_MODE"], "scheduled")
self.assertTrue(runner.call_args.kwargs["env"]["SCHEDULED_STOPPED_MARKER"].startswith(
"PROXMENUX_SCHEDULED_STOPPED:scheduled-"))
stopped_marker.assert_called_once()
reboot_probe.assert_not_called()
stopped_marker.reset_mock()
stopped_marker.return_value = False
runner.return_value = SimpleNamespace(returncode=8, stdout="", stderr="")
reboot_probe.return_value = (None, [], None)
outcome = self._worker(scope)(101, {"target": "os"})
self.assertEqual(outcome["status"], "failure")
self.assertIn("exited with code 8", outcome["reason"])
stopped_marker.assert_called_once()
reboot_probe.assert_called_once()
def test_oci_race_to_stopped_skips_before_the_oci_engine_runs(self):
runner = MagicMock(return_value=SimpleNamespace(returncode=0, stdout="", stderr=""))
finalizer = MagicMock(return_value={"recorded": True})
status = MagicMock(side_effect=["running", "stopped"])
scope = {
"time": SimpleNamespace(monotonic=MagicMock(return_value=10.0)),
"uuid": SimpleNamespace(uuid4=lambda: SimpleNamespace(hex="c" * 32)),
"datetime": __import__("datetime").datetime,
"subprocess": SimpleNamespace(
run=runner,
STDOUT=object(),
DEVNULL=object(),
TimeoutExpired=subprocess.TimeoutExpired,
),
"os": os,
"re": re,
"_create_lxc_update_log": lambda _vmid, _run_id: (None, None),
"_fast_guest_status": status,
"_normalise_schedule_targets": lambda _sched: ["oci_image"],
"_lxc_update_snapshot": lambda _vmid: {"ct_name": "fixture"},
"_lxc_update_target_labels": lambda *_: ["OCI image"],
"_append_lxc_update_log": MagicMock(),
"_prune_lxc_update_logs": MagicMock(),
"_finalize_lxc_update": finalizer,
}
outcome = self._worker(scope)(101, {"targets": ["oci_image"]})
self.assertEqual(outcome["status"], "skipped")
self.assertEqual(outcome["target"], "oci_image")
self.assertEqual(outcome["executed_targets"], [])
self.assertEqual(outcome["reason_code"], "stopped_container")
self.assertIn("before scheduled update could begin", outcome["reason"])
self.assertEqual(status.call_count, 2)
runner.assert_not_called()
self.assertEqual(finalizer.call_args.kwargs["status"], "skipped")
class DockerStackNotificationTests(unittest.TestCase):
def _docker_app(self):
return {
@@ -37,6 +37,7 @@ def routes():
_lxc_update_target_labels=lambda *_: [],
_append_lxc_update_log=lambda *_: None,
_prune_lxc_update_logs=lambda *_: None,
_scheduled_runner_reported_stopped=lambda *_: False,
_finalize_lxc_update=Mock(return_value={}),
_inspect_lxc_reboot_requirement=lambda *_, **__: (False, [], None))
exec(compile(ast.Module(body=nodes, type_ignores=[]), 'update-routes', 'exec'), ns)
@@ -29,12 +29,12 @@
"table": {
"headers": ["Option", "What it reads"],
"rows": [
["Paste its Compose file in the terminal", "The YAML is pasted in the terminal and ends with Ctrl+D on an empty line."],
["Paste its Compose file in the terminal", "The YAML is pasted in the terminal and ends with Ctrl+D."],
["Read its Compose file from a file of this host", "A path on the node, <code>/root/docker-compose.yml</code> by default. The file must exist and be at most 256 KiB."],
["Download its Compose file from an address", "An <code>http://</code> or <code>https://</code> address that serves the raw YAML. At most 256 KiB are downloaded."],
["Paste its docker run command in the terminal", "The command published by the project. Ports, environment, volumes, devices, capabilities, user, shared memory and the other supported options are translated."],
["Only the image reference, with no Compose file", "A reference such as <code>ghcr.io/user/application:latest</code>. The registry is queried and the OCI metadata of the image is kept."],
["Paste an oci-compose in the terminal", "The JSON is pasted in the terminal and ends with Ctrl+D on an empty line. It is not translated: it is checked and installed as it is written."],
["Paste an oci-compose in the terminal", "The JSON is pasted in the terminal and ends with Ctrl+D. It is not translated: it is checked and installed as it is written."],
["Read an oci-compose from a file of this host", "A JSON file on the node, <code>/root/oci-compose.json</code> by default, of at most 2 MiB."],
["Download an oci-compose from an address", "An <code>http://</code> or <code>https://</code> address that serves the JSON file. At most 2 MiB are downloaded."]
]
@@ -76,7 +76,7 @@
"steps": {
"items": [
{ "title": "Analyse", "body": "Services, image, ports, paths, environment, devices, security and healthcheck are read." },
{ "title": "Query the registry", "body": "The image must exist in a public registry, and its published architectures are listed." },
{ "title": "Query the registry", "body": "The image must exist in its registry, and its published architectures are listed. A private registry is read with the account saved for it." },
{ "title": "List what is not applied", "body": "Labels, Docker networks, Swarm settings and other keys that have no effect on an LXC are listed." },
{ "title": "Block what cannot be translated", "body": "A key with no safe equivalent is shown under <strong>What cannot be translated</strong> and the installation does not continue. Nothing is dropped silently." },
{ "title": "Ask for secrets", "body": "Variables whose names read as a password, token or key become sensitive questions of the installation." }
@@ -152,6 +152,38 @@
}
]
},
{
"id": "private-registries",
"title": "Images in private registries",
"intro": "An image in a private registry, such as a private package on GitHub or a private repository on Docker Hub, is read with an account saved in ProxMenux.",
"blocks": [
{
"steps": {
"items": [
{ "title": "The registry refuses the image", "body": "When the registry answers that the image needs an account, the review offers to sign in to that registry and reads the image again." },
{ "title": "Sign in", "body": "A user and a password or access token that can pull the image. The registry checks them, and they are saved only if it accepts them." },
{ "title": "Install and keep up to date", "body": "The installation downloads the image with that account, and so do updates, Modify, Recreate, the watchdog and the update check of the Monitor, on any node of the cluster." }
]
}
},
{ "p": "<strong>Registry accounts</strong>, in the main menu of OCI manager Apps, lists the saved accounts by registry and user, never their secret. From each account an image can be checked, downloaded or installed, and the account updated or removed." },
{
"list": {
"items": [
"GitHub (<code>ghcr.io</code>): the user is the GitHub account, and the password a personal access token with the <code>read:packages</code> permission.",
"Docker Hub (<code>docker.io</code>): the user is the Docker Hub account, and the password an access token with read permission.",
"Other registries, including one with its own port such as <code>registry.example.com:5000</code>: the user and password or token that registry gives."
]
}
},
{
"calloutInfo": {
"title": "Where the accounts are kept",
"body": "In <code>/etc/pve/priv/proxmenux/registry-auth.json</code>, readable only by root, in the same folder where Proxmox keeps its storage passwords. <code>/etc/pve</code> is shared by every node of the cluster, so an account added on one node is used on all of them. The host backup includes it, and uninstalling ProxMenux removes it from every node."
}
}
]
},
{
"id": "limits",
"title": "Definitions that are not installed",
@@ -159,7 +191,6 @@
{
"list": {
"items": [
"Images in private registries: registry credentials are not requested.",
"A Dockerfile without a published image: the image has to be built and published in an OCI registry first.",
"A Compose file with several services: it is blocked because it describes more than one image. This option installs a single container.",
"<code>configs</code>, external secrets or device formats that cannot be translated unambiguously.",
@@ -41,6 +41,7 @@
"<strong>Search applications</strong> — search by name across the catalog.",
"<strong>All applications</strong> — the complete catalog, with the number of applications.",
"<strong>Manage installed OCI applications</strong> — update, modify, remove or recover what was installed.",
"<strong>Registry accounts</strong> — the accounts used to install and update images from private registries.",
"<strong>Install an image that is not in the catalog</strong> — translate a Compose file, a <code>docker run</code> command or an image reference.",
"The catalog categories, each with its number of applications."
]
@@ -29,12 +29,12 @@
"table": {
"headers": ["Opción", "Qué lee"],
"rows": [
["Pegar su archivo Compose en la terminal", "El YAML se pega en la terminal y termina con Ctrl+D en una línea vacía."],
["Pegar su archivo Compose en la terminal", "El YAML se pega en la terminal y termina con Ctrl+D."],
["Leer su archivo Compose desde un archivo de este host", "Una ruta del nodo, <code>/root/docker-compose.yml</code> por defecto. El archivo debe existir y ocupar como máximo 256 KiB."],
["Descargar su archivo Compose desde una dirección", "Una dirección <code>http://</code> o <code>https://</code> que sirva el YAML sin procesar. Se descargan como máximo 256 KiB."],
["Pegar su comando docker run en la terminal", "El comando que publica el proyecto. Se traducen puertos, entorno, volúmenes, dispositivos, capacidades, usuario, memoria compartida y el resto de opciones admitidas."],
["Solo la referencia de la imagen, sin archivo Compose", "Una referencia como <code>ghcr.io/user/application:latest</code>. Se consulta el registro y se conservan los metadatos OCI de la imagen."],
["Pegar un oci-compose en la terminal", "El JSON se pega en la terminal y termina con Ctrl+D en una línea vacía. No se traduce: se comprueba y se instala tal como está escrito."],
["Pegar un oci-compose en la terminal", "El JSON se pega en la terminal y termina con Ctrl+D. No se traduce: se comprueba y se instala tal como está escrito."],
["Leer un oci-compose desde un archivo de este host", "Un archivo JSON del nodo, <code>/root/oci-compose.json</code> por defecto, de 2 MiB como máximo."],
["Descargar un oci-compose desde una dirección", "Una dirección <code>http://</code> o <code>https://</code> que sirva el archivo JSON. Se descargan como máximo 2 MiB."]
]
@@ -76,7 +76,7 @@
"steps": {
"items": [
{ "title": "Analizar", "body": "Se leen servicios, imagen, puertos, rutas, entorno, dispositivos, seguridad y healthcheck." },
{ "title": "Consultar el registro", "body": "La imagen debe existir en un registro público, y se enumeran las arquitecturas que publica." },
{ "title": "Consultar el registro", "body": "La imagen debe existir en su registro, y se enumeran las arquitecturas que publica. Un registro privado se lee con la cuenta guardada para él." },
{ "title": "Enumerar lo que no se aplica", "body": "Se enumeran las etiquetas, las redes Docker, los ajustes de Swarm y el resto de claves que no tienen efecto en un LXC." },
{ "title": "Bloquear lo que no puede traducirse", "body": "Una clave sin equivalencia segura aparece en <strong>Lo que no puede traducirse</strong> y la instalación no continúa. Nada se descarta en silencio." },
{ "title": "Pedir los secretos", "body": "Las variables cuyo nombre corresponde a una contraseña, un token o una clave se convierten en preguntas sensibles de la instalación." }
@@ -152,6 +152,38 @@
}
]
},
{
"id": "private-registries",
"title": "Imágenes en registros privados",
"intro": "Una imagen en un registro privado, como un paquete privado de GitHub o un repositorio privado de Docker Hub, se lee con una cuenta guardada en ProxMenux.",
"blocks": [
{
"steps": {
"items": [
{ "title": "El registro rechaza la imagen", "body": "Cuando el registro responde que la imagen necesita una cuenta, la revisión ofrece iniciar sesión en ese registro y vuelve a leer la imagen." },
{ "title": "Iniciar sesión", "body": "Un usuario y una contraseña o un token de acceso que puedan descargar la imagen. El registro los comprueba y solo se guardan si los acepta." },
{ "title": "Instalar y mantener al día", "body": "La instalación descarga la imagen con esa cuenta, y también las actualizaciones, Modificar, Recrear, la vigilancia y la comprobación de actualizaciones del Monitor, en cualquier nodo del clúster." }
]
}
},
{ "p": "<strong>Cuentas de registro</strong>, en el menú principal de OCI manager Apps, lista las cuentas guardadas por registro y usuario, nunca su secreto. Desde cada cuenta se puede comprobar, descargar o instalar una imagen, y actualizar o eliminar la cuenta." },
{
"list": {
"items": [
"GitHub (<code>ghcr.io</code>): el usuario es la cuenta de GitHub, y la contraseña un token de acceso personal con el permiso <code>read:packages</code>.",
"Docker Hub (<code>docker.io</code>): el usuario es la cuenta de Docker Hub, y la contraseña un token de acceso con permiso de lectura.",
"Otros registros, también uno con su propio puerto como <code>registry.example.com:5000</code>: el usuario y la contraseña o token que da ese registro."
]
}
},
{
"calloutInfo": {
"title": "Dónde se guardan",
"body": "En <code>/etc/pve/priv/proxmenux/registry-auth.json</code>, legible solo por root, en la misma carpeta donde Proxmox guarda las contraseñas de sus almacenamientos. <code>/etc/pve</code> lo comparten todos los nodos del clúster, así que una cuenta añadida en un nodo se usa en todos. El backup del host lo incluye, y al desinstalar ProxMenux se elimina de todos los nodos."
}
}
]
},
{
"id": "limits",
"title": "Definiciones que no se instalan",
@@ -159,7 +191,6 @@
{
"list": {
"items": [
"Imágenes en registros privados: no se piden credenciales del registro.",
"Un Dockerfile sin imagen publicada: la imagen debe construirse y publicarse antes en un registro OCI.",
"Un archivo Compose con varios servicios: queda bloqueado porque describe más de una imagen. Esta opción instala un único contenedor.",
"<code>configs</code>, secretos externos o formatos de dispositivo que no pueden traducirse sin ambigüedad.",
@@ -41,6 +41,7 @@
"<strong>Buscar aplicaciones</strong>: búsqueda por nombre en todo el catálogo.",
"<strong>Todas las aplicaciones</strong>: el catálogo completo, con el número de aplicaciones.",
"<strong>Gestionar aplicaciones OCI instaladas</strong>: actualizar, modificar, eliminar o recuperar lo instalado.",
"<strong>Cuentas de registro</strong>: las cuentas con las que se instalan y actualizan imágenes de registros privados.",
"<strong>Instalar una imagen que no está en el catálogo</strong>: traducción de un archivo Compose, un comando <code>docker run</code> o una referencia de imagen.",
"Las categorías del catálogo, cada una con su número de aplicaciones."
]