From 3b12e68e8ce6f6be097844a1d388b6345d9016b8 Mon Sep 17 00:00:00 2001 From: VAIO73 <50487331+Vaso73@users.noreply.github.com> Date: Tue, 20 Oct 2026 18:00:22 +0000 Subject: [PATCH] i18n: clarify OCI storage and shared paths in Slovak --- .github/scripts/tests/test_oci_storage_sk.py | 209 +++++++++++++++++++ lang/sk.json | 50 ++--- 2 files changed, 234 insertions(+), 25 deletions(-) create mode 100644 .github/scripts/tests/test_oci_storage_sk.py diff --git a/.github/scripts/tests/test_oci_storage_sk.py b/.github/scripts/tests/test_oci_storage_sk.py new file mode 100644 index 00000000..df1d83bc --- /dev/null +++ b/.github/scripts/tests/test_oci_storage_sk.py @@ -0,0 +1,209 @@ +"""Slovak storage questions through real builders and UI; installation forbidden.""" +from contextlib import redirect_stdout +import copy +import io +import json +from pathlib import Path +import subprocess +import sys +from types import SimpleNamespace +import unittest +from unittest.mock import Mock, patch + +ROOT=Path(__file__).resolve().parents[3] +sys.path[:0]=[str(ROOT/'oci/src'),str(ROOT/'oci/remote')] +from proxmenux_oci import cli, custom, custom_mounts, extra_devices, i18n, installer, ui as native_ui, updates +from proxmenux_oci.catalog import Catalog + + +class Recorder: + def __init__(self, answers=None): + self.answers=answers or {} + self.asked=[] + self.messages=[] + def _answer(self,text,default): + self.asked.append(text) + return self.answers.get(text,default) + def ask(self,text,default=None,**kwargs):return self._answer(text,default if default is not None else '') + def password(self,text,**kwargs):return self._answer(text,'fictional-value-for-tests-000000') + def choose(self,text,options,default=None,**kwargs):return self._answer(text,default) + def confirm(self,text,default=False,**kwargs):return self._answer(text,default) + def checklist(self,text,options,defaults=None,**kwargs):return self._answer(text,defaults or []) + def review(self,*args,**kwargs):return False + def info(self,text):pass + def message(self,text,*args):self.messages.append(text) + + +class StorageFixture(unittest.TestCase): + def setUp(self): + self.catalog=Catalog(ROOT/'oci') + self.sk=json.loads((ROOT/'lang/sk.json').read_text()) + self.forbidden=[] + self.patch(i18n,'_language','sk') + self.patch(i18n,'_cache',self.sk) + self.patch(installer.host,'storages',side_effect=lambda content: [ + {'storage':'local-lvm','type':'lvmthin','avail':100*2**30}, + {'storage':'fiction-storage','type':'dir','avail':200*2**30}] if content=='rootdir' else [ + {'storage':'local','type':'dir','avail':100*2**30}]) + self.patch(installer.host,'bridges',return_value=[{'iface':'vmbr0','cidr':'192.0.2.10/24'}]) + self.patch(installer.host,'timezone',return_value='Europe/Bratislava') + self.patch(installer.host,'gpus',return_value={'intel':[],'amd':[],'nvidia':False}) + self.patch(installer.access,'ask_addresses',side_effect=lambda ui,bridge,names,*a:({name:'dhcp' for name in names},None)) + self.patch(installer.access,'ask_ipv4',return_value=('dhcp',None)) + for module,name in [(installer,'run_remote_install'),(cli,'run_remote_install'), + (cli.images,'offer_removal'),(subprocess,'run'),(subprocess,'Popen'),(subprocess,'check_output'), + (Path,'write_text'),(Path,'write_bytes'),(Path,'unlink')]: + self.forbidden.append(self.patch(module,name,side_effect=AssertionError('Forbidden effect: '+name))) + self.addCleanup(self.no_effects) + def patch(self,module,name,*args,**kwargs): + item=patch.object(module,name,*args,**kwargs);value=item.start();self.addCleanup(item.stop);return value + def no_effects(self): + for effect in self.forbidden:effect.assert_not_called() + def recorder(self,answers=None): + return Recorder({i18n.translate(key):value for key,value in (answers or {}).items()}) + def build(self,app,answers=None,mode=installer.ADVANCED_MODE): + ui=self.recorder(answers) + plan=installer.build_deployment(self.catalog.compose(app),ui,mode) + return ui,plan + + +class StorageWordingTests(StorageFixture): + def test_tandoor_files_question_and_minimum_error_keep_the_limit(self): + ui,plan=self.build('tandoor',{'Files volume size in GB':'9'}) + self.assertIn('Veľkosť dátového zväzku pre súbory v GB',ui.asked) + self.assertEqual(plan['media']['size_gb'],9) + with self.assertRaisesRegex(installer.InstallError,'Dátový zväzok súborov Tandoor musí mať najmenej 2 GB'): + self.build('tandoor',{'Files volume size in GB':'1'}) + + def test_paperless_storage_documents_and_consume_export_names(self): + ui,plan=self.build('paperless-ngx',{'Documents volume size in GB':'30', + 'Where to store the consume and export folders':'managed-volume','Size of each consume/export volume in GB':'3'}) + for text in ['Úložisko pre údaje a dokumenty aplikácie Paperless', + 'Veľkosť dátového zväzku pre dokumenty v GB', + 'Veľkosť každého dátového zväzku pre consume a export v GB']: + self.assertIn(text,ui.asked) + self.assertEqual((plan['media_size_gb'],plan['transfer']['size_gb'],plan['transfer']['backup']),(30,3,True)) + + def test_paperless_volume_limit_and_transfer_limit_errors(self): + with self.assertRaisesRegex(installer.InstallError,'Trvalé dátové zväzky aplikácie Paperless musia mať najmenej 8 GB'): + self.build('paperless-ngx',{'Documents volume size in GB':'7'}) + with self.assertRaisesRegex(installer.InstallError,'Dátové zväzky pre consume a export musia mať najmenej 1 GB'): + self.build('paperless-ngx',{'Where to store the consume and export folders':'managed-volume', + 'Size of each consume/export volume in GB':'0'}) + + def test_postgresql_question_and_error_are_shared_by_immich_and_nextcloud(self): + for app in ('immich','nextcloud-stack'): + with self.subTest(app=app): + ui,plan=self.build(app,{'PostgreSQL volume size in GB':'12'}) + self.assertIn('Veľkosť dátového zväzku PostgreSQL v GB',ui.asked) + self.assertEqual(plan['database_size_gb'],12) + with self.assertRaisesRegex(installer.InstallError,'Dátový zväzok PostgreSQL musí mať najmenej 8 GB'): + self.build(app,{'PostgreSQL volume size in GB':'7'}) + + def test_host_directory_remains_outside_the_container_backup(self): + ui,plan=self.build('nextcloud-stack',{'Where to store the Nextcloud files, configuration and data':'host-bind', + 'Shared host directory':'/fiction-only/existing-data'}) + self.assertIn('Zdieľaný adresár hostiteľa',ui.asked) + self.assertEqual((plan['application']['mode'],plan['application']['host_path'],plan['application']['backup']), + ('host-bind','/fiction-only/existing-data',False)) + + def test_default_and_advanced_builders_preserve_language_independent_plans(self): + for app in ('jellyfin','immich','nextcloud-stack','paperless-ngx','tandoor'): + for mode in (installer.DEFAULT_MODE,installer.ADVANCED_MODE): + with self.subTest(app=app,mode=mode): + _ui,slovak=self.build(app,mode=mode) + with patch.object(i18n,'_language','en'): + _ui,english=self.build(app,mode=mode) + self.assertEqual(slovak,english) + + def test_multi_path_cancel_and_invalid_selection_preserve_all_members(self): + services=[{'name':'main','main':True,'deployment':{'mounts':[]}}, + {'name':'database','deployment':{'mounts':[]}}] + original=copy.deepcopy(services) + ui=self.recorder({'Add extra paths to this stack':True,'Containers that will receive this path':[]}) + with self.assertRaisesRegex(ValueError,'^Vyberte aspoň jeden kontajner aplikácie$'): + custom_mounts.ask_stack_custom_mounts(ui,services,'fiction-storage') + self.assertIn('Pridať ďalšie cesty do aplikácie s viacerými kontajnermi',ui.asked) + self.assertEqual(services,original) + ui=self.recorder({'Add extra paths to this stack':True,'Containers that will receive this path':['main'], + 'Data location':None}) + with self.assertRaises(native_ui.UserCancelled):custom_mounts.ask_stack_custom_mounts(ui,services,'fiction-storage') + self.assertEqual(services,original) + + def test_shared_selection_error_in_device_flow_also_preserves_members(self): + services=[{'name':'main','main':True,'deployment':{}}];original=copy.deepcopy(services) + ui=self.recorder() + with patch.object(extra_devices,'ask_extra_devices',return_value=[{'kind':'usb','host_path':'/fiction-only/device'}]), \ + patch.object(ui,'checklist',return_value=[]): + with self.assertRaisesRegex(ValueError,'^Vyberte aspoň jeden kontajner aplikácie$'): + extra_devices.ask_stack_extra_devices(ui,services) + self.assertEqual(services,original) + + def test_selected_path_is_added_only_to_selected_member_with_backup(self): + services=[{'name':'main','main':True,'deployment':{'mounts':[]}}, + {'name':'database','deployment':{'mounts':[]}}] + ui=self.recorder({'Add extra paths to this stack':True,'Containers that will receive this path':['main']}) + custom_mounts.ask_stack_custom_mounts(ui,services,'fiction-storage') + self.assertEqual(services[1]['deployment']['mounts'],[]) + mount=services[0]['deployment']['mounts'][0] + self.assertEqual((mount['source'],mount['container_path'],mount['size_gb'],mount['backup']), + ('fiction-storage','/media-extra',8,True)) + self.assertIn('Pridať ďalšiu cestu do aplikácie s viacerými kontajnermi',ui.asked) + + def test_rclone_shared_directory_question_is_localized_without_creating_it(self): + ui=self.recorder({'Shared directory for copy/sync operations':'/fiction-only/rclone'}) + with patch.object(ui,'confirm',return_value=True): + plan=installer.build_deployment(self.catalog.compose('rclone'),ui,installer.ADVANCED_MODE) + self.assertIn('Zdieľaný adresár na kopírovanie a synchronizáciu',ui.asked) + self.assertTrue(any(m.get('source')=='/fiction-only/rclone' and not m['backup'] for m in plan['mounts'])) + + +class InputAndCancellationTests(StorageFixture): + def test_dialog_required_value_and_password_use_slovak_then_retry(self): + dialog=native_ui.DialogUI() + empty=subprocess.CompletedProcess('dialog',0,stderr='') + value=subprocess.CompletedProcess('dialog',0,stderr='fiction-value') + with patch.object(dialog,'_run',side_effect=[empty,value]),patch.object(dialog,'message') as message: + self.assertEqual(dialog.ask('fiction-field'),'fiction-value') + message.assert_called_once_with('Táto hodnota je povinná.') + with patch.object(dialog,'_run',side_effect=[empty,value,value]),patch.object(dialog,'message') as message: + self.assertEqual(dialog.password('fiction-field'),'fiction-value') + message.assert_called_once_with('Táto hodnota je povinná.') + + def test_terminal_required_value_and_password_are_also_localized(self): + terminal=native_ui.TerminalUI() + with patch('builtins.input',side_effect=['','fiction-value']),redirect_stdout(io.StringIO()) as output: + self.assertEqual(terminal.ask('fiction-field'),'fiction-value') + self.assertIn('Táto hodnota je povinná.',output.getvalue()) + with patch.object(native_ui.getpass,'getpass',side_effect=['','fiction-value','fiction-value']),redirect_stdout(io.StringIO()) as output: + self.assertEqual(terminal.password('fiction-field'),'fiction-value') + self.assertIn('Táto hodnota je povinná.',output.getvalue()) + + def test_real_install_flow_storage_cancel_and_final_no_never_dispatch(self): + template=self.catalog.compose('tandoor');original=copy.deepcopy(template) + dialog=native_ui.DialogUI() + for code in (1,255): + replies=[subprocess.CompletedProcess('dialog',0,stderr=value) for value in ('','fiction-stack','2','2048')] + replies.append(subprocess.CompletedProcess('dialog',code,stderr='')) + with self.subTest(code=code),patch.object(dialog,'_run',side_effect=replies) as run: + with self.assertRaises(native_ui.UserCancelled):cli.install_template(dialog,template,'tandoor',installer.ADVANCED_MODE) + self.assertEqual(run.call_count,5) + self.assertEqual(template,original) + self.assertIsNone(cli.install_template(self.recorder(),template,'tandoor',installer.ADVANCED_MODE)) + self.assertEqual(template,original) + + def test_numeric_retry_keeps_previous_answers_and_already_correct_slovak(self): + ui=Recorder();wizard=native_ui.BacktrackUI(ui) + wizard.answers=[('ask','previous'),('ask','abc')];wizard.cursor=2 + self.assertTrue(wizard.retry_last(ValueError("invalid literal for int() with base 10: 'abc'"))) + self.assertEqual(ui.messages,["Hodnota musí byť číslo: 'abc'\n\nZadajte hodnotu znova."]) + self.assertEqual((wizard.answers,wizard.cursor),([('ask','previous')],0));wizard.close() + + def test_real_menu_error_handler_has_slovak_heading_and_preserves_detail(self): + ui=Mock();ui.choose.side_effect=['custom',None] + with patch.object(cli,'interactive_ui',return_value=ui),patch.object(custom,'explore',side_effect=ValueError('fiction-detail')), \ + patch.object(updates,'UpdateCheck') as checker: + check=checker.return_value.__enter__.return_value + check.active=False;check.notice.return_value='';check.status.return_value={'available':[]} + self.assertEqual(cli.interactive(self.catalog),0) + ui.message.assert_called_once_with('Operáciu sa nepodarilo dokončiť:\n\nfiction-detail') diff --git a/lang/sk.json b/lang/sk.json index facb91e2..5e6520b8 100644 --- a/lang/sk.json +++ b/lang/sk.json @@ -240,7 +240,7 @@ "Add an extra custom path": "Pridať extra vlastnú cestu", "Add another GPU or USB device manually?": "Pridať ďalšie zariadenie GPU alebo USB manuálne?", "Add another directory to share?": "Pridať ďalší adresár na zdieľanie?", - "Add another extra path to this stack": "Pridajte do tohto zásobníka ďalšiu cestu navyše", + "Add another extra path to this stack": "Pridať ďalšiu cestu do aplikácie s viacerými kontajnermi", "Add as IDE": "Pridať ako IDE", "Add as SATA": "Pridať ako SATA", "Add as SCSI": "Pridať ako SCSI", @@ -252,7 +252,7 @@ "Add disk to LXC container": "Pridať disk do LXC kontajnera", "Add explicit privileged flag (optional but recommended):": "Pridať výslovný príznak privilegovaného kontajnera (voliteľné, ale odporúčané):", "Add export rule:": "Pridať export pravidlo:", - "Add extra paths to this stack": "Pridajte do tohto zásobníka ďalšie cesty", + "Add extra paths to this stack": "Pridať ďalšie cesty do aplikácie s viacerými kontajnermi", "Add iSCSI Target as Proxmox Storage": "Pridať iSCSI cieľ ako úložisko Proxmoxu", "Add iSCSI storage in Proxmox Storage": "Pridať iSCSI úložisko v Proxmoxe", "Add iSCSI storage in Proxmox:": "Pridať iSCSI úložisko do Proxmoxu:", @@ -1617,7 +1617,7 @@ "Data location": "Umiestnenie údajov", "Data size:": "Veľkosť dát:", "Data that is deleted with them:": "Údaje, ktoré sa spolu s nimi vypúšťajú:", - "Data volume size in GB": "Veľkosť dátového objemu v GB", + "Data volume size in GB": "Veľkosť dátového zväzku v GB", "Data volumes protected": "Dátové zväzky sú chránené", "Data wipe complete.": "Vymazanie dát je dokončené.", "Data wiped from": "Dáta boli vymazané z", @@ -1635,8 +1635,8 @@ "Debian repositories missing; creating default source file": "Debian repozitáre chýbajú; vytváram predvolený zdrojový súbor", "Decompress backup manually": "Ručne rozbaliť zálohu", "Decryption failed. The passphrase may be wrong, or the blob is corrupt. Try again?": "Dešifrovanie zlyhalo. Fráza môže byť nesprávna alebo je balíček poškodený. Skúsiť znova?", - "Dedicated container volume (included in backups)": "Dedikovaný objem kontajnera (zahrnutý do zálohy)", - "Dedicated container volumes (included in backups)": "Vyhradené objemy kontajnerov (zahrnuté do záloh)", + "Dedicated container volume (included in backups)": "Samostatný dátový zväzok kontajnera (zahrnutý v zálohách)", + "Dedicated container volumes (included in backups)": "Samostatné dátové zväzky kontajnerov (zahrnuté v zálohách)", "DeepSeek Harness “Everything is a Plugin“.": "DeepSeek Harness, všetko je Plugin.", "Default ACLs applied for group inheritance.": "Predvolené ACL boli použité pre dedenie skupiny.", "Default Credentials": "Predvolené prihlasovacie údaje", @@ -1884,7 +1884,7 @@ "Docker Volume Backup": "Docker Volume Backup", "Docker/CLI not available yet or no valid answer": "Docker/CLI ešte nie je k dispozícii alebo nie je platná odpoveď", "Documents & Notes": "Dokumenty a poznámky", - "Documents volume size in GB": "Veľkosť objemu dokumentov v GB", + "Documents volume size in GB": "Veľkosť dátového zväzku pre dokumenty v GB", "Dokuwiki is a simple to use and highly versatile Open Source wiki software that doesn't require a database. It is loved by users for its clean and readable syntax. The ease of maintenance, backup and integration makes it an administrator's favorite. Built in access controls and authentication connectors make DokuWiki especially useful in the enterprise context and the large number of plugins contributed by its vibrant community allow for a broad range of use cases beyond a traditional wiki.": "Dokuwiki je jednoduché použitie a vysoko univerzálny softvér Open Source wiki, ktorý nerequire databázu. Používatelia ho milujú pre jeho čistú a čitateľnú syntax. Jednoduchosť údržby, zálohovania a integrácie z neho robí administrátora obľúbeným. Postavený v prístupových a autentifikačných konektorov, aby DokuWiki obzvlášť užitočné v podnikovom kontexte a veľký počet pluginov, ktoré prispeli jeho pulzujúce komunity umožňujú širokú škálu prípadov použitia mimo tradičné wiki.", "Dolphin Emulator lets you play GameCube and Wii games with various graphical enhancements and other features are available to improve your game experience.": "Dolphin Emulator vám umožní hrať hryCube a Wii hry s rôznymi grafickými vylepšeniami a ďalšie funkcie sú k dispozícii pre zlepšenie herné skúsenosti.", "Domain for the certificate (example.com)": "Doména pre osvedčenie (príklad.com)", @@ -2453,7 +2453,7 @@ "Files & Downloads": "Súbory a sťahovanie", "Files & Sharing": "Súbory a zdieľanie", "Files it writes in the container:": "Súbory, ktoré zapisuje do kontajnera:", - "Files volume size in GB": "Veľkosť hlasitosti súborov v GB", + "Files volume size in GB": "Veľkosť dátového zväzku pre súbory v GB", "Filesystem": "Súborový systém", "Filesystem Tools Required": "Sú potrebné nástroje pre súborový systém", "Filesystem:": "Súborový systém:", @@ -4063,7 +4063,7 @@ "Next step: stop that VM first, then run": "Ďalší krok: najprv zastavte tú VM, potom spustite", "Nextcloud configuration cancelled": "Konfigurácia Nextcloud zrušená", "Nextcloud gives you access to all your files wherever you are.": "Nextcloud vám umožní prístup ku všetkým súborom kdekoľvek ste.", - "Nextcloud volume size in GB": "Nextcloud veľkosť objemu v GB", + "Nextcloud volume size in GB": "Veľkosť dátového zväzku Nextcloud v GB", "Nextcloud with private PostgreSQL and Redis dependencies": "Nextcloud s súkromnými PostgreSQL a Redis závislé", "Nginx is an HTTP web server, reverse proxy, content cache, load balancer, TCP/UDP proxy server, and mail proxy server.": "Nginx je webový server HTTP, reverzný proxy, vyrovnávacia pamäť obsahu, načítací balander, proxy server TCP/UDP a proxy server pošty.", "Nginx webserver and reverse proxy with php support and a built-in Certbot (Let's Encrypt) client. It also contains fail2ban for intrusion prevention.": "Nginx webserver a reverzný proxy s php podporou a vstavaný Certbot (Let's Encrypt) klient. Obsahuje aj fail2ban na prevenciu vniknutia.", @@ -4776,7 +4776,7 @@ "PostgreSQL creates the database named in POSTGRES_DB on the first start. The installer default is postgresql.": "PostgreSQL vytvára databázu pomenovanú v POSTGRES_DB na prvom začiatku. Štandardný inštalátor je postgresql.", "PostgreSQL is an advanced, enterprise-class, and open-source relational database system. PostgreSQL supports both SQL (relational) and JSON (non-relational) querying.": "PostgreSQL je moderný, podnikový a open-source relačný databázový systém. PostgreSQL podporuje ako SQL (relatívne) tak JSON (nerelatívne) dotazovanie.", "PostgreSQL requires a password": "PostgreSQL requires heslo", - "PostgreSQL volume size in GB": "PostgreSQL veľkosť objemu v GB", + "PostgreSQL volume size in GB": "Veľkosť dátového zväzku PostgreSQL v GB", "Potential QEMU startup/assertion failures": "možné zlyhania štartu alebo assertion chyby QEMU", "Power state D3cold/D0 transitions may be inaccessible": "prechody napájacích stavov D3cold/D0 nemusia byť dostupné", "Powerful OCR powered by DeepSeek AI": "Výkonný OCR poháňaný DeepSeek AI", @@ -5631,7 +5631,7 @@ "Select archive": "Vyberte archív", "Select archive to restore": "Vyberte archív na obnovu", "Select at least one path to continue.": "Pre pokračovanie vyberte aspoň jednu cestu.", - "Select at least one stack container": "Vyberte aspoň jeden zásobníkový kontajner", + "Select at least one stack container": "Vyberte aspoň jeden kontajner aplikácie", "Select at least one suite application": "Vyberte aspoň jednu aplikáciu suite", "Select authentication mode:": "Vyberte spôsob prihlásenia:", "Select authentication type:": "Vyberte typ prihlásenia:", @@ -5832,16 +5832,16 @@ "Shared Group": "Zdieľaná skupina", "Shared directories": "Zdieľané priečinky", "Shared directory created:": "Vytvorený zdieľaný adresár:", - "Shared directory for consume and export": "Zdieľaný adresár pre spotrebu a export", - "Shared directory for copy/sync operations": "Zdieľaný adresár pre kopírovanie/sync operations", + "Shared directory for consume and export": "Zdieľaný adresár pre priečinky consume a export", + "Shared directory for copy/sync operations": "Zdieľaný adresár na kopírovanie a synchronizáciu", "Shared group: CONFIGURED": "Zdieľaná skupina: NASTAVENÁ", "Shared group: sharedfiles (GID:": "Zdieľaná skupina: sharedfiles (GID:", "Shared host content (not included in LXC backups):": "Zdieľaný obsah hostiteľa (nezahrnutý do záloh LXC):", "Shared host data is not reverted by the backup. Continue?": "Zdieľané dáta hostiteľa nie sú vrátené zálohou. Pokračovať?", "Shared host data is not reverted by the backups. Continue?": "Zdieľané dáta hostiteľa nie sú vrátené zálohami. Pokračovať?", "Shared host directories (not included in Proxmox backups)": "Zdieľané adresáre hostiteľov (nezahrnuté do záloh Proxmox)", - "Shared host directory": "Zdieľaný adresár hostiteľov", - "Shared host directory (not included in Proxmox backups)": "Zdieľaný adresár host (nie je súčasťou záloh Proxmox)", + "Shared host directory": "Zdieľaný adresár hostiteľa", + "Shared host directory (not included in Proxmox backups)": "Zdieľaný adresár hostiteľa (nie je v zálohách Proxmoxu)", "Shared host files are kept as they are; the backup does not restore their content.": "Zdieľané hostiteľské súbory sú uchovávané ako sú; záloha neobnovuje ich obsah.", "Shared host media directory": "Zdieľaný adresár médií pre hostiteľov", "Shared memory size for the GPU workload in MB": "Zdieľaná veľkosť pamäte pre pracovné zaťaženie GPU v MB", @@ -5913,7 +5913,7 @@ "Single target found — selected automatically:": "Našiel sa jeden target - vybraný automaticky:", "Size": "Veľkosť", "Size in GB of": "Veľkosť v GB pre", - "Size of each consume/export volume in GB": "Veľkosť každého spotrebovaného/vývozného objemu v GB", + "Size of each consume/export volume in GB": "Veľkosť každého dátového zväzku pre consume a export v GB", "Size of the /dev/shm shared memory in MB": "Veľkosť zdieľanej pamäte /dev/shm v MB", "Size of the Frigate temporary cache in MB": "Veľkosť Frigate dočasnej vyrovnávacej pamäte v MB", "Size:": "Veľkosť:", @@ -6111,7 +6111,7 @@ "Storage disk identifier:": "Identifikátor disku v úložisku:", "Storage for": "Úložisko pre", "Storage for Nextcloud files, configuration and data": "Úložisko pre Nextcloud súborov, konfigurácie a dát", - "Storage for Paperless data and documents": "Úložisko pre údaje a dokumenty bez dokumentov", + "Storage for Paperless data and documents": "Úložisko pre údaje a dokumenty aplikácie Paperless", "Storage for Tandoor files": "Úložisko pre súbory Tandoor", "Storage for persistent data": "Skladovanie trvalých údajov", "Storage for recipe images and files": "Skladovanie pre recepty a súbory", @@ -6288,7 +6288,7 @@ "The NVIDIA hook path does not belong to the installer": "Cesta k háku NVIDIA nepatrí inštalátorovi", "The NVIDIA installer needs at least": "NVIDIA inštalátor potrebuje aspoň", "The NVIDIA runtime is up to date; the container is not modified or started": "Runtime NVIDIA je aktuálny; kontajner nie je upravený ani spustený", - "The Nextcloud volume needs at least 8 GB": "Objem Nextcloud potrebuje najmenej 8 GB", + "The Nextcloud volume needs at least 8 GB": "Dátový zväzok Nextcloud musí mať najmenej 8 GB", "The OCI archive contains no SHA-256 blobs": "Archív OCI neobsahuje žiadne SHA-256 blobs", "The OCI archive does not contain exactly one manifest": "Archív OCI neobsahuje presne jeden manifest", "The OCI archive does not exist or is empty:": "Archív OCI neexistuje alebo je prázdny:", @@ -6299,9 +6299,9 @@ "The OCI image storage was not kept": "Uskladnenie obrazu OCI nebolo uchované", "The OCR language must use Tesseract codes, for example eng or eng+spa": "Jazyk OCR musí používať kódy Tesseract, napríklad eng alebo eng+spa", "The PATH of the new image is outside the reproducible profile": "PATH nového obrázku je mimo reprodukovateľného profilu", - "The Paperless persistent volumes need at least 8 GB": "Trvalé objemy bez dokumentov potrebujú najmenej 8 GB", + "The Paperless persistent volumes need at least 8 GB": "Trvalé dátové zväzky aplikácie Paperless musia mať najmenej 8 GB", "The PostgreSQL volume needs at least 4 GB": "Objem PostgreSQL potrebuje najmenej 4 GB", - "The PostgreSQL volume needs at least 8 GB": "Objem PostgreSQL potrebuje najmenej 8 GB", + "The PostgreSQL volume needs at least 8 GB": "Dátový zväzok PostgreSQL musí mať najmenej 8 GB", "The ProxMenux Monitor update checker is not available. Start or update ProxMenux Monitor and try again.": "Kontrola aktualizácií v ProxMenux Monitor nie je dostupná. Spustite alebo aktualizujte ProxMenux Monitor a skúste to znova.", "The Proxmox VE 8 update did not finish. The upgrade to Proxmox VE 9 was not started.": "Aktualizácia Proxmox VE 8 sa nedokončila. Prechod na Proxmox VE 9 sa nespustil.", "The Proxmox archive keyring is missing; Ceph installation cannot continue safely": "Chýba zväzok kľúčov archívu Proxmox;Inštalácia Ceph nemôže bezpečne pokračovať", @@ -6311,7 +6311,7 @@ "The Rclone configuration needs at least 1 GB": "Konfigurácia Rklonu potrebuje aspoň 1 GB", "The Rclone rootfs needs at least 2 GB": "Rclone rootfs potrebuje aspoň 2 GB", "The Selkies profile requires a verified LinuxServer image": "Profil Selkies requires a overený obraz LinuxServer", - "The Tandoor files volume needs at least 2 GB": "Objem súborov Tandoor potrebuje aspoň 2 GB", + "The Tandoor files volume needs at least 2 GB": "Dátový zväzok súborov Tandoor musí mať najmenej 2 GB", "The URL does not contain the required parameters (id, pack, edition).": "URL neobsahuje potrebné parametre (id, pack, edition).", "The USB number can change after reconnecting or rebooting. This profile does not remap it automatically or handle Coral USB re-enumeration. Do not share a dongle already used by another service.": "Číslo USB sa môže zmeniť po opätovnom pripojení alebo reštarte. Tento profil nie je automaticky premapovať alebo spracovať Coral USB re-enumeration. Nezdieľajte šišku, ktorú už používa iná služba.", "The Unifi-controller software is a powerful, enterprise wireless software engine ideal for high-density client deployments requiring low latency and high uptime performance.": "Softvér Unifi-controller je výkonný, podnikový bezdrôtový softvérový motor ideálny pre zavedenie klientov s vysokou hustotou requiring nízka latencia a vysoký výkon v čase.", @@ -6392,7 +6392,7 @@ "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.": "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 consume/export volumes need at least 1 GB": "Dátové zväzky pre consume a export musia mať najmenej 1 GB", "The container could not be removed automatically:": "Nádoba sa nedala automaticky odstrániť:", "The container could not be started:": "Nádoba nemohla byť spustená:", "The container creation does not match the prepared instance": "Vytvorenie kontajnera nezodpovedá pripravenej inštancii", @@ -6607,7 +6607,7 @@ "The official startup cannot be reproduced": "Oficiálny štart nie je možné reprodukovať", "The official startup of the application is missing": "Chýba oficiálny začiatok aplikácie", "The operation already finished; it is not restored automatically": "Operácia už bola dokončená; jej predchádzajúci stav sa automaticky neobnoví", - "The operation could not be completed": "operation nebolo možné dokončiť", + "The operation could not be completed": "Operáciu sa nepodarilo dokončiť", "The operation stopped halfway. Choose \"Recover\" for this container in the OCI management menu to restore the previous installation.": "Operácia sa zastavila v polovici. Ak chcete obnoviť predchádzajúcu inštaláciu, v ponuke Správca OCI aplikácií pri tomto kontajneri vyberte \"Obnoviť\".", "The operation stopped halfway. Choose \"{choice}\" for this container in the OCI management menu.": "Operácia sa zastavila v polovici. V ponuke Správca OCI aplikácií pri tomto kontajneri vyberte \"{choice}\".", "The operation was stopped because a shared directory changed its identity:": "operation bol zastavený, pretože zdieľaný adresár zmenil svoju identitu:", @@ -6941,7 +6941,7 @@ "This tool is designed for systems with AMD GPUs.": "Tento nástroj je určený pre systémy s AMD GPU.", "This tool is designed for systems with Intel GPUs.": "Tento nástroj je určený pre systémy s Intel GPU.", "This translator only supports the Nextcloud stack": "Tento prekladateľ podporuje iba Nextcloud stack", - "This value is required.": "Táto hodnota je required.", + "This value is required.": "Táto hodnota je povinná.", "This variant requires the device": "Tento variant vyžaduje zariadenie", "This version does not build against the running kernel.": "Táto verzia nie je postavená proti bežiacemu jadru.", "This will RESET the ProxMenux Monitor login credentials on this host:": "Týmto sa vynulujú prihlasovacie údaje do ProxMenux Monitora na tomto serveri:", @@ -7689,7 +7689,7 @@ "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:": "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", + "a value is required": "hodnota je povinná", "aMule WebUI (password only, no username)": "aMule WebUI (iba heslo, žiadne užívateľské meno)", "aMule is a multi-platform client for the ED2K file sharing network and based on the windows client eMule. aMule started in August 2003, as a fork of xMule, which is a fork of lMule.": "aMule je multiplatformový klient pre sieť zdieľania súborov ED2K a založený na eMule klienta okien. aMule začal v auguste 2003, ako fork xMule, čo je fork lMule.", "active VF(s)": "aktívne VF", @@ -8109,7 +8109,7 @@ "started successfully.": "úspešne spustený.", "started.": "spustený.", "startup/restart errors are likely.": "pravdepodobne narazí na chyby štartu/reštartu.", - "staticfiles volume size in GB": "veľkosť statických súborov v GB", + "staticfiles volume size in GB": "Veľkosť dátového zväzku staticfiles v GB", "stop source VM first": "najprv zastavte zdrojovú VM", "stopped": "zastavené", "storage yet.": "úložisko zatiaľ.",