From 5ccc1451cec02b66e61ad4f40b68407f513a12a9 Mon Sep 17 00:00:00 2001 From: VAIO73 <50487331+Vaso73@users.noreply.github.com> Date: Tue, 20 Oct 2026 14:00:18 +0000 Subject: [PATCH] i18n: correct Slovak multi-container OCI editor dialogs and errors --- .../tests/test_oci_stack_editor_i18n.py | 239 ++++++++++++++++++ lang/sk.json | 70 ++--- 2 files changed, 274 insertions(+), 35 deletions(-) create mode 100644 .github/scripts/tests/test_oci_stack_editor_i18n.py diff --git a/.github/scripts/tests/test_oci_stack_editor_i18n.py b/.github/scripts/tests/test_oci_stack_editor_i18n.py new file mode 100644 index 00000000..29b4ac2b --- /dev/null +++ b/.github/scripts/tests/test_oci_stack_editor_i18n.py @@ -0,0 +1,239 @@ +"""Exercise the multi-container editor in Slovak without applying a change.""" +from contextlib import redirect_stderr +import copy +import io +import json +from pathlib import Path +import subprocess +import sys +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 host, i18n, installer, management, stack_recreation as editor +import oci_immich_recognition as recognition +import oci_instances as instances +import oci_stack_modify as modify +import oci_ui + +CONFIG = { + 'rootfs': 'fixture:vm-999991-disk-0,size=8G', + 'mp0': 'fixture:vm-999991-disk-1,mp=/opt/recipes/mediafiles,size=8G', + 'mp1': 'fixture:vm-999991-disk-2,mp=/extra,size=4G', + 'mp2': '/fixture/shared,mp=/shared', + 'dev0': 'path=/dev/ttyACM7,mode=0660', +} + + +class StackEditorSlovakTests(unittest.TestCase): + def setUp(self): + self.translations = json.loads((ROOT / 'lang/sk.json').read_text()) + for module in (i18n, oci_ui): + for name, value in (('_language', 'sk'), ('_cache', self.translations)): + item = patch.object(module, name, value) + item.start() + self.addCleanup(item.stop) + self.member = {'vmid': 999991, 'stack_member': {'name': 'application'}, + 'deployment': {'replay_profile': {'adapter': 'install_tandoor_stack.sh', + 'role': 'application'}}} + self.primary = {'vmid': 999990, 'stack': {'members': [self.member, + {'vmid': 999992, 'deployment': {'replay_profile': {'role': 'database'}}}]}} + self.original = copy.deepcopy(self.primary) + self.ui = Mock() + self.ui.choose.return_value = None + self.ui.confirm.return_value = False + self.ui.review.return_value = False + self.ui.checklist.side_effect = lambda text, options, defaults: list(defaults) + config = patch.object(editor, '_config', return_value=CONFIG) + config.start() + self.addCleanup(config.stop) + self.forbidden = [] + for target, name in ((subprocess, 'run'), (subprocess, 'Popen'), + (subprocess, 'check_output'), (Path, 'write_text'), + (Path, 'write_bytes'), (instances, 'write'), + (instances, 'command'), (modify, 'apply'), + (recognition, 'apply'), (recognition, 'configure'), + (management, '_run_lifecycle')): + item = patch.object(target, name, side_effect=AssertionError('Forbidden effect: ' + name)) + self.forbidden.append(item.start()) + self.addCleanup(item.stop) + self.lifecycle = Mock(side_effect=AssertionError('Editor called lifecycle')) + self.forbidden.append(self.lifecycle) + + def tearDown(self): + self.assertEqual(self.primary, self.original) + for callback in self.forbidden: + callback.assert_not_called() + + def shown(self): + return '\n'.join(str(call) for call in self.ui.mock_calls) + + def immich(self, acceleration='cpu'): + self.member['deployment']['replay_profile'] = { + 'adapter': 'install_immich_stack.sh', 'role': 'machine-learning'} + self.member['deployment']['machine_learning'] = {'acceleration': acceleration} + self.original = copy.deepcopy(self.primary) + return self.member + + def changes(self, **values): + return {'add_mounts': [], 'remove_mounts': [], 'add_devices': [], + 'remove_devices': [], **values} + + def test_editor_only_offers_extra_paths_and_leaves_database_out(self): + self.assertFalse(editor.modify_stack(ROOT / 'oci', self.ui, self.primary, self.lifecycle)) + shown = self.shown() + self.assertIn('odznačené sa odstránia po potvrdení', shown) + self.assertIn('odznačené sa odpoja po potvrdení', shown) + options = self.ui.checklist.call_args_list[0].args[1] + self.assertEqual([path for path, label in options], ['/extra', '/shared']) + self.assertNotIn('zásobník', shown) + + def test_declining_volume_deletion_keeps_it_and_only_detaches_host_path_in_draft(self): + self.ui.checklist.side_effect = [[], ['/dev/ttyACM7']] + self.assertFalse(editor.modify_stack(ROOT / 'oci', self.ui, self.primary, self.lifecycle)) + warning = self.ui.confirm.call_args_list[0].args[0] + self.assertIn('trvalé úložisko aj všetky údaje v ňom', warning) + self.assertIn('/extra', warning) + summary = self.ui.review.call_args.args[0] + self.assertIn('- /shared', summary) + self.assertNotIn('- /extra', summary) + self.assertIn('Spustený kontajner sa reštartuje', summary) + self.assertIn('zastavený zostane zastavený', summary) + self.assertIn('Databáza ani ostatné kontajnery sa nemenia', summary) + + def test_declined_review_describes_confirmed_volume_deletion_without_performing_it(self): + self.ui.checklist.side_effect = [[], []] + self.ui.confirm.side_effect = [True, False, False] + self.assertFalse(editor.modify_stack(ROOT / 'oci', self.ui, self.primary, self.lifecycle)) + self.assertIn('- /extra', self.ui.review.call_args.args[0]) + self.assertIn('vymažú aj údaje', self.ui.review.call_args.args[0]) + self.assertEqual(self.ui.review.call_args.kwargs['question'], 'Použiť tieto zmeny?') + + def test_member_selection_cancels_before_any_configuration_read(self): + other = copy.deepcopy(self.member) + other['vmid'] = 999993 + self.primary['stack']['members'].append(other) + self.original = copy.deepcopy(self.primary) + with patch.object(editor, '_config') as read: + self.assertFalse(editor.modify_stack(ROOT / 'oci', self.ui, self.primary, self.lifecycle)) + read.assert_not_called() + self.assertEqual(self.ui.choose.call_args.args[0], 'Kontajner, ktorý chcete upraviť') + + def test_missing_member_error_uses_application_language(self): + self.primary['stack']['members'] = [] + self.original = copy.deepcopy(self.primary) + self.assertFalse(editor.modify_stack(ROOT / 'oci', self.ui, self.primary, self.lifecycle)) + self.assertIn('Pre túto aplikáciu nie je uložený zoznam kontajnerov.', self.shown()) + self.assertIn('Správa OCI aplikácie s viacerými kontajnermi', self.shown()) + + def test_immich_action_menu_identifies_recognition_instead_of_video_transcoding(self): + self.immich() + self.assertFalse(editor.modify_stack(ROOT / 'oci', self.ui, self.primary, self.lifecycle)) + self.assertIn('Vybrať CPU alebo GPU pre rozpoznávanie', self.shown()) + self.assertIn('Upraviť pripojené cesty a zariadenia', self.shown()) + + def test_cpu_only_host_explains_why_no_gpu_choice_is_offered(self): + member = self.immich() + with patch.object(host, 'gpus', return_value={'intel': [], 'amd': [], 'nvidia': []}): + self.assertFalse(editor.change_recognition(ROOT / 'oci', self.ui, self.primary, + member, self.lifecycle)) + self.assertIn('nenašla použiteľná grafická karta', self.shown()) + self.assertIn('Rozpoznávanie zostáva na CPU.', self.shown()) + self.ui.review.assert_not_called() + + def test_gpu_review_explains_whole_application_update_and_kept_data_before_no(self): + member = self.immich() + self.ui.choose.return_value = 'openvino' + found = {'intel': ['/dev/dri/renderD128'], 'amd': [], 'nvidia': []} + with patch.object(host, 'gpus', return_value=found): + self.assertFalse(editor.change_recognition(ROOT / 'oci', self.ui, self.primary, + member, self.lifecycle)) + choices = self.ui.choose.call_args.args[1] + self.assertEqual(choices, [('cpu', 'CPU'), ('openvino', 'Intel GPU')]) + text = self.ui.review.call_args.args[0] + for fragment in ('CPU → Intel GPU', 'pamäť modelov, knižnica a databáza sa zachovajú', + 'Celá aplikácia sa zastaví a aktualizuje', 'ProxMenux sa pokúsi obnoviť', + 'ponuky správy OCI'): + self.assertIn(fragment, text) + self.assertEqual(self.ui.review.call_args.kwargs['question'], + 'Použiť zvolený CPU/GPU pre rozpoznávanie?') + + def test_unchanged_recognition_does_not_open_confirmation_or_apply(self): + member = self.immich() + self.ui.choose.return_value = 'cpu' + with patch.object(editor, 'recognition_choices', return_value=[('cpu', 'CPU', {}), + ('cuda', 'NVIDIA GPU', {})]): + self.assertFalse(editor.change_recognition(ROOT / 'oci', self.ui, self.primary, + member, self.lifecycle)) + self.ui.review.assert_not_called() + self.assertIn('Nič sa nezmenilo.', self.shown()) + + def test_experimental_rocm_can_be_declined_before_final_review(self): + member = self.immich() + self.ui.choose.return_value = 'rocm' + choices = [('cpu', 'CPU', {}), ('rocm', 'AMD GPU', {'experimental': True})] + with patch.object(editor, 'recognition_choices', return_value=choices), \ + patch.object(host, 'amd_gpu_name', return_value='Fixture AMD'): + self.assertFalse(editor.change_recognition(ROOT / 'oci', self.ui, self.primary, + member, self.lifecycle)) + text = self.ui.confirm.call_args.args[0] + self.assertIn('ROCm túto grafickú kartu oficiálne nepodporuje.', text) + self.assertIn('GPU prestať reagovať', text) + self.assertIn('bez preinštalovania', text) + self.assertIn('Použiť napriek tomu GPU s ROCm?', text) + self.assertFalse(self.ui.confirm.call_args.args[1]) + self.ui.review.assert_not_called() + + def test_backend_invalid_volume_size_preserves_path_and_fails_before_mutation(self): + mount = {'type': 'managed-volume', 'container_path': '/new-data', + 'size_gb': 0, 'source': 'fixture'} + with patch.object(modify, 'entries', return_value={}): + with self.assertRaisesRegex(ValueError, 'Neplatná veľkosť trvalého úložiska: /new-data'): + modify.validate(999991, self.changes(add_mounts=[mount])) + + def test_backend_unsupported_device_explains_separate_profile_before_mutation(self): + device = {'kind': 'character-device', 'host_path': '/dev/sda'} + with patch.object(modify, 'entries', return_value={}): + with self.assertRaisesRegex(ValueError, 'NVIDIA a celé stromy zariadení vyžadujú iný profil: /dev/sda'): + modify.validate(999991, self.changes(add_devices=[device])) + + def test_root_error_is_localized_without_starting_the_operation(self): + with patch.object(modify.os, 'geteuid', return_value=1000), \ + patch.object(sys, 'argv', ['fixture', '999991', '--changes', '/not-read.json']), \ + redirect_stderr(io.StringIO()) as output: + with self.assertRaises(SystemExit) as result: + modify.main() + self.assertEqual(result.exception.code, 2) + self.assertIn('Vyžadujú sa oprávnenia používateľa root', output.getvalue()) + self.assertNotIn('required', output.getvalue()) + + def test_invalid_recognition_profile_is_localized_without_any_gpu_probe(self): + with self.assertRaisesRegex(ValueError, 'Profil GPU pre Immich nebol overený'): + recognition.validate('unknown', None, None) + + def test_recognition_errors_distinguish_unchanged_from_incomplete_operation(self): + incomplete = RuntimeError('fixture diagnostic') + incomplete.recognition_kept = False + for error, expected in ((ValueError('fixture diagnostic'), 'Spôsob rozpoznávania v Immichu sa nezmenil:'), + (incomplete, 'Zmenu CPU/GPU pre rozpoznávanie v Immichu sa nepodarilo dokončiť:')): + with self.subTest(error=type(error).__name__), \ + patch.object(recognition.os, 'geteuid', return_value=0), \ + patch.object(sys, 'argv', ['fixture', '999990', '--acceleration', 'cpu']), \ + patch.object(recognition, 'change', side_effect=error), \ + patch.object(recognition, 'msg_error') as message: + self.assertEqual(recognition.main(), 1) + self.assertEqual(message.call_args.args[0], expected + ' fixture diagnostic') + + def test_english_and_missing_translation_fallback_preserve_source_text(self): + changes = self.changes(remove_mounts=['/extra']) + for language, cache in (('en', self.translations), ('sk', {})): + with self.subTest(language=language, empty_cache=not cache), \ + patch.object(i18n, '_language', language), patch.object(i18n, '_cache', cache): + text = editor.summary(self.member, changes) + self.assertIn('A running container is restarted', text) + self.assertIn('- /extra', text) + + +if __name__ == '__main__': + unittest.main() diff --git a/lang/sk.json b/lang/sk.json index 95c78843..c0bef7bd 100644 --- a/lang/sk.json +++ b/lang/sk.json @@ -104,7 +104,7 @@ "A relaxed AppArmor or seccomp profile is requested; this may be optional.": "Požaduje sa uvoľnený profil AppArmor alebo seccomp; môže byť voliteľný.", "A reproducible native startup is missing": "Chýba reprodukovateľný prirodzený štart", "A rootfs adaptation is stored in persistent storage": "Adaptácia korienkov sa skladuje v trvalom sklade", - "A running container is restarted to apply the changes; a stopped one is left stopped. The data of the application, its database and the configuration of the other containers are not changed. A container volume removed here is deleted with the data in it.": "Spustený kontajner sa reštartuje, aby sa použili zmeny; zastavený zostane zastavený. Údaje aplikácie, jej databáza a konfigurácia ostatných kontajnerov sa nemenia. Objem kontajnera odstránený tu sa odstráni aj s údajmi v ňom.", + "A running container is restarted to apply the changes; a stopped one is left stopped. The data of the application, its database and the configuration of the other containers are not changed. A container volume removed here is deleted with the data in it.": "Spustený kontajner sa reštartuje, aby sa zmeny použili; zastavený zostane zastavený. Údaje aplikácie sa zachovajú. Databáza ani ostatné kontajnery sa nemenia. Odstránením trvalého úložiska kontajnera sa vymažú aj údaje, ktoré obsahuje.", "A scheduled run cannot answer:": "Plánované spustenie nemôže odpovedať:", "A self-hosted Bitwarden server": "Self-hosted Bitwarden server", "A self-hosted, goal-free habit tracking tool.": "Sebestačný, bezcieľový nástroj na sledovanie zvyku.", @@ -260,7 +260,7 @@ "Add latest Ceph support": "Pridať najnovšiu podporu Ceph", "Add new PVE 9 enterprise repository (deb822 format) (Only if using enterprise):": "Pridajte nový PVE 9 enterprise repozitár (formát deb822) (iba ak používate enterprise):", "Add or change a device": "Pridať alebo zmeniť zariadenie", - "Add or remove extra paths and devices": "Pridajte alebo odstráňte ďalšie cesty a zariadenia", + "Add or remove extra paths and devices": "Upraviť pripojené cesty a zariadenia", "Add physical disk to VM via": "Pridať fyzický disk do VM cez", "Add share block in /etc/samba/smb.conf:": "Pridať blok zdieľania do /etc/samba/smb.conf:", "Add unprivileged flag to container configuration:": "Pridať príznak neprivilegovaného kontajnera do nastavenia:", @@ -408,7 +408,7 @@ "Analyzing system for available PCIe storage devices...": "Analyzujem systém a hľadám dostupné PCIe úložiskové zariadenia...", "Another OCI operation is using the instance registry": "Ďalšia OCI operation používa inštančný register", "Another OCI operation is using the instance registry. Wait for it to finish and open this menu again; no container is modified.": "Ďalšia OCI operation používa inštančný register. Počkajte, kým to dokončíte a znovu otvoríte toto menu; žiadna nádoba nie je upravená.", - "Another OCI operation is using the instance registry. Wait for it to finish.": "Ďalšia operácia OCI používa register inštancií. Počkajte, kým to skončí.", + "Another OCI operation is using the instance registry. Wait for it to finish.": "Register OCI aplikácií používa iná operácia. Počkajte na jej dokončenie.", "Another OCI operation is using the registry. This operation was not started.": "Ďalšia OCI operation používa register. Táto operation sa nezačala.", "Another ProxMenux OCI operation is running. Try again when it finishes.": "Prebieha ďalšia operácia ProxMenux OCI. Skúste to znova, keď to skončí.", "Another ZRAM configuration exists or could not be inspected; systemd-zram-generator was retained": "Existuje iná konfigurácia ZRAM alebo ju nebolo možné skontrolovať; systemd-zram-generator bol zachovaný", @@ -792,8 +792,8 @@ "Change it after the first login.": "Zmeňte ho po prvom prihlásení.", "Change or add an environment variable?": "Zmeniť alebo pridať premennú prostredia?", "Change the access network?": "Zmeniť prístupovú sieť?", - "Change the recognition now?": "Zmeniť rozpoznávanie teraz?", - "Change what runs recognition: CPU or GPU": "Zmeňte, čo spúšťa rozpoznávanie: CPU alebo GPU", + "Change the recognition now?": "Použiť zvolený CPU/GPU pre rozpoznávanie?", + "Change what runs recognition: CPU or GPU": "Vybrať CPU alebo GPU pre rozpoznávanie", "Changedetection.io provides free, open-source web page monitoring, notification and change detection.": "Changedetection.io poskytuje bezplatné, open-source webové stránky monitorovanie, oznamovanie a detekciu zmien.", "Changes applied. A system reboot is recommended for them to take full effect.": "Zmeny boli použité. Odporúča sa reštart systému, aby sa prejavili naplno.", "Changes applied. Data kept.": "Boli použité zmeny. Údaje uchovávané.", @@ -1192,7 +1192,7 @@ "Container removed:": "Odstránený kontajner:", "Container restarted successfully": "Kontajner bol úspešne reštartovaný", "Container running steadily": "Kontajner beží plynule", - "Container started": "Spustiť kontajner", + "Container started": "Kontajner bol spustený", "Container started successfully": "Kontajner bol úspešne spustený", "Container started successfully.": "Kontajner bol úspešne spustený.", "Container started.": "Kontajner je spustený.", @@ -1200,7 +1200,7 @@ "Container stopped.": "Kontajner bol zastavený.", "Container successfully converted to privileged.": "Kontajner bol úspešne zmenený na privilegovaný.", "Container template— LXC templates": "Šablóna kontajnera— LXC šablóny", - "Container to change": "Kontajner na zmenu", + "Container to change": "Kontajner, ktorý chcete upraviť", "Container volume": "Trvalé úložisko aplikácie", "Container volume (included in backups)": "Trvalé úložisko aplikácie (zahrnuté v zálohách)", "Container will pick up the mount on next start": "Kontajner načíta mount pri ďalšom štarte", @@ -1664,7 +1664,7 @@ "Delete a VM (irreversible). Use the correct ": "Vymazať VM (nedá sa vrátiť späť). Použite správne ", "Delete archive": "Vymazať archív", "Delete backup job": "Odstrániť úlohu zálohovania", - "Delete it?": "Vymazať?", + "Delete it?": "Vymazať úložisko?", "Delete job": "Vymazať úlohu", "Delete scheduled backup job?": "Vymazať naplánovanú úlohu zálohy?", "Delete the image to free the space?": "Odstrániť obrázok na voľné miesto?", @@ -1733,7 +1733,7 @@ "Device configuration cancelled": "Konfigurácia zariadenia zrušená", "Device hostname": "Hostname zariadenia", "Device node outside the supported profiles": "Uzol zariadenia mimo podporovaných profilov", - "Device outside the supported profiles; NVIDIA and device trees require another profile": "Zariadenie mimo podporovaných profilov; NVIDIA a zariadenia stromy require iný profil", + "Device outside the supported profiles; NVIDIA and device trees require another profile": "Zariadenie nepatrí do podporovaných profilov; NVIDIA a celé stromy zariadení vyžadujú iný profil", "Device path mismatch. Format cancelled.": "Cesta zariadenia nesedí. Formátovanie zrušené.", "Device permissions verified for the application user": "Práva zariadenia overené pre užívateľa aplikácie", "Device removed:": "Zariadenie odstránené:", @@ -1744,7 +1744,7 @@ "Devices added:": "Pridané zariadenia:", "Devices of the host it asks for:": "Zariadenia hostiteľa, o ktoré žiada:", "Devices to add to VM": "Zariadenia na pridanie do VM", - "Devices to keep (unmark one to remove it)": "Zariadenia na ponechanie (zrušením označenia niektorého zariadenia ho odstránite)", + "Devices to keep (unmark one to remove it)": "Zariadenia na ponechanie (odznačené sa odpoja po potvrdení)", "Diff: current system vs backup (--- system +++ backup)": "Rozdiel: aktuálny systém vs záloha (--- systém +++ záloha)", "Different host. Backup from:": "Iný host. Záloha z:", "Direct conversion completed for container": "Priama konverzia bola dokončená pre kontajner", @@ -2246,7 +2246,7 @@ "External field not reserved:": "Vonkajšie pole nie je vyhradené:", "Extra parameters for minisatip (optional)": "Ďalšie parametre pre minisatip (voliteľné)", "Extra paths": "Extra cesty", - "Extra paths to keep (unmark one to remove it)": "Ďalšie cesty, ktoré sa majú ponechať (zrušením označenia jednej ju odstránite)", + "Extra paths to keep (unmark one to remove it)": "Ďalšie cesty na ponechanie (odznačené sa odstránia po potvrdení)", "Extracting NVIDIA installer on host...": "Rozbaľujem NVIDIA inštalátor na hostovi...", "Extracting OVA archive...": "Rozbaľujem OVA archív...", "Extracting archive...": "Rozbaľujem archív...", @@ -2902,7 +2902,7 @@ "If config issues occur:": "Ak nastanú problémy s nastavením:", "If container won't start:": "Ak sa kontajner nespustí:", "If imported from ESXi: install qemu-guest-agent inside the guest OS": "Ak je import z ESXi: nainštalujte qemu-guest-agent vo vnútri hosťovského OS", - "If it does not work well, the acceleration can be changed back from Manage installed OCI applications, without reinstalling.": "Ak to nefunguje správne, zrýchlenie je možné zmeniť späť v Spravovať nainštalované aplikácie OCI bez preinštalovania.", + "If it does not work well, the acceleration can be changed back from Manage installed OCI applications, without reinstalling.": "Ak zrýchlenie nefunguje správne, v ponuke Spravovať nainštalované OCI aplikácie môžete pôvodné nastavenie vrátiť bez preinštalovania.", "If it still fails, the NFS server export options must be changed on the server.": "Ak to stále zlyhá, export možnosti NFS servera treba zmeniť priamo na serveri.", "If it warns about 'systemd-boot' meta-package, remove it:": "Ak upozorní na meta-balík 'systemd-boot', odstráňte ho:", "If mount fails (LVM):": "Ak zlyhá pripojenie (LVM):", @@ -2957,7 +2957,7 @@ "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", - "Immich GPU profile not validated": "Immich GPU profil nie je validovaný", + "Immich GPU profile not validated": "Profil GPU pre Immich nebol overený", "Immich configuration cancelled": "Konfigurácia Immich zrušená", "Immich device without a validated translation": "Zariadenie Immich bez overeného prekladu", "Immich machine learning": "Immich strojové učenie", @@ -3252,7 +3252,7 @@ "Invalid Python module:": "Neplatný modul Python:", "Invalid Python package:": "Neplatný Python balík:", "Invalid Python path in the repair:": "Neplatná cesta Python v oprave:", - "Invalid ROCm generation override": "Neplatné prepísanie generovania ROCm", + "Invalid ROCm generation override": "Neplatná hodnota vynútenej verzie GPU pre ROCm", "Invalid Unpackerr variable": "Neplatná premenná Unpackerr", "Invalid VFS cache mode": "Neplatný režim vyrovnávacej pamäte VFS", "Invalid VMID": "Neplatné VMID", @@ -3364,7 +3364,7 @@ "Invalid variable name": "Neplatný názov premennej", "Invalid variable name:": "Neplatný názov premennej:", "Invalid volume size": "Neplatná veľkosť objemu", - "Invalid volume size:": "Neplatná veľkosť hlasitosti:", + "Invalid volume size:": "Neplatná veľkosť trvalého úložiska:", "Invalid volume target": "Neplatný cieľ objemu", "IoT & Smart Home": "IoT a inteligentná domácnosť", "Is the value a password or secret?": "Je hodnota heslo alebo tajomstvo?", @@ -3736,7 +3736,7 @@ "Modern, easy to use download automation for torrents and usenet.": "Moderná, ľahko ovládateľná automatizácia sťahovania pre torrenty a usenet.", "Modify": "Upraviť", "Modify OCI": "Upraviť OCI", - "Modify OCI stack": "Upraviť OCI stack", + "Modify OCI stack": "Upraviť OCI aplikáciu", "Modify extra paths and devices": "Upraviť prídavné cesty a zariadenia", "Modify: edit resources, network, paths and GPU": "Upraviť: upraviť zdroje, sieť, cesty a GPU", "Modifying Fastfetch configuration...": "Upravujem nastavenie Fastfetch...", @@ -4338,7 +4338,7 @@ "No updates available — run a scan first or wait for the Monitor to refresh.": "Nie sú dostupné žiadne aktualizácie — najprv spustite kontrolu alebo počkajte, kým sa Monitor obnoví.", "No updates or failed to fetch templates": "Nie sú dostupné aktualizácie alebo sa nepodarilo načítať šablóny", "No usable GPU was found on this host. Immich will be installed on the CPU.": "Na tomto hostiteľovi sa nenašiel žiadny použiteľný GPU. Immich bude nainštalovaný na CPU.", - "No usable GPU was found on this host. Recognition stays on the CPU.": "Na tomto hostiteľovi sa nenašiel žiadny použiteľný GPU. Rozpoznanie zostáva na CPU.", + "No usable GPU was found on this host. Recognition stays on the CPU.": "Na tomto serveri sa nenašla použiteľná grafická karta. Rozpoznávanie zostáva na CPU.", "No usable GPU was found on this host. The application will be installed without hardware acceleration.": "Na tomto hostiteľovi sa nenašiel žiadny použiteľný GPU. Aplikácia sa nainštaluje bez hardvérovej akcelerácie.", "No user groups found.": "Nenašli sa žiadne používateľské skupiny.", "No user-created disk storage or fstab mount found.": "Nenašlo sa žiadne používateľom vytvorené diskové úložisko ani mount vo fstab.", @@ -4413,7 +4413,7 @@ "OCI manager Apps is a beta: if something does not work as expected, please report it on GitHub with the application name.": "Správca OCI aplikácií je beta: ak niečo nefunguje podľa očakávania, nahláste to na GitHub spolu s názvom aplikácie.", "OCI metadata integrity mismatch": "Nepomer integrity metaúdajov OCI", "OCI metadata too large": "Metaúdaje OCI príliš veľké", - "OCI stack management": "Riadenie stohu OCI", + "OCI stack management": "Správa OCI aplikácie s viacerými kontajnermi", "OCI verification failed:": "Overenie OCI zlyhalo:", "OCR language (Tesseract code)": "Jazyk OCR (kód Tesseract)", "OK": "OK", @@ -4973,7 +4973,7 @@ "RAM in MiB": "RAM v MiB", "REPAIR SUMMARY": "ZHRNUTIE OPRAVY", "REQUIREMENTS:": "POŽIADAVKY:", - "ROCm does not support this GPU officially. The application can use it by presenting it as another generation of its family: it is faster than the CPU, but under load the GPU can stop responding, and then the application does not answer until its container is restarted. The ROCm image is also larger than the others.": "ROCm oficiálne nepodporuje tento GPU. Aplikácia ho môže použiť tak, že ho predstaví ako ďalšiu generáciu svojej rodiny: je rýchlejšia ako CPU, ale pri zaťažení môže GPU prestať reagovať a potom aplikácia neodpovedá, kým sa nereštartuje jej kontajner. Obraz ROCm je tiež väčší ako ostatné.", + "ROCm does not support this GPU officially. The application can use it by presenting it as another generation of its family: it is faster than the CPU, but under load the GPU can stop responding, and then the application does not answer until its container is restarted. The ROCm image is also larger than the others.": "ROCm túto grafickú kartu oficiálne nepodporuje. Aplikácia ju môže použiť tak, že sa karta predstaví ako iná generácia z rovnakej rodiny. Rozpoznávanie tým môže byť rýchlejšie než na CPU, ale pri zaťažení môže GPU prestať reagovať. Aplikácia potom nebude odpovedať, kým sa jej kontajner nereštartuje. Obraz ROCm je navyše väčší než ostatné obrazy.", "ROCm requires /dev/kfd on the host": "ROCm vyžaduje /dev/kfd na hostiteľovi", "ROCm requires the render device of an AMD GPU": "ROCm vyžaduje vykresľovacie zariadenie AMD GPU", "ROM dump not available — configuring without romfile.": "ROM dump nie je dostupný - nastavujem bez romfile.", @@ -5046,9 +5046,9 @@ "Recent logs:": "Posledné záznamy:", "Recent test results:": "Posledné výsledky testov:", "Recognition": "Rozpoznávanie", - "Recognition already runs on that choice": "Rozpoznávanie už funguje na tejto voľbe", + "Recognition already runs on that choice": "Rozpoznávanie už používa zvolený CPU/GPU", "Recognition is not offered on the AMD GPU; video transcoding is.": "Rozpoznávanie nie je ponúkané na AMD GPU; prekódovanie videa áno.", - "Recognition of Immich changed; the application was updated with the new choice.": "Rozpoznanie Immich zmenené; aplikácia bola aktualizovaná novou voľbou.", + "Recognition of Immich changed; the application was updated with the new choice.": "Spôsob rozpoznávania v Immichu bol zmenený; aplikácia bola aktualizovaná pre zvolený CPU/GPU.", "Recognition on AMD uses ROCm. Its image is several times larger than the others, so the first installation takes longer, and whether a GPU works with it depends on its model.": "Rozpoznávanie na AMD používa ROCm. Jeho obraz je niekoľkonásobne väčší ako ostatné, takže prvá inštalácia trvá dlhšie a či s ním GPU bude fungovať, závisí od jeho modelu.", "Recognition on AMD uses ROCm. Its image is several times larger than the others, so the first installation takes longer.": "Rozpoznávanie na AMD používa ROCm. Jeho obraz je niekoľkonásobne väčší ako ostatné, takže prvá inštalácia trvá dlhšie.", "Recognition profile not implemented": "Neimplementovaný profil uznávania", @@ -5249,7 +5249,7 @@ "Removing the containers...": "Odstránenie kontajnerov...", "Removing the incomplete stack...": "Odstránenie neúplného zásobníka...", "Removing the previous container": "Odstránenie predchádzajúceho kontajnera", - "Removing this path deletes its container volume and the data in it:": "Odstránením tejto cesty sa odstráni objem kontajnera a údaje v ňom:", + "Removing this path deletes its container volume and the data in it:": "Odstránením tejto cesty sa vymaže jej trvalé úložisko aj všetky údaje v ňom:", "Removing utilities installed by ProxMenux...": "Odstraňujú sa pomôcky nainštalované používateľom ProxMenux...", "Removing zfs-auto-snapshot...": "Odstraňujem zfs-auto-snapshot...", "Renamed": "Premenované", @@ -5380,7 +5380,7 @@ "RomM is a self-hosted ROM manager for managing and playing game collections.": "RomM je self-hosted ROM manažér pre správu a hranie zbierky hier.", "Root SSH keys/config": "SSH kľúče/nastavenie roota", "Root inside container = root on host system": "Root v kontajneri = root na hostiteľskom systéme", - "Root privileges are required": "Koreňové práva sú required", + "Root privileges are required": "Vyžadujú sa oprávnenia používateľa root", "Root privileges on the Proxmox node are required": "Koreňové práva na Proxmox uzla sú required", "Root shell/profile config": "Nastavenie shellu/profilu roota", "Root user on the PVE host (default 'root'):": "Root používateľ na PVE hostovi (predvolené 'root'):", @@ -6350,7 +6350,7 @@ "The application did not get an address on the access network:": "Aplikácia nedostala adresu v prístupovej sieti:", "The application did not pass its HTTP check:": "Aplikácia neprešla kontrolou HTTP:", "The application did not respond in time:": "Žiadosť neodpovedala včas:", - "The application has been modified with the new options.": "Aplikácia bola upravená o nové možnosti.", + "The application has been modified with the new options.": "Nastavenia aplikácie boli upravené.", "The application has been recreated with the new options.": "Aplikácia bola znovu vytvorená s novými možnosťami.", "The application needs it for": "Aplikácia to potrebuje pre", "The application stopped during its first start:": "Aplikácia sa zastavila počas prvého začiatku:", @@ -6405,7 +6405,7 @@ "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 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 has an operation pending; finish or recover it first": "Kontajner má nedokončenú operáciu; najprv ju dokončite alebo obnovte", "The container identity changed; nothing was adopted": "Identita kontajnera sa zmenila;nič nebolo prijaté", "The container identity changed; the container is not replaced": "Označenie kontajnera sa zmenilo; kontajner sa nenahrádza.", "The container identity does not match": "Identita kontajnera nezodpovedá", @@ -6490,7 +6490,7 @@ "The gateway should appear in your Tailscale admin console shortly.": "Brána by sa čoskoro mala objaviť v Tailscale administrácii.", "The guest access test did not succeed.": "Test prístupu hosťa nebol úspešný.", "The healthcheck cannot run without an IP address": "Kontrola zdravotného stavu nemôže prebiehať bez IP adresy", - "The host NVIDIA driver is not responding correctly": "Hostiteľ ovládač NVIDIA nereaguje správne", + "The host NVIDIA driver is not responding correctly": "Ovládač NVIDIA na serveri nereaguje správne", "The host bind source does not exist:": "Zdroj hostiteľskej väzby neexistuje:", "The host bind source is not a regular file or directory:": "Zdroj odkazu hostiteľa nie je bežný súbor alebo adresár:", "The host directory changed before it was mounted": "Adresár hostiteľa sa zmenil predtým, ako bol pripojený", @@ -6563,7 +6563,7 @@ "The local envelope is dropped and future backups do not upload anything. Uploaded envelopes already on PBS stay intact and remain recoverable with their original passphrase.": "Lokálna obálka sa zahodí a budúce zálohy už nič nenahrajú. Obálky, ktoré už sú v PBS, zostanú zachované a budú obnoviteľné pôvodnou frázou.", "The local storage does not accept snippets": "Miestne úložisko neprijíma úryvky", "The long test runs directly on the disk hardware.": "Dlhý test beží priamo na hardvéri disku.", - "The machine learning container is rebuilt with the image of the new choice. Its model cache, the library and the database are kept. The whole application is stopped and updated, as in an update. If the operation fails after a container was changed, the previous containers and the previous choice are restored. An operation that stops halfway is recovered from the OCI management menu.": "Kontajner strojového učenia je prestavaný s obrazom novej voľby. Uchováva sa jej vyrovnávacia pamäť modelu, knižnica a databáza. Celá aplikácia je zastavená a aktualizovaná ako pri aktualizácii. Ak operácia zlyhá po zmene kontajnera, obnovia sa predchádzajúce kontajnery a predchádzajúca voľba. Operácia, ktorá sa zastaví v polovici, sa obnoví z ponuky správy OCI.", + "The machine learning container is rebuilt with the image of the new choice. Its model cache, the library and the database are kept. The whole application is stopped and updated, as in an update. If the operation fails after a container was changed, the previous containers and the previous choice are restored. An operation that stops halfway is recovered from the OCI management menu.": "Kontajner strojového učenia sa znova vytvorí z obrazu pre zvolený CPU alebo GPU. Vyrovnávacia pamäť modelov, knižnica a databáza sa zachovajú. Celá aplikácia sa zastaví a aktualizuje rovnakým postupom ako pri bežnej aktualizácii. Ak operácia po zmene kontajnera zlyhá, ProxMenux sa pokúsi obnoviť predchádzajúce kontajnery aj pôvodnú voľbu CPU/GPU. Ak operácia zostane nedokončená, obnovte ju z ponuky správy OCI.", "The machine learning container is rebuilt with the image of the new choice. Its model cache, the library and the database are kept. The whole application is stopped and updated, as in an update; if anything fails, the previous containers and the previous choice are restored.": "Kontajner strojového učenia je prestavaný s obrazom novej voľby. Uchováva sa jej vyrovnávacia pamäť modelu, knižnica a databáza. Celá aplikácia sa zastaví a aktualizuje ako pri aktualizácii; ak čokoľvek zlyhá, obnovia sa predchádzajúce kontajnery a predchádzajúca voľba.", "The main container of this application is not on this host. Restore it too.": "Hlavný kontajner tejto aplikácie nie je na tomto hostiteľovi. Obnovte ho tiež.", "The main member must stop first and start last": "Hlavný člen sa musí zastaviť prvý a začať posledný", @@ -6635,7 +6635,7 @@ "The preselected VMID does not exist on this host:": "Predvybrané VMID na tomto hostovi neexistuje:", "The previous native backup will be restored. Shared host directories are not reverted. Displaced disks are kept.": "Predchádzajúce domáce zálohy budú obnovené. Spoločné adresáre sa nevrátia. Zadržiavajú sa vypustené disky.", "The previous native backup will be restored. Shared host directories are not reverted. The disks of the failed attempt are removed.": "Obnoví sa predchádzajúca natívna záloha. Zdieľané hostiteľské adresáre sa nevrátia späť. Disky neúspešného pokusu sa odstránia.", - "The previous recognition choice could not be put back:": "Predchádzajúcu voľbu rozpoznávania nebolo možné vrátiť späť:", + "The previous recognition choice could not be put back:": "Pôvodné nastavenie CPU/GPU pre rozpoznávanie sa nepodarilo obnoviť:", "The previous stack contract is not safe; review it before reusing it": "Predchádzajúca stack zmluva nie je bezpečná; pred opätovným použitím ju preskúmajte", "The previous stack contract is not valid; it is not archived automatically": "Predchádzajúca zmluva nie je platná; nie je automaticky archivovaná", "The previous stack contract still has containers or VMs:": "Predchádzajúca stack zmluva má stále kontajnery alebo VM:", @@ -6659,8 +6659,8 @@ "The read-only view was not published": "Zobrazenie nebolo zverejnené", "The read/write view was not published": "Pohľad na čítanie/ zápis nebol zverejnený", "The recipe requires configuration at startup; its coordinated replay is not available": "Recept requires konfigurácie pri štarte; jeho koordinovaný opakovaný záznam nie je k dispozícii", - "The recognition change of Immich did not complete:": "Zmena rozpoznávania Immich sa nedokončila:", - "The recognition of Immich was not changed:": "Rozpoznanie Immich sa nezmenilo:", + "The recognition change of Immich did not complete:": "Zmenu CPU/GPU pre rozpoznávanie v Immichu sa nepodarilo dokončiť:", + "The recognition of Immich was not changed:": "Spôsob rozpoznávania v Immichu sa nezmenil:", "The record belongs to another container": "Záznam patrí do inej nádoby", "The record does not belong to this operation": "Záznam nepatrí k tomuto operation", "The record no longer belongs to this operation": "Záznam už nepatrí k tomuto operation", @@ -6682,7 +6682,7 @@ "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.", "The remote path must be relative and cannot contain line breaks": "Diaľková dráha musí byť relatívna a nesmie obsahovať prestávky na priamke", "The removal could not be prepared:": "Odstránenie nebolo možné pripraviť:", - "The render device does not belong to the GPU of that choice": "Renderovacie zariadenie nepatrí k GPU tohto výberu", + "The render device does not belong to the GPU of that choice": "Renderovacie zariadenie nepatrí ku GPU pre zvolený profil", "The render device does not exist:": "Renderovacie zariadenie neexistuje:", "The repair must preserve the image dependencies:": "Oprava musí zachovať závislosť obrazu:", "The requested VMID block is already in use": "Požadovaný blok VMID sa už používa", @@ -6848,7 +6848,7 @@ "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:", - "This application is not an Immich installed by ProxMenux": "Táto aplikácia nie je Immich nainštalovaná ProxMenux", + "This application is not an Immich installed by ProxMenux": "Táto aplikácia nie je Immich nainštalovaný pomocou ProxMenuxu", "This application is not in the OCI catalog.": "Táto aplikácia nie je v katalógu OCI.", "This application is under watchdog: it is restarted automatically when it crashes. Turn the watchdog off?": "Táto aplikácia je pod watchdogom: pri zlyhaní sa automaticky reštartuje. Vypnúť watchdog?", "This archive does not contain a recognized backup layout.": "Tento archív neobsahuje rozpoznané rozloženie zálohy.", @@ -6932,7 +6932,7 @@ "This session is running in the Monitor terminal. Running it from here would cut the connection mid-install and leave the switch in a broken state.": "Táto relácia beží v termináli Monitora. Ak by sa to spustilo odtiaľto, pripojenie sa počas inštalácie preruší a prepnutie môže zostať v zlom stave.", "This session is running in the Monitor terminal. Updating from here would restart the Monitor service and cut the connection mid-install, leaving the update in a broken state.": "Táto relácia beží v termináli Monitor. Aktualizácia odtiaľto by reštartovala službu Monitor a prerušila spojenie uprostred inštalácie, čo by mohlo nechať aktualizáciu v poškodenom stave.", "This shows the storage type and disk identifier": "Týmto sa zobrazí typ úložiska a identifikátor disku", - "This stack has no saved members to update.": "Tento zásobník nemá uložených členov na aktualizáciu.", + "This stack has no saved members to update.": "Pre túto aplikáciu nie je uložený zoznam kontajnerov.", "This stack needs rootfs adaptations that coordinated updates cannot replay yet.": "Tento zásobník potrebuje úpravy rootfs, ktoré sa zatiaľ nedajú prehrať koordinované aktualizácie.", "This stack requires replaying specific rootfs adaptations. Coordinated updates are not yet enabled for it.": "Tento zásobník requires prehráva špecifické korektúry. Koordinované aktualizácie pre ňu zatiaľ nie sú povolené.", "This state has a high probability of VM startup/reset failures.": "Tento stav má vysokú pravdepodobnosť zlyhania štartu alebo resetu VM.", @@ -7302,7 +7302,7 @@ "Use option 1 to add a local disk (as Proxmox storage and/or as a host mount).": "Použite možnosť 1 na pridanie lokálneho disku (ako úložisko Proxmoxu a/alebo ako mount na hostovi).", "Use option 1 to add an iSCSI target as Proxmox storage.": "Použite možnosť 1 na pridanie iSCSI targetu ako úložiska Proxmoxu.", "Use pigz for faster gzip compression": "Použiť pigz pre rýchlejšiu gzip kompresiu", - "Use the GPU with ROCm anyway?": "Napriek tomu používať GPU s ROCm?", + "Use the GPU with ROCm anyway?": "Použiť napriek tomu GPU s ROCm?", "Use the Guided Cleanup option to fix issues safely": "Na bezpečné vyčistenie použite sprievodcu čistením", "Use the Guided Repair option to fix issues safely": "Na bezpečnú opravu použite sprievodcu opravou", "Use these commands on your Proxmox host to access an LXC container's terminal:": "Tieto príkazy použite na Proxmox serveri, keď chcete otvoriť terminál LXC kontajnera:", @@ -7547,7 +7547,7 @@ "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", + "What runs the recognition of Immich": "Rozpoznávanie v Immichu: CPU alebo GPU", "What to modify": "Čo upraviť", "What to recreate": "Čo znovu vytvoriť", "What would you like to do?": "Čo chcete urobiť?",