diff --git a/.github/scripts/tests/test_oci_custom_registry_localization.py b/.github/scripts/tests/test_oci_custom_registry_localization.py new file mode 100644 index 00000000..10d9760b --- /dev/null +++ b/.github/scripts/tests/test_oci_custom_registry_localization.py @@ -0,0 +1,268 @@ +"""Exercise the native custom-image and registry UI with the real EN/SK lookup.""" +import json +from pathlib import Path +import runpy +import sys +import tempfile +from types import SimpleNamespace +import unittest +from unittest.mock import MagicMock, patch + +ROOT = Path(__file__).resolve().parents[3] +sys.path.insert(0, str(ROOT / 'oci/src')) +from proxmenux_oci import custom, i18n, registry_accounts as accounts, registry_auth as auth +from proxmenux_oci.ui import UserCancelled + +COMPOSE = 'services:\n app:\n image: ghcr.io/owner/app:latest\n' + + +class UI: + def __init__(self, choices=(), answers=(), confirms=()): + self.choices = iter(choices) + self.answers = iter(answers) + self.confirms = iter(confirms) + self.seen = [] + + def choose(self, text, options, default=None, **kwargs): + self.seen.append((text, options, kwargs)) + return next(self.choices) + + def ask(self, text, default=None, **kwargs): + self.seen.append(text) + return next(self.answers) + + def password(self, text): + self.seen.append(text) + raise UserCancelled(text) + + def confirm(self, text, default=False, **kwargs): + self.seen.append((text, default)) + return next(self.confirms) + + def review(self, text, title=None, **kwargs): + self.seen.append((text, title, kwargs)) + return False + + def message(self, text, title=None): + self.seen.append((text, title)) + + info = message + + +class CustomRegistryLocalizationTests(unittest.TestCase): + def setUp(self): + self.temp = tempfile.TemporaryDirectory() + self.addCleanup(self.temp.cleanup) + self.base = Path(self.temp.name) + (self.base / 'lang').mkdir() + (self.base / 'config.json').write_text('{"language":"sk"}') + (self.base / 'lang/sk.json').write_bytes((ROOT / 'lang/sk.json').read_bytes()) + for name, value in [('BASE_DIR', self.base), ('_language', None), ('_cache', None)]: + item = patch.object(i18n, name, value) + item.start() + self.addCleanup(item.stop) + # Any unmocked subprocess, network fetch or installation is a failure. + self.run = self.guard(custom.subprocess, 'run') + self.network = self.guard(custom.urllib.request, 'urlopen') + self.install = self.guard(custom, 'install_template') + + def guard(self, module, name): + item = patch.object(module, name, side_effect=AssertionError('Forbidden effect: ' + name)) + mock = item.start() + self.addCleanup(item.stop) + return mock + + def no_effects(self): + self.run.assert_not_called() + self.network.assert_not_called() + self.install.assert_not_called() + + def manager(self): + return SimpleNamespace(path=Path('/fixture/auth.json'), + accounts=MagicMock(return_value=[{'registry': 'ghcr.io', 'account': 'owner', + 'method': 'Používateľské meno / token', 'status': 'Saved'}]), + login=MagicMock(), logout=MagicMock()) + + def menu(self, ui, manager): + with patch.object(accounts, 'require_root'): + accounts.registry_accounts_menu(ui, auth=manager) + + def test_dynamic_blockers_are_extracted_and_rendered_in_slovak(self): + expected = { + 'multi-service-compose': 'definuje viac než jeden obraz', + 'native-multi-lxc-orchestrator-not-yet-implemented': 'definuje viac než jeden obraz', + 'top-level-configs': 'používa nastavenia Compose configs, ktoré tu nemajú ekvivalent', + 'devices-format': 'požadované zariadenia sú zadané v nepodporovanom formáte', + 'healthcheck-format': 'kontrola stavu je zadaná v nepodporovanom formáte', + 'stop-grace-period-format': 'časový limit zastavenia je zadaný v nepodporovanom formáte', + 'shm-size-format': 'veľkosť zdieľanej pamäte je zadaná v nepodporovanom formáte', + 'ulimits-format-or-resource': 'požadované limity systémových prostriedkov nemožno uplatniť', + 'mem-limit-format-or-below-proxmox-minimum': 'požadovaný limit pamäte nemožno uplatniť', + 'mem-limit-deploy-consistency-review': 'požaduje dva rozdielne limity pamäte', + } + extractor = runpy.run_path(str(ROOT / '.github/scripts/build_translation_cache.py')) + extracted = extractor['extract_python_texts']([ROOT / 'oci/src']) + self.assertTrue(set(custom.BLOCKER_TEXTS.values()) <= set(extracted)) + for code, message in expected.items(): + with self.subTest(code=code): + self.assertEqual(custom.blocker_text('service:app:' + code), message) + self.assertEqual(custom.blocker_text('unrecognized:raw-code'), 'unrecognized:raw-code') + self.no_effects() + + def test_cancelled_source_menu_is_translated_without_reading_an_image(self): + ui = UI([None]) + with self.assertRaises(UserCancelled) as caught: + custom.explore(ui) + self.assertEqual(str(caught.exception), 'Výber obrazu bol zrušený') + self.assertIn('Obraz, ktorý nie je v katalógu', repr(ui.seen)) + self.assertIn('Len odkaz na obraz bez súboru Compose', repr(ui.seen)) + self.no_effects() + + def test_invalid_compose_inputs_reach_localized_error_before_registry_or_install(self): + cases = [ + ('services: {}', 'Súbor Compose neobsahuje žiadnu službu'), + ('services: [', 'Súbor Compose nie je platný YAML:'), + (COMPOSE + ' environment: 42\n', 'Položka environment'), + (COMPOSE + ' volumes: {}\n', 'Položka volumes'), + (COMPOSE + ' ports: invalid\n', 'Položka ports'), + (COMPOSE + ' ports: [invalid]\n', 'Neplatný port'), + (COMPOSE + ' volumes: [relative:relative]\n', 'Neplatná cesta dátového úložiska'), + (COMPOSE + 'x-casaos:\n main: missing\n', 'Položka x-casaos.main'), + ] + for text, expected in cases: + with self.subTest(text=text), patch.object(custom, 'read_definition', return_value=(text, 'fixture')), \ + self.assertRaises(custom.ConversionError) as caught: + custom.explore(UI()) + self.assertIn(expected, str(caught.exception)) + self.no_effects() + + def test_converter_raw_contract_and_english_ui_are_preserved(self): + bad = COMPOSE + ' ports: [invalid]\n' + with self.assertRaises(custom.ConversionError) as raw: + custom.template_from_compose(bad) + self.assertEqual(str(raw.exception), "Puerto no valido: 'invalid'") + with patch.object(i18n, '_language', 'en'), \ + patch.object(custom, 'read_definition', return_value=(bad, 'fixture')), \ + self.assertRaises(custom.ConversionError) as ui_error: + custom.explore(UI()) + self.assertEqual(str(ui_error.exception), str(raw.exception)) + self.no_effects() + + def test_conversion_message_retains_literal_diagnostic_data_and_unknown_fallback(self): + detail = " {'target': '{literal}\\á'}" + message = custom.conversion_message(custom.ConversionError('Ruta de volumen no valida:' + detail)) + self.assertEqual(message, 'Neplatná cesta dátového úložiska v súbore Compose:' + detail) + unknown = 'unknown {literal}' + self.assertEqual(custom.conversion_message(custom.ConversionError(unknown)), unknown) + self.no_effects() + + def test_all_legacy_converter_diagnostics_have_slovak_ui_and_unchanged_english(self): + messages = [ + 'environment must be a list or a mapping', 'volumes must be a list', 'ports must be a list', + 'The CasaOS Compose file has no services', 'The CasaOS document is not a Compose mapping', + 'The Compose file has no x-casaos metadata', 'x-casaos.main no identifica un servicio valido', + 'The main CasaOS service declares no image', 'Ruta de volumen no valida: /data', + 'Puerto no valido: invalid', 'Cannot normalise the CasaOS identifier: ???', + 'Docker Compose CasaOS no valido: fixture', + ] + for text in messages: + with self.subTest(text=text): + self.assertNotEqual(custom.conversion_message(custom.ConversionError(text)), text) + with patch.object(i18n, '_language', 'en'): + self.assertEqual(custom.conversion_message(custom.ConversionError(text)), text) + self.no_effects() + + def test_custom_review_cancel_keeps_installation_disabled(self): + ui = UI() + with patch.object(custom, 'read_definition', return_value=(COMPOSE, 'vloženého súboru Compose')), \ + patch.object(custom, 'registry_report', return_value=(True, 'Dostupný obraz')): + custom.explore(ui) + self.assertIn('Nainštalovať tento obraz?', repr(ui.seen)) + self.assertIn('Obraz:', repr(ui.seen)) + self.assertIn('ghcr.io/owner/app:latest', repr(ui.seen)) + self.no_effects() + + def test_unavailable_image_explains_registry_accounts_without_authentication_or_install(self): + ui = UI() + with patch.object(custom, 'read_definition', return_value=(COMPOSE, 'fixture')), \ + patch.object(custom, 'registry_report', return_value=(False, 'Nedostupný obraz')), \ + patch.object(custom, '_registry_refused', return_value=False), \ + patch.object(accounts, 'offer_sign_in') as offer: + custom.explore(ui) + self.assertIn('prihláste cez Účty registrov', repr(ui.seen)) + offer.assert_not_called() + self.no_effects() + + def test_registry_metadata_dialog_uses_image_and_digest_and_retains_values(self): + manager = self.manager() + ui = UI(['account-0', 'inspect', None], ['ghcr.io/owner/app:latest']) + metadata = dict(architecture='amd64', version='{literal}', size=1024, digest='sha256:' + 'a'*64) + with patch.object(accounts, 'inspect_registry_image', return_value=metadata) as inspect: + self.menu(ui, manager) + inspect.assert_called_once_with('ghcr.io/owner/app:latest') + rendered = repr(ui.seen) + for value in ('Prístup k obrazu bol potvrdený.', 'Digest: sha256:', '{literal}', 'Účty registrov'): + self.assertIn(value, rendered) + self.assertNotIn('obráz', rendered) + manager.login.assert_not_called() + manager.logout.assert_not_called() + self.no_effects() + + def test_credential_help_retains_permissions_and_no_encryption_claim(self): + manager = self.manager() + ui = UI(['storage', None]) + self.menu(ui, manager) + rendered = repr(ui.seen) + for value in ('root', '700', '600', 'base64', 'nie sú šifrované', 'každý uzol klastra', '/fixture/auth.json'): + self.assertIn(value, rendered) + manager.login.assert_not_called() + manager.logout.assert_not_called() + self.no_effects() + + def test_cancelled_password_and_declined_logout_do_not_change_accounts(self): + for ui in (UI(['add', None], ['ghcr.io', 'owner']), UI(['account-0', 'logout', None], confirms=[False])): + manager = self.manager() + self.menu(ui, manager) + manager.login.assert_not_called() + manager.logout.assert_not_called() + self.no_effects() + + def test_mismatched_registry_is_rejected_before_download(self): + manager = self.manager() + ui = UI(['account-0', 'download', None], ['quay.io/owner/app:latest']) + with patch.object(accounts, 'download_registry_image') as download: + self.menu(ui, manager) + download.assert_not_called() + self.assertIn('Zadajte obraz z tohto registra.', repr(ui.seen)) + self.no_effects() + + def test_declined_private_image_signin_does_not_even_construct_auth_manager(self): + ui = UI(confirms=[False]) + with patch.object(accounts, 'RegistryAuth') as manager, patch.object(accounts, 'require_root') as root: + self.assertFalse(accounts.offer_sign_in(ui, 'ghcr.io/owner/app:latest')) + manager.assert_not_called() + root.assert_not_called() + self.assertIn('Prihlásiť sa teraz?', repr(ui.seen)) + self.no_effects() + + def test_registry_error_classes_hide_untrusted_remote_data_in_both_languages(self): + cases = [('status code: 429', 'obmedzuje počet požiadaviek'), + ('requested access to the resource is denied', 'odmietol prístup'), + ('manifest unknown', 'Obraz alebo tag'), + ('unsupported manifest', 'metadáta obrazu'), + ('docker-credential-helper', 'správu prihlasovacích údajov'), + ('unknown failure', 'Obraz sa nepodarilo načítať')] + for language in ('sk', 'en'): + for error, expected in cases: + with self.subTest(language=language, error=error), patch.object(i18n, '_language', language): + message = auth.registry_error('registry.test:5000', error + ' REMOTE_PRIVATE_VALUE') + self.assertNotIn('REMOTE_PRIVATE_VALUE', message) + if language == 'sk': + self.assertIn(expected, message) + if 'credential' not in error: + self.assertIn('registry.test:5000', message) + self.no_effects() + + +if __name__ == '__main__': + unittest.main() diff --git a/.github/scripts/tests/test_oci_wording.py b/.github/scripts/tests/test_oci_wording.py index c38e3671..76499b5c 100644 --- a/.github/scripts/tests/test_oci_wording.py +++ b/.github/scripts/tests/test_oci_wording.py @@ -121,7 +121,7 @@ class OciWordingTests(TestCase): def test_failed_registry_inspection_points_to_registry_accounts(self): ui = SimpleNamespace(message=Mock()) - fn = function(CUSTOM, 'explore', read_definition=lambda _: ('definition', 'source'), + 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'), diff --git a/lang/sk.json b/lang/sk.json index fe1f96ce..ee634fac 100644 --- a/lang/sk.json +++ b/lang/sk.json @@ -196,7 +196,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.": "Register {registry} odmietol prístup. Skontrolujte názov obrazu a prihláste sa cez Účty registrov.", "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:", @@ -293,7 +293,7 @@ "Address Healthchecks will be opened at (for example http://192.168.1.50:8000)": "Adresa, na ktorej bude Healthchecks dostupný (napríklad http://192.168.1.50:8000)", "Address Speedtest Tracker will be opened at (for example http://192.168.1.50)": "Adresa, na ktorej bude Speedtest Tracker dostupný (napríklad http://192.168.1.50)", "Address of Redis or Valkey (for example redis://192.168.1.20:6379/1)": "Adresa služby Redis alebo Valkey (napríklad redis://192.168.1.20:6379/1)", - "Address of the Compose file": "Adresa súboru", + "Address of the Compose file": "Adresa súboru Compose", "Address of the MariaDB server": "Adresa servera MariaDB", "Address of the NetBird management server": "Adresa riadiaceho servera NetBird", "Address of the PostgreSQL server": "Adresa servera PostgreSQL", @@ -646,7 +646,7 @@ "Beta version:": "Beta verzia:", "Binary not found in extracted content.": "V rozbalenom obsahu sa nenašiel spustiteľný súbor.", "Bind mount added:": "Bind mount pridaný:", - "Bind mounts are not included in vzdump": "Vzadump nie sú zahrnuté svorníky", + "Bind mounts are not included in vzdump": "Pripojené adresáre hostiteľa nie sú zahrnuté v zálohe vzdump", "Bitcoin Knots can be used as a desktop client for regular payments or as a full node server utility for merchants and other payment services.": "Bitcoin Knots môže byť použitý ako desktop klient pre pravidelné platby alebo ako kompletný uzol server nástroj pre obchodníkov a iné platobné služby.", "Blacklist nouveau driver": "Pridá ovládač nouveau na blacklist", "Blacklisting GPU host drivers...": "Pridávam host ovládače GPU na blacklist...", @@ -754,7 +754,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.": "Archív obrazu sa nedá zapísať do úložiska {storage}. Skontrolujte prístup k úložisku a stav jeho 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ť.", "Catalog options": "Možnosti katalógu", "Category": "Kategória", @@ -816,7 +816,7 @@ "Check Samba Status": "Skontrolovať stav Samby", "Check VM disk/PCI slots": "Skontrolovať diskové/PCI sloty VM", "Check VM passthrough settings": "Skontrolovať nastavenie VM passthrough", - "Check access to an image": "Kontrola prístupu k obrázku", + "Check access to an image": "Overiť prístup k obrazu", "Check connectivity with another host": "Skontrolovať spojenie s iným hostom", "Check container mount points": "Skontrolovať body pripojenia kontajnera", "Check for updates": "Vyhľadať aktualizácie", @@ -830,7 +830,7 @@ "Check that:": "Skontrolujte, že:", "Check the error messages above for details.": "Podrobnosti nájdete v chybových hláškach vyššie.", "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.": "Skontrolujte odkaz na obraz a prístup k registru. Ak register nie je dostupný, skúste to neskôr. Súkromný register vyžaduje prihlasovacie údaje, ktoré zatiaľ nie sú podporované.", - "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.": "Skontrolujte odkaz na obrázok a prístup do registra. Ak register nie je dostupný, skúste to znova neskôr. Pre súkromný obrázok sa prihláste z účtov Registry v ponuke 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.": "Skontrolujte odkaz na obraz a prístup do registra. Ak register nie je dostupný, skúste to znova neskôr. K súkromnému obrazu sa prihláste cez Účty registrov v ponuke OCI.", "Check the service status manually if needed.": "V prípade potreby skontrolujte stav služieb ručne.", "Checking MOTD configuration...": "Kontrolujem nastavenie MOTD...", "Checking NVIDIA driver status with nvidia-smi": "Kontrolujem stav ovládača NVIDIA pomocou nvidia-smi", @@ -845,7 +845,7 @@ "Checking free space in /var/cache/apt/archives...": "Kontrolujem voľné miesto v /var/cache/apt/archives...", "Checking if system disk is SSD or M.2...": "Kontrolujem, či je systémový disk SSD alebo M.2...", "Checking if the server belongs to OVH...": "Kontrolujem, či server patrí pod OVH...", - "Checking image access and metadata. Please wait...": "Kontrola prístupu k obrázku a metadát. Čakajte prosím...", + "Checking image access and metadata. Please wait...": "Overuje sa prístup k obrazu a jeho metadáta. Čakajte, prosím...", "Checking kernel headers and build tools...": "Kontrolujem kernel headers a nástroje na zostavenie...", "Checking remaining interfaces": "Kontrolujem zostávajúce rozhrania", "Checking that the container keeps running...": "Kontrola, či kontajner beží...", @@ -921,7 +921,7 @@ "Choose iperf3 mode:": "Vyberte režim iperf3:", "Choose options to configure:": "Vyberte možnosti, ktoré chcete nastaviť:", "Choose specific VMs/CTs": "Vyberte konkrétne VM/CT", - "Choose storage for the downloaded image.": "Vyberte úložisko pre stiahnutý obrázok.", + "Choose storage for the downloaded image.": "Vyberte úložisko pre stiahnutý obraz.", "Choose the driver version for Coral M.2:": "Vyberte verziu ovládača pre Coral M.2:", "Choose the filesystem for the new partition:": "Vyberte súborový systém pre nový oddiel:", "Choose the release channel to use:": "Vyberte vetvu vydania, ktorú chcete používať:", @@ -1017,8 +1017,8 @@ "Component:": "Súčasť:", "Components to uninstall (manual for now):": "Súčasti na odinštalovanie (zatiaľ ručne):", "Compose capabilities validated in the LXC user namespace:": "Skladanie schopností validovaných v LXC užívateľskom priestore:", - "Compose file of the application": "Zostaviť súbor žiadosti", - "Compose file of this host": "Zostaviť súbor tohto hostiteľa", + "Compose file of the application": "Súbor Compose aplikácie", + "Compose file of this host": "súboru Compose z tohto hostiteľa", "Compressed size:": "Veľkosť po kompresii:", "Compressing": "Komprimujem", "Compression": "Kompresia", @@ -1396,14 +1396,14 @@ "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.": "Obraz sa nepodarilo načítať z registra {registry}. Skontrolujte odkaz na obraz a prihláste sa cez Účty registrov.", "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.": "Prihlasovacie údaje pre {registry} sa nepodarilo odstrániť; údaje uložené v súbore sa nezmenili.", "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:", @@ -1505,15 +1505,15 @@ "Creating the private network...": "Vytváranie súkromnej siete...", "Creating the temporary data container": "Vytvorenie dočasného dátového kontajnera", "Creative & Design": "Kreativita a dizajn", - "Credential helper": "Pomocník poverení", - "Credential storage and access": "Úložisko poverení a prístup", + "Credential helper": "Pomocný program na správu prihlasovacích údajov", + "Credential storage and access": "Ukladanie prihlasovacích údajov a prístup", "Credentials are correct": "Prihlasovacie údaje sú správne", "Credentials cleared. jwt_secret and API tokens preserved.": "Prihlasovacie údaje sú vymazané. jwt_secret a API tokeny zostali zachované.", "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.\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 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 s prihlasovacími údajmi:\n{path}\n\nVlastníkom je root; adresár má oprávnenia 700 a súbor 600.\nZákladné prihlasovacie údaje sú kódované pomocou base64, nie sú šifrované.\nPomocné programy na správu prihlasovacích údajov používajú vlastné úložisko.\n\nPoužite prístupový token s oprávnením sťahovať obrazy.\nÚčty uložené na tomto mieste používa každý uzol klastra.", "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é", @@ -1892,7 +1892,7 @@ "Doplarr_rs is a Discord bot for requesting media through *arr backends, written in Rust.": "Doplarr_rs je robot Discord pre žiadanie médií cez arr backends, napísané v 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 je free cross platform open source správca súborov s dvoma panelmi vedľa seba. Je inšpirovaný Total Commander a obsahuje niektoré nové nápady.", "Download Spotify music with album art and metadata": "Stiahnuť Spotify hudbu s albumom a metadátami", - "Download an image to template storage": "Stiahnite si obrázok do úložiska šablón", + "Download an image to template storage": "Stiahnuť obraz do úložiska šablón", "Download an oci-compose from an address": "Stiahnuť oci-compose z adresy", "Download failed for all attempted URLs": "Sťahovanie zlyhalo zo všetkých vyskúšaných adries", "Download its Compose file from an address": "Stiahnuť súbor Compose z URL adresy", @@ -1908,7 +1908,7 @@ "Downloading Proxmology logo...": "Sťahujem logo Proxmology...", "Downloading UUP converter...": "Sťahujem UUP konvertor...", "Downloading amdgpu_top": "Sťahujem amdgpu_top", - "Downloading and verifying the image.\nThis can take a few minutes. Please wait...": "Stiahnutie a overenie obrázka.\nMôže to trvať niekoľko minút. Čakajte prosím...", + "Downloading and verifying the image.\nThis can take a few minutes. Please wait...": "Obraz sa sťahuje a overuje.\nMôže to trvať niekoľko minút. Čakajte, prosím...", "Downloading official installer...": "Sťahujem oficiálny inštalátor...", "Downloading pre-existing encrypted backups from this host will fail unless you kept a copy of the current key.": "Stiahnutie už existujúcich šifrovaných záloh z tohto hosta zlyhá, ak ste si nenechali kópiu aktuálneho kľúča.", "Downloading the image:": "Sťahovanie obrázku:", @@ -2935,25 +2935,25 @@ "If you want HDMI/analog audio inside the VM, select the audio controller(s) to pass through along with the GPU.": "Ak chcete mať vo VM HDMI/analógový zvuk, vyberte aj audio radiče, ktoré sa majú priradiť spolu s GPU.", "If you want to use a physical monitor on the passthrough GPU:": "Ak chcete použiť fyzický monitor na priamo priradenej GPU:", "If your DHCP has a static reservation for the old MAC, update it.": "Ak máte v DHCP statickú rezerváciu pre starú MAC adresu, aktualizujte ju.", - "Image": "Image", + "Image": "Obraz", "Image Source Directory": "Zdrojový priečinok obrazov", - "Image access confirmed.\n\n{reference}\n\nArchitecture: {architecture}\nVersion: {version}\nDownload size: {size}\nDigest: {digest}": "Prístup k obrázku bol potvrdený.\n\n{reference}\n\nArchitektúra: {architecture}\nVerzia: {version}\nVeľkosť na stiahnutie: {size}\nZhrnutie: {digest}", + "Image access confirmed.\n\n{reference}\n\nArchitecture: {architecture}\nVersion: {version}\nDownload size: {size}\nDigest: {digest}": "Prístup k obrazu bol potvrdený.\n\n{reference}\n\nArchitektúra: {architecture}\nVerzia: {version}\nVeľkosť na stiahnutie: {size}\nDigest: {digest}", "Image cache": "Comment", "Image compatibility restored:": "Kompatibilita s obrázkom obnovená:", "Image compatibility verified:": "Kompatibilita s obrázkom overená:", "Image directory:": "Priečinok s obrazmi:", "Image download failed:": "Sťahovanie obrázku zlyhalo:", "Image downloaded": "Stiahnutý obrázok", - "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 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.": "Obraz bol stiahnutý a overený.\n\n{reference}\n\nÚložisko: {storage}\nVeľkosť archívu: {size}\nArchív: {archive}\n\nNebol vytvorený žiadny kontajner.\nProxMenux po úspešných aktualizáciách odstraňuje nepoužívané obrazy 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 obrazu zlyhalo. Neúplne stiahnuté dáta boli 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", - "Image reference (for example ghcr.io/user/application:latest)": "Odkaz na image (napríklad ghcr.io/user/aplikácia:latest)", - "Image selection was cancelled": "Výber image bol zrušený", - "Image that is not in the catalog": "Image, ktorý nie je v katalógu", + "Image reference": "Odkaz na obraz", + "Image reference (for example ghcr.io/user/application:latest)": "Odkaz na obraz (napríklad ghcr.io/user/application:latest)", + "Image selection was cancelled": "Výber obrazu bol zrušený", + "Image that is not in the catalog": "Obraz, ktorý nie je v katalógu", "Image:": "Image:", "Images to import:": "Image na import:", "Immich CUDA requires NVIDIA driver 545 or later": "Immich CUDA requires NVIDIA ovládač 545 alebo neskôr", @@ -3079,7 +3079,7 @@ "Install Samba inside CT:": "Nainštalovať Sambu vo vnútri CT:", "Install ZFS auto-snapshot": "Nainštalovať ZFS auto-snapshot", "Install a version from the branch the kernel names.": "Nainštalujte verziu z vetvy s názvami jadra.", - "Install an image as a native LXC": "Nainštalujte obrázok ako natívny LXC", + "Install an image as a native LXC": "Nainštalovať obraz ako natívny LXC", "Install an image that is not in the catalog": "Inštalovať obraz, ktorý nie je v katalógu", "Install analysis tools": "Nainštalovať analytické nástroje", "Install and configure": "Nainštalovať a nastaviť", @@ -3099,7 +3099,7 @@ "Install server packages inside CT:": "Nainštalovať serverové balíky vo vnútri CT:", "Install terminal multiplexers": "Nainštalovať terminálové multiplexery", "Install the Edge TPU runtime (libedgetpu1-std)": "Nainštaluje Edge TPU runtime (libedgetpu1-std)", - "Install this image?": "Nainštalovať tento obrázok?", + "Install this image?": "Nainštalovať tento obraz?", "Install with Cloud-Init script": "Inštalovať cez Cloud-Init skript", "Install with ISO from UUP Dump": "Inštalovať z ISO cez UUP Dump", "Install with advanced settings": "Inštalovať s pokročilým nastavením", @@ -3296,9 +3296,9 @@ "Invalid host path:": "Neplatná cesta k hostiteľovi:", "Invalid host-monitor firewall plan": "Neplatný plán firewallu pre monitor hostiteľa", "Invalid image probe descriptor": "Neplatný deskriptor obrazovej sondy", - "Invalid image tag.": "Neplatná značka obrázka.", + "Invalid image tag.": "Neplatný tag obrazu.", "Invalid input": "Neplatný vstup", - "Invalid internal volume": "Neplatný vnútorný objem", + "Invalid internal volume": "Neplatné interné dátové úložisko", "Invalid list:": "Neplatný zoznam:", "Invalid machine learning CPU allocation:": "Neplatné pridelenie CPU pre strojové učenie:", "Invalid machine learning resources": "Neplatné zdroje strojového učenia", @@ -3384,7 +3384,7 @@ "It is strongly recommended to create a backup of your container before proceeding with the conversion.": "Pred prevodom sa dôrazne odporúča vytvoriť zálohu kontajnera.", "It needs a privileged container, which is not isolated from the host.": "Potrebuje privilegovaný kontajner, ktorý nie je izolovaný od hostiteľa.", "It will be installed from the official GitHub repository.": "Nainštaluje sa z oficiálneho GitHub repozitára.", - "It works through the Docker engine of the host, and a native OCI container does not have one.": "Funguje prostredníctvom Docker motora hostiteľa, a natívne OCI kontajner nemá jeden.", + "It works through the Docker engine of the host, and a native OCI container does not have one.": "Používa Docker engine hostiteľa, ktorý natívny OCI kontajner nemá k dispozícii.", "Italian": "Taliančina", "Its Compose file asks for privileged mode; the container is created unprivileged and that mode is only offered as an option.": "Jeho súbor Compose požaduje privilegovaný režim; kontajner je vytvorený neprivilegovaný a tento režim je ponúkaný len ako možnosť.", "Its ROCm profile is not offered.": "Jeho profil ROCm nie je ponúkaný.", @@ -3596,8 +3596,8 @@ "Log2RAM write scheduled every": "Zápis z Log2RAM je naplánovaný každých", "Log:": "Záznam:", "Logged-in users": "Prihlásení používatelia", - "Login to {registry} timed out. Saved credentials were not changed.": "Prihlásenie do {registry} vypršalo. Uložené poverenia sa nezmenili.", - "Logout from {registry} timed out. Saved file credentials were not changed.": "Odhlásenie z {registry} vypršalo. Prihlasovacie údaje uloženého súboru sa nezmenili.", + "Login to {registry} timed out. Saved credentials were not changed.": "Pri prihlasovaní do {registry} uplynul časový limit. Uložené prihlasovacie údaje sa nezmenili.", + "Logout from {registry} timed out. Saved file credentials were not changed.": "Pri odhlasovaní z {registry} uplynul časový limit. Prihlasovacie údaje uložené v súbore sa nezmenili.", "Logrotate optimization completed": "Optimalizácia logrotate je dokončená", "Logrotate service restarted successfully": "Služba logrotate bola úspešne reštartovaná", "Lollypop is a lightweight modern music player designed to work excellently on the GNOME desktop environment.": "Lollypop je ľahký moderný hudobný prehrávač navrhnutý tak, aby pracoval vynikajúco na GNOME desktop prostredí.", @@ -3660,7 +3660,7 @@ "Manage custom paths (add / remove your folders)": "Spravovať vlastné cesty (pridať / odstrániť priečinky)", "Manage installed OCI applications": "Spravovať nainštalované aplikácie OCI", "Manage local backup target": "Spravovať lokálny cieľ záloh", - "Manage private image registries.\nSaved credentials let ProxMenux access your private images.": "Správa súkromných registrov obrázkov.\nUložené poverenia umožňujú ProxMenux prístup k vašim súkromným obrázkom.", + "Manage private image registries.\nSaved credentials let ProxMenux access your private images.": "Správa súkromných registrov obrazov.\nUložené prihlasovacie údaje umožňujú ProxMenuxu pristupovať k vašim súkromným obrazom.", "Manage registry accounts as root on the Proxmox node.": "Spravujte účty registra ako root na uzle Proxmox.", "Managed disks must have backup enabled and a valid size": "Spravované disky musia mať zapnuté zálohovanie a platnú veľkosť", "Managing Nginx proxy hosts with a simple, powerful interface.": "Správa Nginx proxy hostiteľov s jednoduchým, výkonným rozhraním.", @@ -4085,7 +4085,7 @@ "No CTs available in the system.": "V systéme nie sú dostupné žiadne CT.", "No Changes Needed": "Nie sú potrebné žiadne zmeny", "No Cleanup Needed": "Čistenie nie je potrebné", - "No Compose file was given": "Nebol zadaný žiadny súbor", + "No Compose file was given": "Nebol zadaný žiadny súbor Compose", "No Controller/NVMe selected for now.": "Zatiaľ nie je vybraný žiadny Controller/NVMe.", "No Coral Detected": "Coral sa nenašiel", "No Coral TPU device was found on this host (neither PCIe/M.2 nor USB).": "Na tomto hoste sa nenašlo žiadne Coral TPU zariadenie (ani PCIe/M.2, ani USB).", @@ -4461,8 +4461,8 @@ "Online retro games emulator": "Online retro hry emulátor", "Only Intel/AMD DRM, Coral and USB nodes can be adopted automatically": "Automaticky je možné prijať iba uzly Intel/AMD DRM, Coral a USB", "Only Intel/AMD DRM, Coral, NPU and USB nodes can be adopted automatically": "Automaticky je možné prijať iba uzly Intel/AMD DRM, Coral, NPU a USB", - "Only a Docker Swarm uses these settings, so they are not applied:": "Tieto nastavenia používa len roj Docker, takže sa nepoužívajú:", - "Only a full sha256 image digest is supported.": "Podporovaný je iba úplný súhrn obrázkov sha256.", + "Only a Docker Swarm uses these settings, so they are not applied:": "Tieto nastavenia používa iba Docker Swarm, preto sa neuplatnia:", + "Only a full sha256 image digest is supported.": "Podporovaný je iba úplný digest obrazu sha256.", "Only an installed standalone OCI instance can adopt external changes": "Externé zmeny môže prijať iba nainštalovaná samostatná inštancia OCI", "Only backed-up Proxmox volumes can be adopted": "Je možné prijať iba zálohované zväzky Proxmox", "Only convert to privileged if absolutely necessary for your use case.": "Na privilegovaný kontajner prevádzajte iba vtedy, keď je to naozaj potrebné.", @@ -4622,7 +4622,7 @@ "Passthrough may still work without a ROM file.": "Passthrough môže fungovať aj bez ROM súboru.", "Passthrough may work, but startup/restart reliability is not guaranteed.": "Priame priradenie môže fungovať, ale spoľahlivý štart alebo reštart VM nie je zaručený.", "Password": "Heslo", - "Password / access token (image pull permission)": "Heslo / prístupový token (povolenie na stiahnutie obrázka)", + "Password / access token (image pull permission)": "Heslo / prístupový token (oprávnenie sťahovať obrazy)", "Password Mismatch": "Heslá sa nezhodujú", "Password cannot be empty.": "Heslo nesmie byť prázdne.", "Password confirmation cannot be empty.": "Potvrdenie hesla nesmie byť prázdne.", @@ -4671,7 +4671,7 @@ "Path must be absolute (start with /)": "Cesta musí byť absolútna (začínať znakom /)", "Path must be absolute (start with /).": "Cesta musí byť absolútna (začínať znakom /).", "Path not found": "Cesta sa nenašla", - "Path of the Compose file": "Cesta ku súboru", + "Path of the Compose file": "Cesta k súboru Compose", "Path of the oci-compose file": "Cesta k súboru oci-compose", "Path removed:": "Cesta bola odstránená:", "Path:": "Cesta:", @@ -4889,11 +4889,11 @@ "ProxMenux attaches directories, not single files, so this image cannot be installed yet.": "ProxMenux pripája adresáre, nie jednotlivé súbory, takže tento obrázok ešte nie je možné nainštalovať.", "ProxMenux can apply open permissions on this NFS directory from the host so the container can read and write:": "ProxMenux môže na hostovi nastaviť otvorené oprávnenia pre tento NFS priečinok, aby kontajner mohol čítať aj zapisovať:", "ProxMenux can remount it with open permissions so any LXC can read and write.": "ProxMenux ho môže znovu pripojiť s otvorenými oprávneniami, aby každý LXC mohol čítať aj zapisovať.", - "ProxMenux cannot install this image automatically. Import its Compose file instead.": "ProxMenux nemôže nainštalovať tento obrázok automaticky. Namiesto toho importujte jeho súbor Compose.", + "ProxMenux cannot install this image automatically. Import its Compose file instead.": "ProxMenux nedokáže automaticky nainštalovať tento obraz. Importujte jeho súbor Compose.", "ProxMenux cannot override NFS server-side permissions from the host.": "ProxMenux nevie z hosta prepísať oprávnenia nastavené na NFS serveri.", - "ProxMenux could not translate this image. Try importing its Compose file from OCI manager Apps.": "ProxMenux nemohol preložiť tento obrázok. Skúste importovať jeho súbor Compose z OCI manager Apps.", + "ProxMenux could not translate this image. Try importing its Compose file from OCI manager Apps.": "ProxMenux nedokázal previesť tento obraz na konfiguráciu LXC. Skúste importovať jeho súbor Compose cez správcu aplikácií OCI.", "ProxMenux customizations removed from bashrc": "Úpravy ProxMenux boli odstránené z bashrc", - "ProxMenux does not give a container the system of its host.": "ProxMenux nedáva kontajner systém svojho hostiteľa.", + "ProxMenux does not give a container the system of its host.": "ProxMenux nesprístupňuje kontajneru systémové adresáre hostiteľa.", "ProxMenux does not install them. The installation asks how to connect to them.": "ProxMenux ich neinštaluje. Inštalácia sa pýta, ako sa k nim pripojiť.", "ProxMenux does not validate the contents; any keyfile your PBS accepts is accepted here.": "ProxMenux nekontroluje obsah; prijme sa každý keyfile, ktorý prijme vaše PBS.", "ProxMenux files:": "Súbory ProxMenux:", @@ -4934,7 +4934,7 @@ "Proxmox repository configuration completed": "Nastavenie repozitárov Proxmoxu je dokončené", "Proxmox repository fixed (no-subscription, candidate is 9.x)": "Proxmox repozitár opravený (no-subscription, kandidát je 9.x)", "Proxmox status:": "Stav Proxmoxu:", - "Proxmox storage for the volume": "Uskladnenie Proxmox pre objem", + "Proxmox storage for the volume": "Úložisko Proxmox pre dátový disk", "Proxmox storages:": "Úložiská Proxmoxu:", "Proxmox system repair completed successfully!": "Oprava systému Proxmox bola úspešne dokončená.", "Proxmox system repair completed with some issues.": "Oprava systému Proxmox bola dokončená, ale s niektorými problémami.", @@ -5018,7 +5018,7 @@ "Reading SMART data...": "Čítam SMART dáta...", "Reading SMART self-test log...": "Čítam log SMART samo-testu...", "Reading full SMART report...": "Čítam úplnú SMART správu...", - "Reading image metadata. Please wait...": "Čítanie metadát obrázkov. Čakajte prosím...", + "Reading image metadata. Please wait...": "Načítavajú sa metadáta obrazu. Čakajte, prosím...", "Real-time Performance Monitoring": "Monitorovanie výkonnosti v reálnom čase", "Real-time bandwidth usage (press q to exit)": "Využitie priepustnosti v reálnom čase (ukončíte klávesom q)", "Real-time collaborative document editor": "Kolektívne editor dokumentov v reálnom čase", @@ -5113,9 +5113,9 @@ "Register mount path in Proxmox:": "Zaregistrovať cestu pripojenia v Proxmoxe:", "Registering disk as Proxmox storage...": "Registrujem disk ako úložisko Proxmoxu...", "Registering module with DKMS...": "Registrujem modul v DKMS...", - "Registry accounts": "Účty v registri", + "Registry accounts": "Účty registrov", "Registry hostname": "Názov hostiteľa registra", - "Registry: {registry}\nAccount: {account}\nAuthentication: {method}\n\nSaved credentials are verified when an image is accessed.": "Register: {registry}\nÚčet: {account}\nOverenie: {method}\n\nUložené poverenia sa overia pri prístupe k obrázku.", + "Registry: {registry}\nAccount: {account}\nAuthentication: {method}\n\nSaved credentials are verified when an image is accessed.": "Register: {registry}\nÚčet: {account}\nOverenie: {method}\n\nUložené prihlasovacie údaje sa overia pri prístupe k obrazu.", "Reinstall / update Coral drivers": "Preinštalovať / aktualizovať ovládače Coral", "Reinstall Fail2Ban": "Preinštalovať Fail2Ban", "Reinstall Lynis": "Preinštalovať Lynis", @@ -5187,12 +5187,12 @@ "Remove obsolete systemd-boot meta-package": "Odstrániť zastaraný meta-balík systemd-boot", "Remove old repository files:": "Odstráňte staré súbory repozitárov:", "Remove passthrough device from VM": "Odstrániť passthrough zariadenie z VM", - "Remove saved credentials": "Odstráňte uložené poverenia", + "Remove saved credentials": "Odstrániť uložené prihlasovacie údaje", "Remove subscription banner": "Odstrániť hlásenie o predplatnom", "Remove the application? Its container disks are deleted, and only a backup can bring them back.": "Odstrániť aplikáciu? Jeho kontajnerové disky sa vymažú a iba záloha ich môže vrátiť späť.", "Remove the lock left on a VM by an interrupted task": "Odstrániť zámok, ktorý na VM zanechala prerušená úloha", "Remove the lock left on a container by an interrupted task": "Odstrániť zámok, ktorý na kontajneri zanechala prerušená úloha", - "Remove the saved credentials for {registry}?\nRunning apps will keep working.": "Odstrániť uložené poverenia pre {registry}?\nSpustené aplikácie budú naďalej fungovať.", + "Remove the saved credentials for {registry}?\nRunning apps will keep working.": "Odstrániť uložené prihlasovacie údaje pre {registry}?\nSpustené aplikácie budú naďalej fungovať.", "Remove the unprivileged flag from configuration:": "Odstrániť príznak neprivilegovaného kontajnera z nastavenia:", "Remove unused packages and their config": "Odstrániť nepoužívané balíky aj ich nastavenia", "Remove: delete the application and its containers": "Odstrániť: odstrániť aplikáciu a jej obaly", @@ -5519,7 +5519,7 @@ "Save and classify articles. Read them later. Freely.": "Uložiť a klasifikovať články. Prečítajte si ich neskôr. Slobodne.", "Save the passphrase somewhere safe NOW, before continuing.": "Uložte si frázu TERAZ na bezpečné miesto, ešte pred pokračovaním.", "Save this Borg target so you don't need to enter the details again?": "Uložiť tento Borg cieľ, aby ste údaje nemuseli zadávať znova?", - "Saved credentials for {registry} were removed.\nOther Skopeo/Docker credential files are managed separately.": "Uložené poverenia pre {registry} boli odstránené.\nOstatné súbory poverení Skopeo/Docker sa spravujú samostatne.", + "Saved credentials for {registry} were removed.\nOther Skopeo/Docker credential files are managed separately.": "Uložené prihlasovacie údaje pre {registry} boli odstránené.\nOstatné súbory s prihlasovacími údajmi Skopeo/Docker sa spravujú samostatne.", "Saved record removed": "Uložený záznam odstránený", "Saving changes...": "Ukladajú sa zmeny...", "Saving the new configuration": "Ukladanie novej konfigurácie", @@ -5903,11 +5903,11 @@ "Shutdown timeout": "Čas na vypnutie vypršal", "SiYuan access code": "Prístupový kód SiYuan", "SickGear provides management of TV shows and/or Anime, it detects new episodes, links downloader apps, and more..": "SickGear poskytuje správu televíznych relácií a / alebo Anime, detekuje nové epizódy, odkazy aplikácie pre downloader, a ďalšie..", - "Sign in to a registry": "Prihláste sa do registra", + "Sign in to a registry": "Prihlásiť sa do registra", "Sign in to the panel and create a Samba user in Settings before publishing a directory over SMB.": "Pred publikovaním adresára cez SMB sa prihláste na panel a vytvorte používateľa Samba v Nastaveniach.", "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 je aplikácia správ s ochranou súkromia v jej jadre. Je zadarmo a ľahko použiteľný, so silným end-to-end šifrovaním, ktoré udržuje vašu komunikáciu úplne súkromnú.", "Signatures removed. Partition table preserved.": "Podpisy boli odstránené. Tabuľka oddielov zostala zachovaná.", - "Signed in to {registry} as {username}.\n\nCredentials are saved for ProxMenux.\nSelect the account to check, download or install an image.": "Prihlásený do {registry} ako {username}.\n\nPoverenia sú uložené pre ProxMenux.\nVyberte účet, ktorý chcete skontrolovať, stiahnuť alebo nainštalovať obrázok.", + "Signed in to {registry} as {username}.\n\nCredentials are saved for ProxMenux.\nSelect the account to check, download or install an image.": "Prihlásenie do {registry} ako {username} bolo úspešné.\n\nPrihlasovacie údaje sú uložené pre ProxMenux.\nVyberte účet, cez ktorý chcete overiť prístup k obrazu, stiahnuť ho alebo ho nainštalovať.", "Simple and easy to use DDNS": "Jednoduché a jednoduché použitie DDNS", "Single GPU Warning": "Upozornenie na jednu GPU", "Single target found — selected automatically:": "Našiel sa jeden target - vybraný automaticky:", @@ -5934,7 +5934,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 s prihlasovacími údajmi; uložené prihlasovacie údaje sa nezmenili.", "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.", @@ -6250,11 +6250,11 @@ "The Bookmark Everything App": "Záložka Všetko App", "The Brave browser is a fast, private and secure web browser for PC, Mac and mobile.": "Prehliadač Brave je rýchly, súkromný a bezpečný webový prehliadač pre PC, Mac a mobil.", "The CT already exists:": "CT už existuje:", - "The Compose file declares no service": "Zostaviť súbor deklaruje žiadnu službu", + "The Compose file declares no service": "Súbor Compose neobsahuje žiadnu službu", "The Compose file describes several images:": "Skladací súbor popisuje niekoľko obrázkov:", "The Compose file describes several services:": "Súbor Compose opisuje viacero služieb:", - "The Compose file does not contain a Compose document": "Skladací súbor neobsahuje dokument", - "The Compose file is not valid YAML:": "Skladací súbor nie je platný", + "The Compose file does not contain a Compose document": "Súbor neobsahuje dokument Compose", + "The Compose file is not valid YAML:": "Súbor Compose nie je platný YAML:", "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.": "Skladba ponúka voliteľnú AppArmor alebo seccomp relaxáciu; zostane vypnutá, ak si ju užívateľ nevyberie. Pokračujte len vtedy, ak dôverujete obrazu a prijmete toto riziko.", "The Compose value must be text or a list:": "Kompozitná hodnota musí byť text alebo zoznam:", "The DRM node is not an Intel or AMD GPU; NVIDIA requires its library profile": "DRM uzol nie je Intel ani AMD GPU; NVIDIA requires svoj profil knižnice", @@ -6377,10 +6377,10 @@ "The changes need the application installer": "Zmeny vyžadujú inštalačný program aplikácie", "The character device does not exist:": "Znakové zariadenie neexistuje:", "The command asks for a password that is not echoed. After creating the users, the web interface asks for a user name and a password.": "Príkaz vyžaduje heslo, ktoré nie je ozvene. Po vytvorení užívateľov, webové rozhranie žiada o užívateľské meno a heslo.", - "The command does not name an image": "Príkaz nepomenuje obrázok", - "The command reads its variables from a file; write them in the command or use a Compose file": "Príkaz číta svoje premenné zo súboru; zapíšte ich do príkazu alebo použite súbor", - "The command runs the container as the user of the host; the container uses the user of its image instead.": "Príkaz spustí kontajner ako užívateľ hostiteľa; kontajner používa užívateľa svojho obrazu miesto.", - "The command uses options that cannot be translated:": "Príkaz používa možnosti, ktoré nemožno preložiť:", + "The command does not name an image": "Príkaz neuvádza žiadny obraz", + "The command reads its variables from a file; write them in the command or use a Compose file": "Príkaz číta premenné zo súboru; zadajte ich priamo v príkaze alebo použite súbor Compose", + "The command runs the container as the user of the host; the container uses the user of its image instead.": "Príkaz požaduje spustenie kontajnera pod používateľom hostiteľa; kontajner namiesto toho použije používateľa svojho obrazu.", + "The command uses options that cannot be translated:": "Príkaz používa voľby, ktoré nemožno previesť na nastavenia LXC:", "The command works out a value by running another command:": "Príkaz vytvorí hodnotu spustením iného príkazu:", "The compatibility check raised failures that may break the system after restore.": "Kontrola kompatibility našla zlyhania, ktoré môžu po obnove poškodiť systém.", "The configuration changed after the backup was restored; the recovery is not confirmed": "Konfigurácia zmenená po obnovení zálohy; obnova nie je potvrdená", @@ -6390,7 +6390,7 @@ "The configuration must run as root on Proxmox VE": "Konfigurácia musí bežať ako koreň na Proxmox VE", "The configuration of a new member changed after it was created": "Nastavenie nového člena sa zmenilo po jeho vytvorení", "The configuration stopped because of an unexpected error": "Konfigurácia sa zastavila kvôli neočakávanej chybe", - "The configured credential helper could not be used. Check its installation and credential store.": "Nepodarilo sa použiť nakonfigurovaného pomocníka poverení. Skontrolujte jeho inštaláciu a úložisko poverení.", + "The configured credential helper could not be used. Check its installation and credential store.": "Nakonfigurovaný pomocný program na správu prihlasovacích údajov sa nedá použiť. Skontrolujte jeho inštaláciu a úložisko prihlasovacích údajov.", "The console of the container could not be configured": "Konzolu kontajnera nebolo možné nakonfigurovať", "The consume/export volumes need at least 1 GB": "Objem spotreby/vývozu potrebuje najmenej 1 GB", "The container could not be removed automatically:": "Nádoba sa nedala automaticky odstrániť:", @@ -6403,7 +6403,7 @@ "The container does not exist:": "Nádoba neexistuje:", "The container does not have the fuse=1 feature enabled": "Kontajner nemá poistky = 1 zapnuté", "The container does not need it any more; an update downloads the new version when there is one.": "Kontajner už nepotrebuje; aktualizácia si stiahne novú verziu, keď je.", - "The container gets its own address and its own volumes, so the networks and volumes declared in the file are not used.": "Kontajner dostane svoju vlastnú adresu a svoje vlastné objemy, takže siete a objemy deklarované v súbore nie sú použité.", + "The container gets its own address and its own volumes, so the networks and volumes declared in the file are not used.": "Kontajner dostane vlastnú adresu a vlastné dátové úložiská, preto sa siete a úložiská definované v súbore nepoužijú.", "The container has advanced Proxmox settings outside the supported profile": "Kontajner má pokročilé nastavenia Proxmox mimo podporovaného profilu", "The container has an operation pending; finish or recover it first": "Kontajner má čakajúcu operáciu;najskôr ho dokončite alebo obnovte", "The container identity changed; nothing was adopted": "Identita kontajnera sa zmenila;nič nebolo prijaté", @@ -6423,13 +6423,13 @@ "The container stopped before the GPU permissions were verified:": "Kontajner sa zastavil pred overením povolení GPU:", "The container stopped before the application responded:": "Nádobka sa pred podaním žiadosti zastavila:", "The container stopped:": "Kontajner sa zastavil:", - "The container takes its time zone from Proxmox, so the time files of the host are not attached to it.": "Kontajner trvá časové pásmo od Proxmox, takže časové súbory hostiteľa nie sú pripojené k nemu.", + "The container takes its time zone from Proxmox, so the time files of the host are not attached to it.": "Kontajner preberá časové pásmo z Proxmoxu, preto sa doň nepripájajú súbory hostiteľa s nastavením času.", "The container was changed outside ProxMenux and an update would discard those changes:": "Kontajner bol zmenený mimo ProxMenux a aktualizácia by sa zbaviť týchto zmien:", "The container was created from a downloaded OCI image": "Kontajner bol vytvorený zo stiahnutého obrázku OCI", "The containers do not need them any more; an update downloads the new versions when there are any.": "Kontajnery ich už nepotrebujú; aktualizácia stiahne nové verzie, ak nejaké existujú.", "The containers were created from downloaded OCI images": "Kontajnery boli vytvorené zo stiahnutých obrázkov OCI", "The coordinated backup was modified": "Koordinovaná záloha bola zmenená", - "The credential file changed during this operation. Try again; it was not overwritten.": "Počas tejto operácie sa zmenil súbor poverení. Skúste to znova;nebolo to prepísané.", + "The credential file changed during this operation. Try again; it was not overwritten.": "Súbor s prihlasovacími údajmi sa počas tejto operácie zmenil. Skúste to znova; súbor nebol prepísaný.", "The current driver will be completely uninstalled before installing the new version. Continue?": "Aktuálny ovládač sa pred inštaláciou novej verzie úplne odinštaluje. Pokračovať?", "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.": "Aktuálny obraz uloženého kanála bude skontrolovaný a stiahnutý. Zdroje, cesty a GPU sú udržiavané. CT je zastavený počas výmeny a natívne zálohovanie je vytvorené ako prvé.", "The current record is missing for": "Aktuálny záznam chýba", @@ -6437,7 +6437,7 @@ "The current template changes the template identity or image repository; an explicit migration is required": "Aktuálna šablóna zmení identitu šablóny alebo úložisko obrázkov;vyžaduje sa explicitná migrácia", "The current template requires a new persistent path:": "Aktuálna šablóna requires novú pretrvávajúcu cestu:", "The custom path cannot hide system directories": "Vlastná cesta nemôže skryť systémové adresáre", - "The custom path overlaps another mount": "Vlastná cesta sa prekrýva s inou montážou", + "The custom path overlaps another mount": "Vlastná cesta sa prekrýva s iným bodom pripojenia", "The data and document volumes need at least 8 GB": "Údaje a objemy dokumentov potrebujú najmenej 8 GB", "The database server must accept connections from the IP address of this container, with a user that is not limited to localhost.": "Databázový server musí prijímať pripojenia z IP adresy tohto kontajnera s užívateľom, ktorý nie je obmedzený na localhost.", "The dedicated adapter still requires replaying its rootfs changes": "Špecializovaný adaptér stále requires prehráva svoje rootfs zmeny", @@ -6469,7 +6469,7 @@ "The file does not exist, is empty or is not readable.": "Súbor neexistuje, je prázdny alebo sa nedá čítať.", "The file does not exist:": "Súbor neexistuje:", "The file is not a ProxMenux oci-compose.": "Súbor nie je ProxMenux oci-compose.", - "The file is too large to be a Compose file": "Súbor je príliš veľký na to, aby bol súbor skladať", + "The file is too large to be a Compose file": "Súbor je príliš veľký na súbor Compose", "The file is too large to be an oci-compose": "Súbor je príliš veľký na to, aby bol oci-compose", "The filesystem": "Súborový systém", "The final cleanup did not complete:": "Konečné vyčistenie nedokončilo:", @@ -6514,10 +6514,10 @@ "The host-monitor firewall subnet changed; no firewall rule was added": "Podsieť firewallu pre monitor hostiteľa sa zmenila; žiadne pravidlo sa nepridalo", "The host-monitor web interface uses the host network.": "Webové rozhranie monitora hostiteľa používa sieť hostiteľa.", "The identity of a member was replaced": "Identita člena bola nahradená", - "The image cache path is unsafe. Check the template storage before trying again.": "Cesta vyrovnávacej pamäte obrázkov nie je bezpečná. Pred opätovným pokusom skontrolujte úložisko šablóny.", + "The image cache path is unsafe. Check the template storage before trying again.": "Cesta k vyrovnávacej pamäti obrazov nie je bezpečná. Pred ďalším pokusom skontrolujte úložisko šablón.", "The image changes the user expected by the adapter": "Obrázok mení používateľa očakávaný adaptérom", - "The image could not be downloaded or verified. Check registry and storage access, then try again.": "Obrázok sa nepodarilo stiahnuť alebo overiť. Skontrolujte prístup k registrom a ukladaciemu priestoru a skúste to znova.", - "The image could not be read from its registry:": "Obrázok sa nepodarilo prečítať z jeho registra:", + "The image could not be downloaded or verified. Check registry and storage access, then try again.": "Obraz sa nepodarilo stiahnuť alebo overiť. Skontrolujte prístup k registru a úložisku a skúste to znova.", + "The image could not be read from its registry:": "Obraz sa nepodarilo načítať z jeho registra:", "The image declares data paths that are still stored in the rootfs": "Obrázok deklaruje dátové cesty, ktoré sú stále uložené v rootfs", "The image did not grant the application user access to the devices; check its native init. Host permissions were not relaxed.": "Obrázok neumožňoval používateľovi aplikácie prístup k zariadeniam; skontrolujte jeho rodený init. Povolenie hostiteľa nebolo uvoľnené.", "The image did not pass the integrity check": "Obrázok neprešiel kontrolou integrity", @@ -6527,10 +6527,10 @@ "The image expects files that are given to it one by one:": "Obrázok očakáva súbory, ktoré sú mu dané jeden po druhom:", "The image is already up to date; nothing was changed.": "Obraz je už aktuálny, nič sa nezmenilo.", "The image is in its registry, for one architecture.": "Obraz je vo svojom registri, pre jednu architektúru.", - "The image is in its registry.": "Obrázok je v jeho registri.", - "The image is in its registry:": "Obrázok je vo svojom registri:", - "The image manifest failed integrity verification. Try again or contact the image publisher.": "Overenie integrity manifestu obrázka zlyhalo. Skúste to znova alebo kontaktujte vydavateľa obrázkov.", - "The image or tag was not found on {registry}, or this account cannot access it. Check the reference.": "Obrázok alebo značka sa na {registry} nenašla alebo k nim tento účet nemá prístup. Skontrolujte referenciu.", + "The image is in its registry.": "Obraz je dostupný vo svojom registri.", + "The image is in its registry:": "Obraz je dostupný vo svojom registri:", + "The image manifest failed integrity verification. Try again or contact the image publisher.": "Overenie integrity manifestu obrazu zlyhalo. Skúste to znova alebo kontaktujte vydavateľa obrazu.", + "The image or tag was not found on {registry}, or this account cannot access it. Check the reference.": "Obraz alebo tag sa v registri {registry} nenašiel alebo k nemu tento účet nemá prístup. Skontrolujte odkaz na obraz.", "The image requests NVIDIA, but the host has no working NVIDIA driver": "Obrázok požaduje NVIDIA, ale hostiteľ nemá žiadny funkčný ovládač NVIDIA", "The image requests disabling part of the AppArmor or seccomp confinement. Continue only if you trust the image and accept this risk.": "Obraz si vyžaduje vypnutie časti AppArmor alebo seccomp väzenia. Pokračujte len vtedy, ak dôverujete obrazu a prijmete toto riziko.", "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.": "Obraz si vyžaduje vypnutie časti AppArmor alebo seccomp väzenia. Skladba ponúka voliteľnú AppArmor alebo seccomp relaxáciu; zostane vypnutá, ak si ju užívateľ nevyberie. Pokračujte len vtedy, ak dôverujete obrazu a prijmete toto riziko.", @@ -6668,15 +6668,15 @@ "The record or diagnosis could not be completed; no update was run.": "Záznam alebo diagnóza nemohla byť dokončená; žiadna aktualizácia nebola spustená.", "The recovery did not complete. Review the log and choose \"Recover\" again for this container in the OCI management menu.": "Obnova sa nedokončila. Skontrolujte záznam a v ponuke Správca OCI aplikácií pri tomto kontajneri znova vyberte \"Obnoviť\".", "The recovery did not complete. Review the log and choose \"{choice}\" again for this container in the OCI management menu.": "Obnova sa nedokončila. Skontrolujte záznam a v ponuke Správca OCI aplikácií pri tomto kontajneri znova vyberte \"{choice}\".", - "The registry authentication file is invalid; it was not changed.": "Overovací súbor registra je neplatný;nebolo to zmenené.", - "The registry authentication file must be owned by root with mode 600.": "Overovací súbor registra musí vlastniť root s režimom 600.", - "The registry authentication file must have an absolute path.": "Overovací súbor registra musí mať absolútnu cestu.", - "The registry authentication path cannot contain symbolic links.": "Cesta na overenie registra nemôže obsahovať symbolické odkazy.", - "The registry authentication path has an unsafe parent directory.": "Cesta na overenie registra obsahuje nebezpečný nadradený adresár.", - "The registry credential directory must be owned by root with mode 700.": "Adresár poverení registra musí vlastniť root s režimom 700.", + "The registry authentication file is invalid; it was not changed.": "Súbor s prihlasovacími údajmi registrov je neplatný; nebol zmenený.", + "The registry authentication file must be owned by root with mode 600.": "Súbor s prihlasovacími údajmi registrov musí vlastniť root a musí mať oprávnenia 600.", + "The registry authentication file must have an absolute path.": "Cesta k súboru s prihlasovacími údajmi registrov musí byť absolútna.", + "The registry authentication path cannot contain symbolic links.": "Cesta k súboru s prihlasovacími údajmi registrov nesmie obsahovať symbolické odkazy.", + "The registry authentication path has an unsafe parent directory.": "Nadradený adresár súboru s prihlasovacími údajmi registrov nie je bezpečný.", + "The registry credential directory must be owned by root with mode 700.": "Adresár s prihlasovacími údajmi registrov musí vlastniť root a musí mať oprávnenia 700.", "The registry did not return the saved image digest": "Register nevrátil uložený image digest", - "The registry returned incomplete or unsupported image metadata.": "Register vrátil neúplné alebo nepodporované metadáta obrázka.", - "The registry returned invalid or unsupported image metadata.": "Register vrátil neplatné alebo nepodporované metadáta obrázka.", + "The registry returned incomplete or unsupported image metadata.": "Register vrátil neúplné alebo nepodporované metadáta obrazu.", + "The registry returned invalid or unsupported image metadata.": "Register vrátil neplatné alebo nepodporované metadáta obrazu.", "The remote does not exist; create and authorize it first in the WebUI:": "Vzdialenosť neexistuje; vytvoriť a schváliť ju ako prvý na WebUI:", "The remote installer must run as root on Proxmox VE": "Diaľkový inštalátor musí bežať ako koreň na 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.": "Vzdialený musí byť už vytvorený a schválený v Rclone web UI. Tento operation reštartuje CT a zverejňuje dva pohľady FUSE na hostiteľa.", @@ -6753,8 +6753,8 @@ "The server may require authentication for actual share access.": "Server môže vyžadovať prihlásenie pre samotný prístup k zdieľaniu.", "The server refused password authentication for": "Server odmietol prihlásenie heslom pre", "The server rejected": "Server odmietol", - "The service builds its own image; only a published image can be installed": "Služba buduje svoj vlastný obraz; môže byť nainštalovaný iba zverejnený obrázok", - "The service declares no image:": "Služba neprehlasuje žiadny obrázok:", + "The service builds its own image; only a published image can be installed": "Služba zostavuje vlastný obraz; nainštalovať možno iba zverejnený obraz", + "The service declares no image:": "Služba nemá zadaný žiadny obraz:", "The setting has no final value:": "Nastavenie nemá žiadnu konečnú hodnotu:", "The settings could not be fully rolled back. Review the container and its saved modification before continuing.": "Nepodarilo sa vrátiť všetky nastavenia. Pred pokračovaním skontrolujte kontajner a uloženú zmenu.", "The share already exists in smb.conf:": "Zdieľanie už existuje v smb.conf:", @@ -6844,7 +6844,7 @@ "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 Proxmox Backup Server has no active subscription, switch to the no-subscription repository? The inaccessible Enterprise PBS source will be disabled.": "Tento Proxmox Backup Server nemá aktívne predplatné. Prepnúť na repozitár bez predplatného? Nedostupný zdroj Enterprise PBS bude vypnutý.", "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 patrí registru {registry}. Zadajte obraz 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:", @@ -6876,10 +6876,10 @@ "This explicitly marks the container as privileged": "Týmto sa kontajner výslovne označí ako privilegovaný", "This file decides what is mounted and with which privileges. Install it only if it comes from a source you trust.": "Tento súbor rozhoduje o tom, čo sa pripojí a s akými oprávneniami. Nainštalujte ho iba vtedy, ak pochádza zo zdroja, ktorému dôverujete.", "This guarantees that device nodes are available before applying LXC GPU config.": "Tým sa zabezpečí, že device nodes budú dostupné ešte pred použitím GPU nastavenia pre LXC.", - "This host architecture is not supported by the OCI image importer.": "Táto hostiteľská architektúra nie je podporovaná importérom obrázkov OCI.", + "This host architecture is not supported by the OCI image importer.": "Importér obrazov OCI nepodporuje architektúru tohto hostiteľa.", "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.": "Tento hostiteľ nemá žiadne aktívne predplatné, prepnúť na úložisko bez predplatného? Neprístupný zdroj Enterprise PVE bude zakázaný. Enterprise Ceph zdroje, ak sú prítomné, budú deaktivované bez výberu náhradného Ceph kanála; v prípade potreby nakonfigurujte Ceph samostatne.", - "This image cannot be installed as it is described:": "Tento obrázok nie je možné nainštalovať, ako je popísané:", - "This image has no compatible Linux image for this host ({architecture}).": "Tento obrázok nemá žiadny kompatibilný obraz Linuxu pre tohto hostiteľa ({architecture}).", + "This image cannot be installed as it is described:": "Tento obraz nemožno nainštalovať podľa zadanej konfigurácie:", + "This image has no compatible Linux image for this host ({architecture}).": "Tento obraz nemá variant Linuxu kompatibilný s týmto hostiteľom ({architecture}).", "This image requires the host module": "Tento obrázok requires hostiteľský modul", "This import rejects these paths without checking whether they are files or directories.": "Tento import odmieta tieto cesty bez kontroly, či ide o súbory alebo adresáre.", "This installation will:": "Táto inštalácia urobí toto:", @@ -7145,7 +7145,7 @@ "Unsafe private configuration path": "Nebezpečná konfiguračná dráha", "Unsafe qBittorrent configuration path": "Nebezpečná konfiguračná dráha qBittorrent", "Unsafe record": "Nebezpečný záznam", - "Unsafe registry credential lock.": "Nebezpečný zámok poverení registra.", + "Unsafe registry credential lock.": "Zámok prihlasovacích údajov registrov nie je bezpečný.", "Unsafe registry directory": "Nebezpečný adresár registrov", "Unsafe registry lock": "Nebezpečný zámok registra", "Unsafe rootfs for the capture": "Nebezpečné rootfs pre zachytenie", @@ -7213,7 +7213,7 @@ "Update cancelled by user": "Aktualizácia zrušená používateľom", "Update completed. Data kept.": "Aktualizácia dokončená. Údaje uchovávané.", "Update completed. Press Enter to continue...": "Aktualizácia dokončená. Pokračujte stlačením Enter...", - "Update credentials": "Aktualizujte poverenia", + "Update credentials": "Aktualizovať prihlasovacie údaje", "Update every container of the application": "Aktualizovať každý kontajner aplikácie", "Update kernel to compatible version": "Aktualizovať kernel na kompatibilnú verziu", "Update now?": "Aktualizácia?", @@ -7286,7 +7286,7 @@ "Use a registry hostname, for example ghcr.io or registry.example.com:5000.": "Použite názov hostiteľa registra, napríklad ghcr.io alebo registry.example.com:5000.", "Use an existing SSH private key file on this host": "Použiť existujúci súbor súkromného SSH kľúča na tomto hostovi", "Use an existing keyfile": "Použiť existujúci keyfile", - "Use an image reference, for example ghcr.io/owner/app:latest.": "Použite odkaz na obrázok, napríklad ghcr.io/owner/app:latest.", + "Use an image reference, for example ghcr.io/owner/app:latest.": "Použite odkaz na obraz, napríklad ghcr.io/owner/app:latest.", "Use as-is — keep data and filesystem": "Použiť tak, ako je - ponechať dáta aj súborový systém", "Use content types according to your use case.": "Typy obsahu zvoľte podľa toho, na čo bude úložisko slúžiť.", "Use default": "Použiť predvolené", @@ -7477,7 +7477,7 @@ "Vivaldi is a Norwegian freeware, cross-platform web browser with a built-in email client developed by Vivaldi Technologies.": "Vivaldi je nórsky freeware, cross-platform webový prehliadač s vstavaným e-mailovým klientom vyvinutým Vivaldi Technologies.", "Volume configuration cancelled": "Konfigurácia hlasitosti zrušená", "Volume options are not yet supported": "Možnosti objemu zatiaľ nie sú podporované", - "Volume size in GB": "Veľkosť objemu v GB", + "Volume size in GB": "Veľkosť dátového disku v GB", "Volumes attached": "Pripojené objemy", "Volumes prepared for the first start:": "Objemy pripravené na prvý začiatok:", "Volumes shared between services are not yet supported": "Objemy zdieľané medzi službami zatiaľ nie sú podporované", @@ -7544,7 +7544,7 @@ "Webtop - Alpine, Ubuntu, Fedora, and Arch based containers containing full desktop environments in officially supported flavors accessible via any modern web browser.": "Webtop - Alpine, Ubuntu, Fedora, a Arch založené kontajnery obsahujúce plné pracovné prostredie v oficiálne podporovaných príchutiach prístupných cez akýkoľvek moderný webový prehliadač.", "Weekly, Sunday 02:00": "Týždenne, nedeľa 02:00", "Weixin (WeChat) is an instant messaging, social media, and mobile payment app developed by Tencent.": "Weixin (WeChat) je okamžité správy, sociálne médiá, a mobilné platobné aplikácie vyvinuté Tencent.", - "What cannot be translated:": "Čo sa nedá preložiť:", + "What cannot be translated:": "Čo nemožno previesť na nastavenia LXC:", "What do you want to change?": "Čo chcete zmeniť?", "What do you want to do?": "Čo chcete urobiť?", "What runs the recognition of Immich": "Čo spúšťa rozpoznávanie Immich", @@ -7687,7 +7687,7 @@ "Zeroing partition": "Nulujem oddiel", "Znc is an IRC network bouncer or BNC. It can detach the client from the actual IRC server, and also from selected channels. Multiple clients from different locations can connect to a single ZNC account simultaneously and therefore appear under the same nickname on IRC.": "Znc je vyhadzovač siete IRC alebo BNC. Môže odpojiť klienta od aktuálneho IRC servera, ako aj od vybraných kanálov. Viacerí klienti z rôznych miest sa môžu pripojiť na jeden ZNC účet súčasne, a preto sa objaví pod rovnakou prezývkou na IRC.", "Zotero is a free, easy-to-use tool to help you collect, organize, annotate, cite, and share research.": "Zotero je bezplatný, ľahko použiteľný nástroj, ktorý vám pomôže zhromažďovať, organizovať, anotovať, citovať a zdieľať výskum.", - "a device it asks for cannot be translated:": "zariadenie, ktoré požaduje, nemožno preložiť:", + "a device it asks for cannot be translated:": "požadované zariadenie nemožno pripojiť do LXC:", "a different host monitor include already exists:": "už existuje iný include hostiteľského monitora:", "a value is required": "hodnota je required", "aMule WebUI (password only, no username)": "aMule WebUI (iba heslo, žiadne užívateľské meno)", @@ -7772,12 +7772,12 @@ "disks present": "disky prítomné", "dkms autoinstall did not activate:": "dkms autoinstall sa neaktivoval:", "dkms.conf generated.": "dkms.conf bol vytvorený.", - "docker run command": "príkaz docker run", + "docker run command": "príkazu docker run", "docker run command of the application": "príkaz docker run aplikácie", "does not exist on this host. Path not added.": "na tomto hostovi neexistuje. Cesta nebola pridaná.", "does not exist. Exiting.": "neexistuje. Končím.", "doplarr_rs starts from the example configuration and connects to nothing. Write the token of your Discord bot in discord_token in /config/config.toml inside the container.": "doplarr_rs začína od konfigurácie príkladu a spája sa s ničím. Napíšte token svojho Discord bot v discord token v /config/config.toml vnútri kontajnera.", - "downloaded Compose file": "stiahnutý súbor", + "downloaded Compose file": "stiahnutého súboru Compose", "dpkg still reports unfinished package work; review": "dpkg stále hlási nedokončenú prácu s balíkom;recenzia", "driver components": "komponenty vodiča", "driver:": "ovládač:", @@ -7836,7 +7836,7 @@ "hostpci entries for all IOMMU group devices": "hostpci položky pre všetky zariadenia IOMMU skupiny", "hostpci entries for selected GPU functions (full IOMMU group will be enforced after reboot)": "hostpci položky pre vybrané funkcie GPU (celá IOMMU skupina sa vynúti po reštarte)", "hour(s)": "hod.", - "https if the image serves TLS": "https, ak obrázok slúži TLS", + "https if the image serves TLS": "https, ak obraz poskytuje TLS", "iSCSI Content Type": "Typ obsahu iSCSI", "iSCSI Daemon (iscsid): RUNNING": "iSCSI služba (iscsid): BEŽÍ", "iSCSI Daemon (iscsid): STOPPED": "iSCSI služba (iscsid): ZASTAVENÁ", @@ -7854,7 +7854,7 @@ "iSCSI tools installed": "iSCSI nástroje sú nainštalované", "iftop usage": "Použitie iftop", "image cache on": "Comment", - "image itself": "samotný obrázok", + "image itself": "samotného obrazu", "imported:": "importované:", "in CT": "v CT", "in backups": "v zálohách", @@ -7999,7 +7999,7 @@ "oldest driver offered:": "najstarší ponúkaný ovládač:", "on": "o", "on SSD/NVMe pools that support discard": "na SSD/NVMe pooloch, ktoré podporujú discard", - "one of its services declares no image": "jedna zo svojich služieb neprehlasuje žiadny obraz", + "one of its services declares no image": "jedna zo služieb nemá zadaný žiadny obraz", "one of its services is not written as a service": "jedna z jej služieb nie je napísaná ako služba", "openssl encryption failed.": "Šifrovanie cez openssl zlyhalo.", "openssl is not installed — cannot create recovery copy. Install openssl and retry.": "openssl nie je nainštalovaný - nedá sa vytvoriť obnovovacia kópia. Nainštalujte openssl a skúste to znova.", @@ -8014,7 +8014,7 @@ "packages.": "balíkov.", "parent PF:": "rodičovská PF:", "partition(s). Partition table preserved.": "oddielov. Tabuľka oddielov zostala zachovaná.", - "pasted Compose file": "vložený súbor", + "pasted Compose file": "vloženého súboru Compose", "paths for next boot (/etc/pve, guests, drivers, ...)": "cesty na najbližší štart (/etc/pve, hostia, ovládače, ...)", "pct exec authorization failed": "Autorizácia cez pct exec zlyhala", "pct push failed. Check log:": "pct push zlyhalo. Skontrolujte záznam:", @@ -8208,10 +8208,10 @@ "{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} 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} is rate limiting requests. Wait a while and try again.": "Register {registry} obmedzuje počet požiadaviek. 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?": "Register {registry} odmietol prístup k tomuto obrazu:\n{reference}\n\nAk je obraz súkromný, prihláste sa účtom, ktorý má oprávnenie stiahnuť ho.\n\nPrihlásiť 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.", + "{registry} returned invalid or unsupported image metadata.": "Register {registry} vrátil neplatné alebo nepodporované metadáta obrazu.", "— Full/Custom restore will skip kernel-tied paths": "- úplná/vlastná obnova preskočí cesty viazané na kernel", "— disk may be busy. Skipping fstab removal.": "- disk sa možno používa. Preskakujem odstránenie z fstab.", "— restore proceeds as same-version (verified safe)": "- obnova pokračuje ako pri rovnakej verzii (overené ako bezpečné)", @@ -8243,5 +8243,25 @@ "⚠ Disk data will NOT be erased.": "⚠ Dáta na disku sa NEVYMAŽÚ.", "⚠ Disk will be unmounted and removed from /etc/fstab.": "⚠ Disk sa odpojí a odstráni z /etc/fstab.", "⚠ The /etc/fstab entry will be removed.": "⚠ Záznam v /etc/fstab bude odstránený.", - "⚠ The disk will be unmounted.": "⚠ Disk bude odpojený." + "⚠ The disk will be unmounted.": "⚠ Disk bude odpojený.", + "it describes more than one image": "definuje viac než jeden obraz", + "it uses Compose configs, which have no equivalent here": "používa nastavenia Compose configs, ktoré tu nemajú ekvivalent", + "the devices it asks for are not written in a way that can be read": "požadované zariadenia sú zadané v nepodporovanom formáte", + "its health check is not written in a way that can be read": "kontrola stavu je zadaná v nepodporovanom formáte", + "its stop timeout is not written in a way that can be read": "časový limit zastavenia je zadaný v nepodporovanom formáte", + "its shared memory size is not written in a way that can be read": "veľkosť zdieľanej pamäte je zadaná v nepodporovanom formáte", + "the resource limits it asks for cannot be applied": "požadované limity systémových prostriedkov nemožno uplatniť", + "the memory limit it asks for cannot be applied": "požadovaný limit pamäte nemožno uplatniť", + "it asks for two different memory limits": "požaduje dva rozdielne limity pamäte", + "Compose environment must be a list or a mapping.": "Položka environment v súbore Compose musí byť zoznam alebo mapa kľúčov a hodnôt.", + "Compose volumes must be a list.": "Položka volumes v súbore Compose musí byť zoznam.", + "Compose ports must be a list.": "Položka ports v súbore Compose musí byť zoznam.", + "The Compose file has no services.": "Súbor Compose neobsahuje žiadne služby.", + "The Compose document must be a mapping.": "Dokument Compose musí byť mapa kľúčov a hodnôt.", + "The Compose file has no x-casaos metadata.": "Súbor Compose neobsahuje metadáta x-casaos.", + "x-casaos.main must name an existing service.": "Položka x-casaos.main musí odkazovať na existujúcu službu.", + "The main Compose service has no image.": "Hlavná služba v súbore Compose nemá zadaný žiadny obraz.", + "Invalid Compose volume path:": "Neplatná cesta dátového úložiska v súbore Compose:", + "Invalid Compose port:": "Neplatný port v súbore Compose:", + "Invalid application identifier:": "Neplatný identifikátor aplikácie:" } diff --git a/oci/src/proxmenux_oci/custom.py b/oci/src/proxmenux_oci/custom.py index 62f3acfa..acc14355 100644 --- a/oci/src/proxmenux_oci/custom.py +++ b/oci/src/proxmenux_oci/custom.py @@ -21,7 +21,7 @@ from .cli import install_template from .i18n import source_text from .installer import ADVANCED_MODE, DEFAULT_MODE from .converter import ConversionError -from .i18n import translate +from .i18n import N_, translate from .registry_auth import RegistryError, refuses_access, validate_image from .ui import UserCancelled @@ -533,16 +533,16 @@ def read_definition(ui) -> tuple[str, str]: BLOCKER_TEXTS = { - 'multi-service-compose': 'it describes more than one image', - 'native-multi-lxc-orchestrator-not-yet-implemented': 'it describes more than one image', - 'top-level-configs': 'it uses Compose configs, which have no equivalent here', - 'devices-format': 'the devices it asks for are not written in a way that can be read', - 'healthcheck-format': 'its health check is not written in a way that can be read', - 'stop-grace-period-format': 'its stop timeout is not written in a way that can be read', - 'shm-size-format': 'its shared memory size is not written in a way that can be read', - 'ulimits-format-or-resource': 'the resource limits it asks for cannot be applied', - 'mem-limit-format-or-below-proxmox-minimum': 'the memory limit it asks for cannot be applied', - 'mem-limit-deploy-consistency-review': 'it asks for two different memory limits', + 'multi-service-compose': N_('it describes more than one image'), + 'native-multi-lxc-orchestrator-not-yet-implemented': N_('it describes more than one image'), + 'top-level-configs': N_('it uses Compose configs, which have no equivalent here'), + 'devices-format': N_('the devices it asks for are not written in a way that can be read'), + 'healthcheck-format': N_('its health check is not written in a way that can be read'), + 'stop-grace-period-format': N_('its stop timeout is not written in a way that can be read'), + 'shm-size-format': N_('its shared memory size is not written in a way that can be read'), + 'ulimits-format-or-resource': N_('the resource limits it asks for cannot be applied'), + 'mem-limit-format-or-below-proxmox-minimum': N_('the memory limit it asks for cannot be applied'), + 'mem-limit-deploy-consistency-review': N_('it asks for two different memory limits'), } @@ -730,7 +730,7 @@ def _name(ui, template: dict[str, Any]) -> str: return name -def explore(ui) -> None: +def _explore(ui) -> None: """Reads a Compose file, a docker run command, an image reference or an oci-compose, reports what ProxMenux would install from it and installs it.""" text, origin = read_definition(ui) @@ -784,3 +784,43 @@ def explore(ui) -> None: else: name = _name(ui, template) install_template(ui, template, name, mode) + + +def conversion_message(error: ConversionError) -> str: + """Render legacy converter diagnostics at the custom-image UI boundary. + + Converter exceptions are also consumed by catalog tools. Keep their + original text, and any diagnostic data, outside this localized UI. + """ + text = str(error) + exact = { + 'environment must be a list or a mapping': N_('Compose environment must be a list or a mapping.'), + 'volumes must be a list': N_('Compose volumes must be a list.'), + 'ports must be a list': N_('Compose ports must be a list.'), + 'The CasaOS Compose file has no services': N_('The Compose file has no services.'), + 'The CasaOS document is not a Compose mapping': N_('The Compose document must be a mapping.'), + 'The Compose file has no x-casaos metadata': N_('The Compose file has no x-casaos metadata.'), + 'x-casaos.main no identifica un servicio valido': N_('x-casaos.main must name an existing service.'), + 'The main CasaOS service declares no image': N_('The main Compose service has no image.'), + } + prefixes = { + 'Ruta de volumen no valida:': N_('Invalid Compose volume path:'), + 'Puerto no valido:': N_('Invalid Compose port:'), + 'Cannot normalise the CasaOS identifier:': N_('Invalid application identifier:'), + 'Docker Compose CasaOS no valido:': N_('The Compose file is not valid YAML:'), + } + if text in exact: + translated = translate(exact[text]) + return text if translated == exact[text] else translated + for prefix, source in prefixes.items(): + if text.startswith(prefix): + translated = translate(source) + return text if translated == source else translated + text[len(prefix):] + return text + + +def explore(ui) -> None: + try: + _explore(ui) + except ConversionError as error: + raise ConversionError(conversion_message(error)) from error