diff --git a/.github/scripts/run_offline_qualified.py b/.github/scripts/run_offline_qualified.py index 5e291922..e8bf3dd6 100644 --- a/.github/scripts/run_offline_qualified.py +++ b/.github/scripts/run_offline_qualified.py @@ -15,6 +15,9 @@ import tempfile PYTHON_FILES = ( "tests/test_post_install_i18n.py", "tests/test_remaining_cli_i18n.py", + "AppImage/scripts/tests/test_pbs_i18n.py", + "AppImage/scripts/tests/test_monitor_links_i18n.py", + "AppImage/scripts/tests/test_monitor_links.py", "AppImage/scripts/tests/test_local_app_icon_isolation.py", "AppImage/scripts/tests/test_local_app_icons.py", "AppImage/scripts/tests/test_docker_app_discovery.py", @@ -33,6 +36,12 @@ NODE_FILES = ( "tests/test_api_import_boundaries.cjs", "tests/test_api_errors.cjs", "tests/test_optimization_labels.cjs", + "tests/test_optimization_source.cjs", + "tests/lxc_updates/test_app_editor_errors.cjs", + "tests/test_oci_update_cancellation.cjs", + "tests/test_host_backup_messages.cjs", + "tests/test_pbs_i18n.cjs", + "tests/test_monitor_links_i18n.cjs", "tests/lxc_updates/test_local_app_icons_ui.cjs", "tests/lxc_updates/test_docker_app_discovery_ui.cjs", "tests/lxc_updates/test_native_app_discovery_ui.cjs", diff --git a/.github/scripts/tests/test_oci_complete_errors_sk.py b/.github/scripts/tests/test_oci_complete_errors_sk.py new file mode 100644 index 00000000..0a6bf0d4 --- /dev/null +++ b/.github/scripts/tests/test_oci_complete_errors_sk.py @@ -0,0 +1,284 @@ +"""Human diagnostics translate; IDs, JSON, error types and forbidden effects do not.""" +from contextlib import ExitStack, nullcontext, redirect_stderr, redirect_stdout +import copy +import importlib.util +import io +import json +from pathlib import Path +import sys +import tempfile +import unittest +from unittest.mock import MagicMock, Mock, patch +import urllib.error + +sys.path.insert(0, str(Path(__file__).resolve().parent)) +import test_oci_complete_ui_sk as fixtures +from proxmenux_oci import casaos, cli, converter, i18n +from proxmenux_oci.catalog import Catalog +from proxmenux_oci.github_source import GitHubSource, SourceError +import oci_image_cache +import oci_dhcp_lease +import oci_rocm_check +import oci_ui +import oci_watchdog +import configure_jellyfin_encoding + + +class TechnicalMessages(unittest.TestCase): + setUp = fixtures.CompleteUI.setUp + patch = fixtures.CompleteUI.patch + + def remote_language(self): + self.patch(oci_ui, '_language', 'sk') + self.patch(oci_ui, '_cache', self.sk) + + def test_real_readme_errors_translate_only_at_the_display_boundary(self): + for text, expected in [('# App', 'README neobsahuje'), + ('## docker-compose\nplain text', 'Sekcia docker-compose neobsahuje blok kódu'), + ('## docker-compose\n```yaml\nservices: {}', 'Blok docker-compose nie je ukončený'), + ('## docker-compose\n```yaml\nnot-compose\n```', 'Nájdený blok nevyzerá')]: + with self.subTest(text=text), self.assertRaises(converter.ConversionError) as caught: + converter.extract_compose(text) + raw = str(caught.exception) + self.assertIn(expected, i18n.diagnostic(caught.exception)) + self.assertEqual(str(caught.exception), raw) + + def test_schema_error_keeps_field_details_and_original_exception(self): + with self.assertRaises(converter.ConversionError) as caught: + self.catalog.validate({}) + raw = str(caught.exception) + self.assertTrue(raw.startswith('La plantilla generada no cumple el esquema:')) + self.assertEqual(i18n.diagnostic(caught.exception), 'Vygenerovaná šablóna nezodpovedá schéme:' + raw.split(':', 1)[1]) + + def test_missing_schema_validator_is_distinct_from_invalid_schema_without_effects(self): + template = {} + read = self.patch(Path, 'read_text', side_effect=AssertionError('schema must not be read without a validator')) + with patch.dict(sys.modules, {'jsonschema': None}): + with self.assertRaises(converter.ConversionError) as caught: + self.catalog.validate(template) + raw = 'python3-jsonschema is required to generate templates' + self.assertEqual(str(caught.exception), raw) + self.assertEqual(i18n.diagnostic(caught.exception), 'Na generovanie šablón je potrebný python3-jsonschema') + self.assertEqual(str(caught.exception), raw) + self.assertIsNone(self.catalog.validate(template, required=False)) + read.assert_not_called() + self.assertEqual(template, {}) + for effect in self.effects: + effect.assert_not_called() + + def test_real_casaos_error_preserves_the_protocol_and_localizes_the_message(self): + with self.assertRaises(converter.ConversionError) as caught: + casaos.parse_casaos_compose('[]') + self.assertEqual(str(caught.exception), 'The CasaOS document is not a Compose mapping') + self.assertEqual(i18n.diagnostic(caught.exception), 'Dokument Compose musí byť mapa kľúčov a hodnôt.') + + def test_github_rate_limit_keeps_url_and_token_variable_without_a_network_call(self): + url = 'https://fiction.invalid/catalogue?ref=example' + error = urllib.error.HTTPError(url, 403, 'Forbidden', {'X-RateLimit-Remaining': '0'}, None) + request = self.patch(__import__('urllib.request', fromlist=['urlopen']), 'urlopen', side_effect=error) + with self.assertRaises(SourceError) as caught: + GitHubSource(token='fictional-token')._request(url) + request.assert_called_once() + text = i18n.diagnostic(caught.exception) + self.assertIn('GitHub vrátil HTTP 403', text) + self.assertIn(url, text) + self.assertIn('GITHUB_TOKEN', text) + self.assertNotIn('fictional-token', text) + + def test_github_timeout_retains_external_reason_and_three_attempts(self): + request = self.patch(__import__('urllib.request', fromlist=['urlopen']), 'urlopen', + side_effect=urllib.error.URLError('fictional external transport reason')) + self.patch(__import__('time'), 'sleep') + with self.assertRaises(SourceError) as caught: + GitHubSource()._request('https://fiction.invalid/template') + self.assertEqual(request.call_count, 3) + self.assertIn('ani po 3 pokusoch: fictional external transport reason', i18n.diagnostic(caught.exception)) + + def test_unknown_diagnostics_and_machine_codes_pass_through_unchanged(self): + for value in ['service:db:healthcheck-format', 'external tool: failure at 0x1234', + 'Check failed', 'Invalid cache', 'Ambiguous application', 'private-operation-id']: + self.assertEqual(i18n.diagnostic(value), value) + + def test_cli_help_preserves_flags_actions_defaults_and_numeric_types(self): + argv = ['manage', '104', '--action', 'recreate', '--unattended', '--min-image-age-days', '7'] + slovak = cli.build_parser() + self.assertIn('Vypísať aplikácie', slovak.format_help()) + with patch.object(i18n, '_language', 'en'): + english = cli.build_parser() + self.assertIn('List applications', english.format_help()) + self.assertEqual(vars(english.parse_args(argv)), vars(slovak.parse_args(argv))) + + def test_cli_summary_preserves_image_reference_ports_mount_paths_and_status_code(self): + template = self.catalog.compose('tandoor') + saved = copy.deepcopy(template) + text = cli._template_summary_text(template) + self.assertIn('Obraz: ' + template['container_contract']['image']['reference'], text) + self.assertIn('Dátové zväzky:', text) + self.assertIn('Stav: ' + template['status'], text) + for mount in template['container_contract']['volumes']: + self.assertIn(mount['container_path'], text) + self.assertEqual(template, saved) + + def test_install_cli_no_stays_successful_cancellation_without_dispatch(self): + template = self.catalog.compose('jellyfin') + saved = copy.deepcopy(template) + self.patch(cli.Catalog, 'compose', return_value=template) + self.patch(cli, 'build_deployment', return_value={'fiction': True}) + self.patch(cli, '_deployment_summary_text', return_value='Fiktívny plán') + answer = self.patch(__import__('builtins'), 'input', return_value='n') + output = io.StringIO() + with redirect_stdout(output): self.assertEqual(cli.main(['install', 'jellyfin']), 0) + self.assertIn('Nainštalovať? [y/N]:', answer.call_args.args[0]) + self.assertEqual(output.getvalue().count('Inštalácia bola zrušená.'), 1) + self.assertEqual(template, saved) + + def test_blocked_install_remains_error_one_and_never_asks_to_install(self): + template = self.catalog.compose('jellyfin') + template['compatibility'].update(automatic_install_candidate=False, untranslated_blockers=['fiction-blocker-code']) + self.patch(cli.Catalog, 'compose', return_value=template) + answer = self.patch(__import__('builtins'), 'input', side_effect=AssertionError('blocked installation asked a question')) + output = io.StringIO() + with redirect_stdout(io.StringIO()), redirect_stderr(output): + self.assertEqual(cli.main(['install', 'jellyfin']), 1) + self.assertIn('Inštalácia je zablokovaná: fiction-blocker-code', output.getvalue()) + answer.assert_not_called() + + def test_watchdog_manual_stop_stays_stopped_without_start_or_notice(self): + self.remote_language() + self.patch(oci_watchdog, 'watched', return_value={777: 'Fiction'}) + self.patch(oci_watchdog, 'is_running', return_value=False) + self.patch(oci_watchdog, 'is_busy', return_value=False) + self.patch(oci_watchdog, 'read_tasks', return_value=[('vzshutdown', '777', 75)]) + start = self.patch(oci_watchdog, 'start', side_effect=AssertionError('manual stop was undone')) + notice = self.patch(oci_watchdog.oci_operation_notice, 'notify') + state = oci_watchdog.new_state(); state['seen'] = 50 + output = io.StringIO() + with redirect_stdout(output): oci_watchdog.look({777: state}, 100) + self.assertTrue(state['settled']) + self.assertEqual(output.getvalue(), '') + start.assert_not_called(); notice.assert_not_called() + + def test_watchdog_localization_does_not_change_retry_state_or_notification_payload(self): + self.patch(oci_watchdog, 'watched', return_value={777: 'Fiction'}) + self.patch(oci_watchdog, 'is_running', return_value=False) + self.patch(oci_watchdog, 'is_busy', return_value=False) + self.patch(oci_watchdog, 'read_tasks', return_value=[]) + start = self.patch(oci_watchdog, 'start', return_value=True) + notice = self.patch(oci_watchdog.oci_operation_notice, 'notify') + outcomes = [] + for locale in ('en', 'sk'): + with patch.object(oci_ui, '_language', locale), patch.object(oci_ui, '_cache', self.sk): + state = oci_watchdog.new_state(); state['seen'] = 50 + text = io.StringIO() + with redirect_stdout(text): oci_watchdog.look({777: state}, 100) + outcomes.append((copy.deepcopy(state), notice.call_args, start.call_args)) + self.assertIn('CT 777 (Fiction)', text.getvalue()) + if locale == 'sk': self.assertIn('spúšťa sa znova (pokus 1)', text.getvalue()) + self.assertEqual(outcomes[0], outcomes[1]) + + def test_image_cache_json_contract_and_invalid_command_have_no_mutations(self): + self.remote_language() + self.patch(oci_image_cache.instances, 'locked', side_effect=lambda *a: nullcontext()) + self.patch(oci_image_cache, 'archives_of', return_value={}) + output = io.StringIO() + with redirect_stdout(output): self.assertEqual(oci_image_cache.main(['list', '777']), 0) + self.assertEqual(json.loads(output.getvalue()), {'archives': [], 'freed': 0}) + error = io.StringIO() + with redirect_stderr(error): self.assertEqual(oci_image_cache.main(['invalid']), 2) + self.assertIn('Použitie: oci_image_cache.py [prune | list VMID... | remove VMID...]', error.getvalue()) + + def test_rocm_timeout_localizes_but_external_gpu_errors_are_preserved(self): + self.remote_language() + self.patch(sys, 'argv', ['oci_rocm_check.py', '777']) + for raw, expected in [('the GPU did not answer in time', 'GPU neodpovedalo včas'), + ('external provider exception 0x123', 'external provider exception 0x123')]: + with self.subTest(raw=raw), patch.object(oci_rocm_check, 'check', side_effect=RuntimeError(raw)): + output = io.StringIO() + with redirect_stderr(output): self.assertEqual(oci_rocm_check.main(), 1) + self.assertEqual(output.getvalue().strip(), expected) + + def test_jellyfin_completion_distinguishes_changed_from_already_applied(self): + self.remote_language() + self.patch(sys, 'argv', ['configure_jellyfin_encoding.py', '/fiction-root', '{}']) + for changed, expected in [(True, 'Nastavenia Jellyfin boli aktualizované:'), + (False, 'Nastavenia Jellyfin už boli použité:')]: + with self.subTest(changed=changed), patch.object(configure_jellyfin_encoding, 'update_encoding', + return_value=(Path('/fiction-root/config/encoding.xml'), changed)): + output = io.StringIO() + with redirect_stdout(output): configure_jellyfin_encoding.main() + self.assertEqual(output.getvalue().strip(), expected + ' /config/encoding.xml') + + def test_dhcp_completion_keeps_interface_and_ip_version_without_repairing_a_guest(self): + self.remote_language() + self.patch(oci_dhcp_lease, 'LOCKS', MagicMock()) + self.patch(oci_dhcp_lease.fcntl, 'flock') + repair = self.patch(oci_dhcp_lease, 'repair', return_value=[('eth0', 4)]) + output = io.StringIO() + with redirect_stdout(output): oci_dhcp_lease.check(777, 0) + repair.assert_called_once_with(777, 0) + self.assertEqual(output.getvalue().strip(), 'CT 777: klient DHCP rozhrania eth0 (IPv4) bol znova spustený') + + +class StandalonePublisher(unittest.TestCase): + def test_mount_error_keeps_host_language_after_entering_the_container_root(self): + spec = importlib.util.spec_from_file_location('fiction_namespace_publisher', + fixtures.ROOT / 'oci/remote/rclone_mount_publish.py') + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + inside = False + def chroot(path): + nonlocal inside + inside = True + def read(path, **kwargs): + if inside: + raise FileNotFoundError('Host language catalog is outside the container root') + return ('{"language":"sk"}' if path.name == 'config.json' else + '{"clone source mount tree":"naklonovať strom zdrojového pripojenia"}') + libc = Mock(); libc.setns.return_value = 0; libc.syscall.return_value = -1 + with ExitStack() as guards: + for target, name, options in [ + (sys, 'argv', {'new': ['publisher.py', '777', '/fiction-source', '/fiction-target', 'ro']}), + (module.platform, 'machine', {'return_value': 'x86_64'}), + (Path, 'read_text', {'autospec': True, 'side_effect': read}), + (module.ctypes, 'CDLL', {'return_value': libc}), + (module.ctypes, 'get_errno', {'return_value': 13}), + (module.os, 'open', {'return_value': 42}), + (module.os, 'close', {}), (module.os, 'fchdir', {}), + (module.os, 'chroot', {'side_effect': chroot}), (module.os, 'chdir', {})]: + guards.enter_context(patch.object(target, name, **options)) + with self.assertRaises(OSError) as caught: + module.main() + self.assertTrue(inside) + self.assertEqual(caught.exception.errno, 13) + self.assertIn('naklonovať strom zdrojového pripojenia', str(caught.exception)) + self.assertEqual(libc.syscall.call_args.args[0], module.SYSCALLS['x86_64'][0]) + + def test_copied_helper_has_localized_errors_without_engine_import_or_mount_syscalls(self): + with tempfile.TemporaryDirectory(prefix='oci-publisher-language-') as directory: + root = Path(directory); (root / 'lang').mkdir() + (root / 'config.json').write_text('{"language":"sk"}') + (root / 'lang/sk.json').write_text(json.dumps({'Usage:': 'Použitie:', 'Unsupported host architecture:': 'Nepodporovaná architektúra hostiteľa:'})) + source = fixtures.ROOT / 'oci/remote/rclone_mount_publish.py' + copied = root / 'publisher.py'; copied.write_bytes(source.read_bytes()) + spec = importlib.util.spec_from_file_location('fiction_standalone_publisher', copied) + module = importlib.util.module_from_spec(spec) + with patch.dict(sys.modules, {'oci_ui': None}), patch.dict(__import__('os').environ, {'PMX_BASE_DIR': str(root)}): + spec.loader.exec_module(module) + with patch.object(module.ctypes, 'CDLL', side_effect=AssertionError('mount syscall path entered')) as syscall: + with patch.object(sys, 'argv', ['publisher.py']), redirect_stderr(io.StringIO()) as output: + self.assertEqual(module.main(), 2) + self.assertIn('Použitie: publisher.py PID SOURCE TARGET rw|ro', output.getvalue()) + with patch.object(sys, 'argv', ['publisher.py', '1', '/fiction-source', '/fiction-target', 'ro']), \ + patch.object(module.platform, 'machine', return_value='fiction-architecture'), redirect_stderr(io.StringIO()) as output: + self.assertEqual(module.main(), 2) + self.assertIn('Nepodporovaná architektúra hostiteľa: fiction-architecture', output.getvalue()) + syscall.assert_not_called() + (root / 'config.json').write_text('invalid json') + module._messages.cache_clear() + self.assertEqual(module.translate('Usage:'), 'Usage:') + (root / 'config.json').write_text('{"language":"en"}') + module._messages.cache_clear() + self.assertEqual(module.translate('Usage:'), 'Usage:') + + +if __name__ == '__main__': unittest.main() diff --git a/.github/scripts/tests/test_oci_complete_ui_sk.py b/.github/scripts/tests/test_oci_complete_ui_sk.py new file mode 100644 index 00000000..6d56db3b --- /dev/null +++ b/.github/scripts/tests/test_oci_complete_ui_sk.py @@ -0,0 +1,148 @@ +"""Real catalogue/wizard rendering, with host and installation effects forbidden.""" +import copy +from contextlib import ExitStack, redirect_stdout +import io +import json +import os +from pathlib import Path +import subprocess +import sys +import unittest +from unittest.mock import Mock, patch + +ROOT = Path(os.environ.get('OCI_I18N_TEST_ROOT', Path(__file__).resolve().parents[3])) +sys.path[:0] = [str(ROOT / 'oci/src'), str(ROOT / 'oci/remote'), str(ROOT / 'oci/tests')] +from proxmenux_oci import cli, i18n, installer, stack +from proxmenux_oci.catalog import Catalog +from proxmenux_oci.converter import ConversionError +from proxmenux_oci.ui import UserCancelled +from test_advanced_flow_order import RecordingUI, addresses, storages + + +class CompleteUI(unittest.TestCase): + def setUp(self): + self.scope = ExitStack() + self.addCleanup(self.scope.close) + self.sk = json.loads((ROOT / 'lang/sk.json').read_text()) + self.catalog = Catalog(ROOT / 'oci') + self.patch(i18n, '_language', 'sk') + self.patch(i18n, '_cache', self.sk) + self.patch(installer.host, 'storages', side_effect=storages) + 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=addresses) + self.patch(installer.access, 'ask_ipv4', return_value=('dhcp', None)) + self.effects = [] + for module, name in [(cli, '_install'), (cli, '_rclone_mount'), (cli, 'run_remote_install'), + (installer, 'run_remote_install'), (cli.images, 'offer_removal'), + (subprocess, 'run'), (subprocess, 'Popen'), (subprocess, 'check_output'), + (Path, 'write_text'), (Path, 'write_bytes'), (Path, 'unlink')]: + self.effects.append(self.patch(module, name, side_effect=AssertionError('Forbidden effect: ' + name))) + self.addCleanup(lambda: [effect.assert_not_called() for effect in self.effects]) + + def patch(self, obj, name, *args, **kwargs): + return self.scope.enter_context(patch.object(obj, name, *args, **kwargs)) + + def test_search_no_match_uses_application_wording_and_never_installs(self): + ui = Mock() + ui.ask.return_value = 'fiction-no-such-app' + cli._search(self.catalog, ui, []) + self.assertEqual(ui.ask.call_args.args[0], 'Názov alebo časť popisu aplikácie') + self.assertIn('Žiadna zhoda aplikácií', ui.message.call_args.args[0]) + ui.choose.assert_not_called() + + def test_immich_detail_translates_service_roles_without_changing_template(self): + template = self.catalog.compose('immich') + before = copy.deepcopy(template) + text = cli._app_detail_text(self.catalog, self.catalog.find_item('immich'), template) + self.assertIn('Strojové učenie', text) + self.assertIn('Aplikácia', text) + self.assertIn('Oficiálny obraz', text) + self.assertNotIn('Machine learning', text) + self.assertEqual(template, before) + with patch.object(i18n, '_language', 'en'): + self.assertIn('Machine learning', cli._app_detail_text(self.catalog, self.catalog.find_item('immich'), template)) + + def test_missing_catalogue_entry_preserves_raw_error_and_localizes_cli(self): + for language, expected in [('sk', "Aplikácia 'fiction-missing' nie je v indexe"), + ('en', "The application 'fiction-missing' is not in the index")]: + with self.subTest(language=language), patch.object(i18n, '_language', language): + with self.assertRaisesRegex(ConversionError, "The application 'fiction-missing' is not in the index"): + self.catalog.find_item('fiction-missing') + output = io.StringIO() + with redirect_stdout(io.StringIO()), patch.object(sys, 'stderr', output), patch.object(cli, 'PROJECT_ROOT', ROOT / 'oci'): + self.assertEqual(cli.main(['show', 'fiction-missing']), 1) + self.assertEqual(output.getvalue().strip(), 'ERROR: ' + expected) + + def test_missing_template_uses_existing_translation_and_keeps_identifier(self): + self.patch(self.catalog, 'find_item', return_value={'id': 'fiction-missing'}) + with self.assertRaises(ConversionError) as caught: + self.catalog.compose('fiction-missing') + self.assertEqual(str(caught.exception), "No template is available for 'fiction-missing'") + self.assertEqual(i18n.diagnostic(caught.exception), "Pre aplikáciu 'fiction-missing' nie je dostupná šablóna") + + def test_detail_cancel_and_escape_do_not_enter_install_or_rclone(self): + for app in ('jellyfin', 'rclone', 'immich', 'suite-arr'): + for escape in (False, True): + with self.subTest(app=app, escape=escape): + ui = Mock() + ui.confirm.return_value = False + ui.detail_menu.return_value = None + if escape: + ui.detail_menu.side_effect = UserCancelled() + try: + cli._app_detail(self.catalog, ui, self.catalog.find_item(app)) + except UserCancelled: + self.assertTrue(escape) + + def test_special_wizard_plans_are_identical_in_english_and_slovak(self): + for app in ('immich', 'nextcloud-stack', 'paperless-ngx', 'tandoor'): + for mode in (installer.DEFAULT_MODE, installer.ADVANCED_MODE): + with self.subTest(app=app, mode=mode): + template = self.catalog.compose(app) + before = copy.deepcopy(template) + plan_sk = installer.build_deployment(template, RecordingUI(), mode) + with patch.object(i18n, '_language', 'en'): + plan_en = installer.build_deployment(template, RecordingUI(), mode) + self.assertEqual(plan_sk, plan_en) + self.assertEqual(template, before) + text = cli._deployment_summary_text(template, plan_sk) + self.assertNotIn('Consume/export:', text) + if app == 'paperless-ngx': + self.assertIn('Priečinky consume a export', text) + + def test_romm_optional_credentials_are_localized_but_variable_names_stay(self): + ui = RecordingUI() + ui.confirm = lambda text, default=False, **kwargs: (ui.asked.append(text) or text.startswith('Nastaviť IGDB')) + ui.password = lambda text, **kwargs: (ui.asked.append(text) or 'fiction-secret') + ui.ask = lambda text, default=None, **kwargs: (ui.asked.append(text) or (default if default is not None else 'fiction-value')) + plan = installer.build_deployment(self.catalog.compose('romm'), ui, installer.ADVANCED_MODE) + self.assertTrue(any('Tajný kľúč klienta IGDB' == text for text in ui.asked)) + self.assertFalse(any('IGDB Client Secret' == text for text in ui.asked)) + server = next(service for service in plan['services'] if service['name'] == 'romm') + self.assertTrue(any(row['name'] == 'IGDB_CLIENT_SECRET' for row in server['deployment']['environment'])) + + def test_tandoor_warning_keeps_negative_requirement_and_first_run_account(self): + template = self.catalog.compose('tandoor') + warning = i18n.translate(template['proxmox']['security_profile']['warning']) + self.assertIn('nevyžaduje privilegovaný', warning) + credentials = template['first_run']['credentials'] + self.assertTrue(any('Vygenerovaný účet správcu Tandoor' == i18n.translate(row['label']) for row in credentials)) + + def test_documented_commands_paths_and_literals_remain_copyable(self): + fragments = { + 'rsnapshot starts with the default configuration, which backs up /data into /.snapshots. Edit /config/rsnapshot.conf inside the container to set your own backup points, snapshot root and retention intervals.': ['/data', '/.snapshots', '/config/rsnapshot.conf'], + 'Each /request command needs a backend: add a [[backends]] block in the same file with the url and api_key of your Sonarr, Radarr or Seerr instance, then restart the container.': ['/request', '[[backends]]', 'url', 'api_key'], + 'Named accounts need private mode. Stop the container, set public: false in /config/config.js, start it again and create each user with: pct exec -- env THELOUNGE_HOME=/config s6-setuidgid abc thelounge add ': ['public: false', 'pct exec -- env THELOUNGE_HOME=/config s6-setuidgid abc thelounge add '], + 'Certificate provider: empty for Let\'s Encrypt, zerossl for ZeroSSL': ["Let's Encrypt", 'zerossl', 'ZeroSSL'], + 'Libraries: /data/media/movies, /data/media/series and /data/media/music. Select them in the media server.': ['/data/media/movies', '/data/media/series', '/data/media/music'], + } + for source, tokens in fragments.items(): + with self.subTest(source=source): + for token in tokens: + self.assertIn(token, i18n.translate(source)) + + +if __name__ == '__main__': + unittest.main() 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_modify_cancellation.py b/.github/scripts/tests/test_oci_modify_cancellation.py new file mode 100644 index 00000000..910f0f43 --- /dev/null +++ b/.github/scripts/tests/test_oci_modify_cancellation.py @@ -0,0 +1,176 @@ +"""Cancel a real editor through Menu/CLI/Monitor contracts, never apply it.""" +from contextlib import redirect_stdout +import copy +import io +import json +from pathlib import Path +import sys +from unittest.mock import patch + +from test_oci_update_cancellation import CancellationFixture, ROOT +from proxmenux_oci import cli, management as menu, recreation +from proxmenux_oci.ui import UserCancelled + + +class ModifyCancellationTests(CancellationFixture): + def setUp(self): + super().setUp() + self.record.update({ + 'installation_id': 'fixture-oci-edit-cancel', + 'observed': {'config_sha256': 'fixture-config-hash'}, + 'template': {'id': 'fixture-app', 'catalog_ui': {'title': 'Fixture'}, + 'container_contract': {'image': {'reference': 'example/fixture:latest'}}}, + 'deployment': {'vmid': 110, 'hostname': 'fixture', + 'resources': {'cores': 2, 'memory_mb': 512}, + 'rootfs': {'storage': 'fixture-storage', 'size_gb': 8}, + 'mounts': [], 'devices': [], 'environment': [ + {'name': 'PASSWORD', 'value': 'private-fixture-value', 'sensitive': True}], + 'network': {'bridge': 'vmbr-fixture', 'ipv4': 'dhcp'}}}) + self.original = copy.deepcopy(self.record) + self.ui.back_enabled = False + self.path_write = self.guard(Path, 'write_text') + self.path_bytes = self.guard(Path, 'write_bytes') + + def script(self, choices, answers=(), confirms=(), reviews=()): + self.ui.choose.side_effect = choices + self.ui.ask.side_effect = answers + self.ui.confirm.side_effect = confirms + self.ui.review.side_effect = reviews + + def no_effects(self): + super().no_effects() + self.path_write.assert_not_called() + self.path_bytes.assert_not_called() + self.assertFalse(self.ui.back_enabled) + + def test_main_cancel_is_distinct_falsy_cancellation(self): + self.script([None]) + self.assertIs(menu.manage_instance(ROOT/'oci', self.ui, self.row, action='modify'), menu.CANCELLED) + self.assertFalse(menu.CANCELLED) + self.no_effects() + + def test_main_discard_without_edits_returns_cancel_code(self): + self.script(['discard']) + self.assertEqual(menu.direct_management(ROOT/'oci', 110, 'modify'), 6) + self.ui.confirm.assert_not_called() + self.no_effects() + + def test_real_cli_cancel_returns_code_six_without_extra_console_output(self): + self.script([None]) + with patch.object(cli, 'Catalog'), redirect_stdout(io.StringIO()) as output: + self.assertEqual(cli.main(['manage', '110', '--action', 'modify']), 6) + self.assertEqual(output.getvalue(), '') + self.no_effects() + + def test_real_cli_discard_after_edits_never_calls_backup_or_lifecycle(self): + self.script(['cores', 'discard'], ['3'], [True]) + with patch.object(cli, 'Catalog'), redirect_stdout(io.StringIO()): + self.assertEqual(cli.main(['manage', '110', '--action', 'modify']), 6) + self.ui.confirm.assert_called_once_with('Discard unapplied changes?', False) + self.no_effects() + + def test_main_cancel_after_edits_requires_discard_confirmation(self): + self.script(['cores', None], ['3'], [True]) + self.assertEqual(menu.direct_management(ROOT/'oci', 110, 'modify'), 6) + self.ui.confirm.assert_called_once_with('Discard unapplied changes?', False) + self.no_effects() + + def test_declining_discard_preserves_draft_until_later_main_cancel(self): + self.script(['cores', 'discard', None], ['3'], [False, True]) + self.assertEqual(menu.direct_management(ROOT/'oci', 110, 'modify'), 6) + last_options = dict(self.ui.choose.call_args.args[1]) + self.assertTrue(last_options['cores'].rstrip().endswith('3')) + self.assertIn('Unapplied changes', self.ui.choose.call_args.args[0]) + self.assertEqual(self.ui.confirm.call_count, 2) + self.no_effects() + + def test_section_cancel_returns_to_editor_before_main_cancel(self): + self.script(['cores', None], [UserCancelled()]) + self.assertEqual(menu.direct_management(ROOT/'oci', 110, 'modify'), 6) + self.assertEqual(self.ui.choose.call_count, 2) + self.assertIn('No pending changes', self.ui.choose.call_args.args[0]) + self.ui.review.assert_not_called() + self.no_effects() + + def test_zero_cores_rejected_then_section_and_main_cancel_are_safe(self): + self.script(['cores', None], ['0', UserCancelled()]) + self.assertEqual(menu.direct_management(ROOT/'oci', 110, 'modify'), 6) + self.assertIn('Cores: minimum 1', self.ui.message.call_args.args[0]) + self.assertIn('No pending changes', self.ui.choose.call_args.args[0]) + self.no_effects() + + def test_review_no_returns_to_editor_with_draft_then_discard_cancels(self): + self.script(['cores', 'apply', 'discard'], ['3'], [True], [False]) + self.assertEqual(menu.direct_management(ROOT/'oci', 110, 'modify'), 6) + self.assertEqual(self.ui.choose.call_count, 3) + self.assertIn('Unapplied changes', self.ui.choose.call_args.args[0]) + self.assertNotIn('private-fixture-value', self.ui.review.call_args.args[0]) + self.no_effects() + + def test_native_menu_returns_to_list_after_editor_cancel(self): + self.script(['110', 'modify', None, None]) + with patch.object(menu, '_clean_orphans'), patch.object(menu, 'offer_recovery'), \ + patch.object(menu, '_records_unread', return_value=[]): + menu.interactive_management(ROOT/'oci', self.ui) + self.assertEqual(self.ui.choose.call_count, 4) + self.no_effects() + + def test_legacy_editor_callers_still_receive_none_on_cancel(self): + for choice in (None, 'discard'): + with self.subTest(choice=choice): + self.script([choice]) + self.assertIsNone(recreation.edit_recreation(self.record, self.ui)) + self.no_effects() + + def test_unchanged_review_is_not_mislabeled_as_user_cancellation(self): + self.script(['apply']) + self.assertIsNone(recreation.edit_recreation(self.record, self.ui, cancelled_result=menu.CANCELLED)) + self.ui.message.assert_called_once_with('Nothing was changed.', 'Modify OCI') + self.no_effects() + + def test_real_editor_error_is_not_converted_to_cancellation(self): + self.script(['cores'], [RuntimeError('fixture editor failure')]) + with self.assertRaisesRegex(RuntimeError, 'fixture editor failure'): + menu.direct_management(ROOT/'oci', 110, 'modify') + self.no_effects() + + def test_real_cli_validation_failure_remains_failure_one(self): + self.script(['cores'], [cli.InstallError('fixture validation failure')]) + with patch.object(cli, 'Catalog'), redirect_stdout(io.StringIO()): + self.assertEqual(cli.main(['manage', '110', '--action', 'modify']), 1) + self.no_effects() + + def test_unattended_modify_is_rejected_before_opening_the_editor(self): + self.assertEqual(menu.direct_management(ROOT/'oci', 110, 'modify', unattended=True), 1) + self.ui.choose.assert_not_called() + self.no_effects() + + def test_accepted_proposal_keeps_original_backend_and_private_payload(self): + self.script(['cores', 'apply'], ['3'], reviews=[True]) + self.backup.side_effect = None + self.backup.return_value = True + def lifecycle(command, title): + self.assertEqual(command[:3], [sys.executable, str(ROOT/'oci/remote/oci_update_current.py'), '110']) + proposal_file = Path(command[command.index('--proposal')+1]) + self.assertEqual(proposal_file.stat().st_mode & 0o777, 0o600) + proposal = json.loads(proposal_file.read_text()) + self.assertEqual(proposal['operation'], 'recreate') + self.assertEqual(proposal['candidate']['deployment']['resources']['cores'], 3) + self.assertEqual(proposal['base_config_sha256'], 'fixture-config-hash') + self.assertNotIn('private-fixture-value', ' '.join(command)) + return True + self.lifecycle.side_effect = lifecycle + self.assertEqual(menu.direct_management(ROOT/'oci', 110, 'modify'), 0) + self.backup.assert_called_once() + self.lifecycle.assert_called_once() + self.assertEqual(self.record, self.original) + self.write.assert_not_called() + + def test_failed_backup_after_review_remains_failure_without_lifecycle(self): + self.script(['cores', 'apply'], ['3'], reviews=[True]) + self.backup.side_effect = None + self.backup.return_value = False + self.assertEqual(menu.direct_management(ROOT/'oci', 110, 'modify'), 1) + self.lifecycle.assert_not_called() + self.write.assert_not_called() + self.assertEqual(self.record, self.original) diff --git a/.github/scripts/tests/test_oci_recovery_inventory_wording.py b/.github/scripts/tests/test_oci_recovery_inventory_wording.py index 338698ae..097fc5c6 100644 --- a/.github/scripts/tests/test_oci_recovery_inventory_wording.py +++ b/.github/scripts/tests/test_oci_recovery_inventory_wording.py @@ -116,7 +116,7 @@ class RecoveryMessages(unittest.TestCase): instances.ROOT = Path('/inert') instances.read = lambda root, vmid: self.primary self.modules = {'oci_instances': instances, 'oci_stack_replay': ModuleType('oci_stack_replay')} - self.scope = {'sys': SimpleNamespace(path=[], executable='python3'), 'Path': Path, + self.scope = {'sys': SimpleNamespace(path=[], executable='python3'), 'Path': Path, 'CANCELLED': None, 'translate': lambda text: text, 'images': SimpleNamespace(offer_removal=lambda *args: None), '_remove': lambda *args: self.fail('remove must not run'), '_run_lifecycle': lambda command, title: self.calls.append((command, title)) or False} diff --git a/.github/scripts/tests/test_oci_recovery_sk.py b/.github/scripts/tests/test_oci_recovery_sk.py new file mode 100644 index 00000000..a7100933 --- /dev/null +++ b/.github/scripts/tests/test_oci_recovery_sk.py @@ -0,0 +1,246 @@ +"""Pending recovery through real Menu/CLI/Dialog paths; all host effects forbidden.""" +from contextlib import redirect_stdout +import copy +import io +import json +from pathlib import Path +import subprocess +import sys +from types import SimpleNamespace +from unittest.mock import patch + +from test_oci_update_cancellation import CancellationFixture, ROOT +from proxmenux_oci import cli, i18n, management as menu, ui as native_ui +import oci_instances as instances +import oci_instance_transaction as transaction +import oci_native_modify as native_modify +import oci_stack_transaction as stack_transaction +import oci_ui + +ACTUAL_RECOVER = transaction.recover + + +class PendingRecoveryFixture(CancellationFixture): + def setUp(self): + super().setUp() + self.record.update(pending_transaction='/fiction-only/transaction.json') + self.row['pending'] = True + self.ui.choose.return_value = 'recover' + self.original = copy.deepcopy(self.record) + self.writes = [self.guard(Path, name) for name in ('write_text', 'write_bytes', 'unlink')] + self.processes = [self.guard(subprocess, name) for name in ('run', 'Popen', 'check_output')] + self.recovery = self.guard(transaction, 'recover') + self.native_recovery = self.guard(native_modify, 'recover') + self.stack_recovery = self.guard(stack_transaction, 'execute') + + def stack(self): + self.row['stack'] = True + self.record['pending_stack_transaction'] = '/fiction-only/stack.json' + self.original = copy.deepcopy(self.record) + + def no_effects(self): + super().no_effects() + for mock in [*self.writes, *self.processes, self.recovery, self.native_recovery, self.stack_recovery]: + mock.assert_not_called() + + +class PendingRecoveryTests(PendingRecoveryFixture): + def test_single_no_is_distinct_falsy_cancellation(self): + self.assertIs(menu.manage_instance(ROOT/'oci', self.ui, self.row), menu.CANCELLED) + self.assertFalse(menu.CANCELLED) + self.no_effects() + + def test_single_menu_cancel_is_distinct_cancellation(self): + self.ui.choose.return_value = None + self.assertIs(menu.manage_instance(ROOT/'oci', self.ui, self.row), menu.CANCELLED) + self.ui.review.assert_not_called() + self.no_effects() + + def test_real_cli_single_no_and_cancel_return_six_without_duplicate_output(self): + for choice in ('recover', None): + with self.subTest(choice=choice), patch.object(cli, 'Catalog'), redirect_stdout(io.StringIO()) as output: + self.ui.choose.return_value = choice + self.assertEqual(cli.main(['manage', '110', '--action', 'update']), 6) + self.assertEqual(output.getvalue(), '') + self.no_effects() + + def test_real_cli_stack_no_returns_six_before_reading_the_journal(self): + self.stack() + with patch.object(cli, 'Catalog'), patch.object(Path, 'read_text', side_effect=AssertionError('Journal read after No')) as read: + self.assertEqual(cli.main(['manage', '110', '--action', 'update']), 6) + read.assert_not_called() + self.no_effects() + + def test_actual_dialog_no_and_escape_cancel_single_and_stack(self): + dialog = native_ui.DialogUI() + for stacked in (False, True): + if stacked: + self.stack() + for code in (1, 255): + with self.subTest(stack=stacked, code=code): + answers = ([] if stacked else [subprocess.CompletedProcess('dialog', 0, stderr='2')]) + answers.append(subprocess.CompletedProcess('dialog', code, stderr='')) + with patch.object(native_ui, 'interactive_ui', return_value=dialog), \ + patch.object(dialog, '_run', side_effect=answers): + self.assertEqual(menu.direct_management(ROOT/'oci', 110, 'update'), 6) + self.no_effects() + + def test_actual_dialog_cancel_and_escape_from_single_operation_menu(self): + dialog = native_ui.DialogUI() + for code in (1, 255): + with self.subTest(code=code), patch.object(native_ui, 'interactive_ui', return_value=dialog), \ + patch.object(dialog, '_run', return_value=subprocess.CompletedProcess('dialog', code, stderr='')): + self.assertEqual(menu.direct_management(ROOT/'oci', 110, 'update'), 6) + self.no_effects() + + def test_native_menu_returns_to_its_list_after_pending_single_or_stack_no(self): + for stacked in (False, True): + if stacked: + self.stack() + self.ui.choose.reset_mock() + self.ui.choose.side_effect = ['110', None] if stacked else ['110', 'recover', None] + with self.subTest(stack=stacked), patch.object(menu, '_clean_orphans'), \ + patch.object(menu, 'offer_recovery'), patch.object(menu, '_records_unread', return_value=[]): + menu.interactive_management(ROOT/'oci', self.ui) + self.assertEqual(self.ui.choose.call_count, 2 if stacked else 3) + self.no_effects() + + def test_confirmed_single_recovery_and_status_preserve_exact_commands_and_results(self): + self.ui.review.return_value = True + for action in ('recover', 'status'): + for success, code in ((True, 0), (False, 1)): + self.lifecycle.reset_mock() + self.lifecycle.side_effect = None + self.lifecycle.return_value = success + self.ui.choose.return_value = action + with self.subTest(action=action, result=success): + self.assertEqual(menu.direct_management(ROOT/'oci', 110, 'update'), code) + self.lifecycle.assert_called_once_with( + [sys.executable, str(ROOT/'oci/remote/oci_instance_transaction.py'), action, '110'], + 'Recover OCI' if action == 'recover' else 'OCI management') + self.write.assert_not_called(); self.backup.assert_not_called() + self.assertEqual(self.record, self.original) + + def test_confirmed_stack_recovery_preserves_command_and_failure_is_not_cancel(self): + self.stack() + self.ui.review.return_value = True + for success, code in ((True, 0), (False, 1)): + self.lifecycle.reset_mock() + self.lifecycle.side_effect = None + self.lifecycle.return_value = success + with self.subTest(result=success), patch.object(Path, 'read_text', return_value=json.dumps({'plan': {'members': [{'vmid': 110}, {'vmid': 111}]}})): + self.assertEqual(menu.direct_management(ROOT/'oci', 110, 'update'), code) + self.lifecycle.assert_called_once_with( + [sys.executable, str(ROOT/'oci/remote/oci_stack_native.py'), '110', '--recover', '--acknowledge-external-data'], + 'Recover OCI stack') + self.write.assert_not_called(); self.backup.assert_not_called() + self.assertEqual(self.record, self.original) + + def test_identity_failure_stays_failure_and_does_not_offer_recovery(self): + with patch.object(menu, 'check_selected', return_value={**self.row, 'reason': 'different-installation'}): + self.assertEqual(menu.direct_management(ROOT/'oci', 110, 'update'), 1) + self.ui.choose.assert_not_called(); self.ui.review.assert_not_called() + self.no_effects() + + def test_unattended_does_not_turn_pending_menu_into_an_automatic_restore(self): + self.assertEqual(menu.direct_management(ROOT/'oci', 110, 'update', unattended=True), 1) + self.no_effects() + + def test_registration_cli_retains_its_separate_entry_point(self): + with patch.object(cli, 'Catalog'), patch.object(menu, 'direct_recovery', return_value=0) as register, \ + patch.object(menu, 'direct_management', side_effect=AssertionError('Registration routed to rollback')): + self.assertEqual(cli.main(['recover']), 0) + register.assert_called_once_with(ROOT/'oci') + self.no_effects() + + +class RecoverySlovakMeaning(PendingRecoveryFixture): + def test_actual_recovery_dialogs_preserve_host_data_and_bounded_recovery_meaning(self): + cache = json.loads((ROOT/'lang/sk.json').read_text()) + with patch.object(i18n, '_language', 'sk'), patch.object(i18n, '_cache', cache): + menu.manage_instance(ROOT/'oci', self.ui, self.row) + text = self.ui.review.call_args.args[0] + self.assertIn('Zdieľané hostiteľské adresáre sa nevrátia späť', text) + self.assertIn('po úspešnom vyčistení', text) + self.assertEqual(self.ui.choose.call_args.args[0], 'Prerušená operácia') + self.assertEqual(dict(self.ui.choose.call_args.args[1])['status'], 'Zobraziť stav') + self.stack() + menu.manage_instance(ROOT/'oci', self.ui, self.row) + self.assertEqual(self.ui.review.call_args.args[1], 'Obnoviť OCI aplikáciu s viacerými kontajnermi') + self.assertIn('môžu zlyhať', self.ui.review.call_args.args[0]) + self.assertEqual(self.ui.review.call_args.kwargs['question'], 'Obnoviť alebo dokončiť operáciu?') + self.no_effects() + + +class RecoveryGuardMessages(PendingRecoveryFixture): + def setUp(self): + super().setUp() + cache = json.loads((ROOT/'lang/sk.json').read_text()) + for name, value in (('_language', 'sk'), ('_cache', cache)): + p = patch.object(oci_ui, name, value) + p.start(); self.addCleanup(p.stop) + self.record.update(installation_id='fiction-installation', transaction_id='fiction-tx') + self.original = copy.deepcopy(self.record) + self.journal = Path(self.record['pending_transaction']) + self.state = {'id': 'fiction-tx', 'vmid': 110, 'phase': 'backup-ready', + 'record': {'installation_id': 'fiction-installation'}, 'before_config': 'before', + 'backup': None, 'backup_sha256': 'saved-sha'} + + def rejected(self, text, *, node='fiction-host', changed_backup=False): + calls = [] + def readonly(*args): + calls.append(args) + if args[0] == 'pvesh': + return json.dumps([{'type': 'lxc', 'vmid': 110, 'node': node}]).encode() + if args == ('pct', 'config', '110'): + return b'changed' + raise AssertionError('Unexpected recovery effect: ' + repr(args)) + with patch.object(Path, 'read_text', return_value=json.dumps(self.state)), \ + patch.object(Path, 'exists', return_value=True), patch.object(Path, 'is_file', return_value=True), \ + patch.object(transaction.socket, 'gethostname', return_value='fiction-host'), \ + patch.object(transaction.host_mounts, 'verify_sources'), patch.object(transaction.gpu_devices, 'verify'), \ + patch.object(transaction, 'owned', return_value=b'fiction config'), \ + patch.object(transaction, 'filehash', return_value='changed-sha' if changed_backup else 'saved-sha'), \ + patch.object(transaction, 'run', side_effect=readonly), redirect_stdout(io.StringIO()): + # Only reads before the rejecting guard are supplied. Any next + # command or attempt to persist state fails this fixture. + with self.assertRaisesRegex(ValueError, text): + ACTUAL_RECOVER(ROOT/'oci', self.journal) + self.no_effects() + return calls + + def test_foreign_transaction_is_rejected_before_probing_the_container(self): + self.state['record']['installation_id'] = 'different-installation' + self.assertEqual(self.rejected('Záznam nepatrí k tejto operácii'), []) + + def test_missing_verified_backup_cannot_touch_a_changed_container(self): + self.assertEqual(len(self.rejected('Chýba overená záloha; zmenený kontajner zostáva nedotknutý')), 2) + + def test_changed_backup_is_rejected_before_decompression_or_restore(self): + self.state['backup'] = '/fiction-only/backup.zst' + self.assertEqual(len(self.rejected('Záloha bola zmenená; obnova zablokovaná', changed_backup=True)), 2) + + def test_guest_on_another_node_is_never_overwritten(self): + self.assertEqual(len(self.rejected('kontajner je na inom uzle; nie je prepísaný', node='another-node')), 1) + + def test_incomplete_stack_recovery_state_fails_before_any_adapter_call(self): + adapter = SimpleNamespace(validate=self.recovery, stop=self.native_recovery, + restore=self.stack_recovery) + state = {'phase': 'recovery-failed', 'plan': {'start_order': [110, 111]}, + 'running': {'110': True}, 'stop_intent': True, 'replacement_intent': False} + before = copy.deepcopy(state) + with self.assertRaisesRegex(ValueError, 'Záznam operácie obsahuje neúplný stav obnovy'): + stack_transaction.recover_state(self.journal, state, adapter) + self.assertEqual(state, before) + self.no_effects() + + def test_critical_safety_and_untouched_result_have_the_correct_meaning(self): + cache = json.loads((ROOT/'lang/sk.json').read_text()) + self.assertEqual(cache['A host mount is not part of the journal; recovery blocked'], + 'Pripojenie adresára hostiteľa nie je uvedené v zázname operácie; obnova je zablokovaná') + self.assertEqual(cache['Recovery completed. The container had not been modified yet.'], + 'Obnova dokončená. Kontajner ešte nebol zmenený.') + self.assertEqual(cache['A backup was modified'], 'Záloha bola zmenená') + self.assertEqual(cache['Recovering the previous installation'], 'Obnovovanie predchádzajúcej inštalácie') + self.assertEqual(cache['Recover the previous installation'], 'Obnoviť predchádzajúcu inštaláciu') + self.no_effects() diff --git a/.github/scripts/tests/test_oci_registration_sk.py b/.github/scripts/tests/test_oci_registration_sk.py new file mode 100644 index 00000000..ce4cb4ca --- /dev/null +++ b/.github/scripts/tests/test_oci_registration_sk.py @@ -0,0 +1,234 @@ +"""Restored-app registration through real Menu/CLI/Dialog; no host effects.""" +from contextlib import nullcontext, redirect_stdout +import copy +import io +import json +from pathlib import Path +import string +import subprocess +import tempfile +import unittest +from unittest.mock import patch + +from test_oci_update_cancellation import CancellationFixture, ROOT +from proxmenux_oci import cli, i18n, management as menu, ui as native_ui +import oci_restore_recovery as restored +import oci_ui + + +class RegistrationFixture(CancellationFixture): + def setUp(self): + super().setUp() + self.found = [{'vmid':110, 'hostname':'fiction-primary'}] + self.original_found = copy.deepcopy(self.found) + self.ui.confirm.return_value = False + item = patch.object(menu, 'restored_applications', side_effect=lambda project:self.found) + self.pending = item.start();self.addCleanup(item.stop) + self.firewall = self.guard(menu, '_restored_firewall_rules') + self.backend = [self.guard(restored, name) for name in ('recover','register','run')] + self.files = [self.guard(Path, name) for name in ('write_text','write_bytes','unlink')] + self.processes = [self.guard(subprocess, name) for name in ('run','Popen','check_output')] + + def members(self): + self.found.append({'vmid':111,'hostname':'fiction-dependent'}) + self.original_found = copy.deepcopy(self.found) + + def no_effects(self): + super().no_effects() + self.firewall.assert_not_called() + self.safe_backend() + + def safe_backend(self): + for item in [*self.backend,*self.files,*self.processes]:item.assert_not_called() + self.assertEqual(self.found,self.original_found) + + def accepted(self, answers, completed=True): + self.ui.confirm.side_effect=answers + self.firewall.side_effect=None + self.firewall.return_value=[{'vmid':row['vmid'],'port':61208 if row['vmid']==110 else 19999, + 'source':'192.0.2.0/24'} for row in self.found] + self.lifecycle.side_effect=None;self.lifecycle.return_value=completed + self.pending.side_effect=lambda project:[] if completed and self.lifecycle.called else self.found + + +class RegistrationCancellationTests(RegistrationFixture): + def test_offer_no_is_explicit_falsy_cancellation(self): + self.assertIs(menu.offer_recovery(ROOT/'oci',self.ui),menu.CANCELLED) + self.assertFalse(menu.CANCELLED);self.no_effects() + + def test_direct_single_no_finishes_before_a_third_pending_read(self): + self.assertEqual(menu.direct_recovery(ROOT/'oci'),6) + self.assertEqual(self.pending.call_count,2) + self.no_effects() + + def test_real_cli_single_no_returns_six_without_output(self): + with patch.object(cli,'Catalog'),redirect_stdout(io.StringIO()) as output: + self.assertEqual(cli.main(['recover']),6) + self.assertEqual(output.getvalue(),'');self.no_effects() + + def test_real_cli_multi_container_no_is_not_a_guest_action(self): + self.members() + with patch.object(cli,'Catalog'): + self.assertEqual(cli.main(['recover']),6) + text=self.ui.confirm.call_args.args[0] + self.assertIn('CT 110',text);self.assertIn('CT 111',text) + self.no_effects() + + def test_actual_dialog_initial_no_and_escape_for_single_and_multi(self): + dialog=native_ui.DialogUI() + for multi in (False,True): + if multi:self.members() + for code in (1,255): + with self.subTest(multi=multi,code=code),patch.object(native_ui,'interactive_ui',return_value=dialog), \ + patch.object(dialog,'_run',return_value=subprocess.CompletedProcess('dialog',code,stderr='')): + self.assertEqual(menu.direct_recovery(ROOT/'oci'),6) + self.no_effects() + + def test_native_menu_continues_to_list_after_registration_no(self): + self.ui.choose.return_value=None + with patch.object(menu,'_clean_orphans'),patch.object(menu,'_records_unread',return_value=[]): + menu.interactive_management(ROOT/'oci',self.ui) + self.ui.choose.assert_called_once();self.no_effects() + + def test_optional_firewall_and_start_no_registers_without_flags(self): + self.members();self.accepted([True,False,False,False]) + self.assertEqual(menu.direct_recovery(ROOT/'oci'),0) + self.assertEqual(self.lifecycle.call_args.args[0], + [menu.sys.executable,str(ROOT/'oci/remote/oci_restore_recovery.py'),'recover']) + self.assertEqual(self.ui.confirm.call_count,4);self.safe_backend() + + def test_single_optional_no_preserves_registration_without_start(self): + self.accepted([True,False,False]) + self.assertEqual(menu.direct_recovery(ROOT/'oci'),0) + self.assertEqual(self.lifecycle.call_args.args[0], + [menu.sys.executable,str(ROOT/'oci/remote/oci_restore_recovery.py'),'recover']) + self.assertEqual(self.ui.confirm.call_count,3);self.safe_backend() + + def test_only_one_confirmed_firewall_is_forwarded_and_no_start(self): + self.members();self.accepted([True,False,True,False]) + self.assertEqual(menu.direct_recovery(ROOT/'oci'),0) + self.assertEqual(self.lifecycle.call_args.args[0][-2:],['--host-firewall','111']) + self.assertNotIn('--start',self.lifecycle.call_args.args[0]);self.safe_backend() + + def test_explicit_start_yes_retains_flag_but_never_starts_any_guest_here(self): + self.accepted([True,False,True]) + self.assertEqual(menu.direct_recovery(ROOT/'oci'),0) + self.assertEqual(self.lifecycle.call_args.args[0][-1],'--start');self.safe_backend() + + def test_failed_registration_stays_failure_with_pending_records(self): + self.accepted([True,False,False],completed=False) + self.assertEqual(menu.direct_recovery(ROOT/'oci'),1) + self.safe_backend() + + def test_empty_list_is_success_without_confirmation_or_backend(self): + self.found.clear();self.original_found=[] + self.assertEqual(menu.direct_recovery(ROOT/'oci'),0) + self.ui.confirm.assert_not_called();self.ui.message.assert_called_once();self.no_effects() + + def test_root_identity_failure_never_probes_restored_apps(self): + with patch.object(menu.os,'geteuid',return_value=1000): + self.assertEqual(menu.direct_recovery(ROOT/'oci'),1) + self.pending.assert_not_called();self.ui.confirm.assert_not_called();self.no_effects() + + def test_empty_offer_does_not_cancel_the_native_menu(self): + self.found.clear();self.original_found=[] + self.assertIsNone(menu.offer_recovery(ROOT/'oci',self.ui)) + self.ui.confirm.assert_not_called();self.no_effects() + + def test_empty_registration_state_is_rendered_in_slovak_without_recovery(self): + catalog=json.loads((ROOT/'lang/sk.json').read_text()) + with patch.object(i18n,'_language','sk'),patch.object(i18n,'_cache',catalog): + self.found.clear();self.original_found=[] + self.assertEqual(menu.direct_recovery(ROOT/'oci'),0) + self.assertEqual(self.ui.message.call_args.args[0], + 'Žiadna OCI aplikácia obnovená zo zálohy nečaká na opätovnú registráciu.') + self.no_effects() + + def test_initial_single_and_multi_dialog_describes_registration_precheck(self): + catalog=json.loads((ROOT/'lang/sk.json').read_text()) + for multi in (False,True): + if multi:self.members() + with self.subTest(multi=multi),patch.object(i18n,'_language','sk'),patch.object(i18n,'_cache',catalog): + self.assertEqual(menu.direct_recovery(ROOT/'oci'),6) + text=self.ui.confirm.call_args.args[0] + self.assertIn('Pred opätovnou registráciou',text) + self.assertNotIn('Obnova najprv',text) + self.assertIn('aplikácie sa potom nespúšťajú automaticky',text) + self.no_effects() + + def test_real_backend_blocker_stays_error_and_uses_registration_wording(self): + catalog=json.loads((ROOT/'lang/sk.json').read_text()) + plan={'title':'Fictional restored application','restored':[{'vmid':110}], + 'blockers':['Fictional missing resource'],'notes':[]} + with patch.object(menu.sys,'argv',['fixture','recover','--root','/fiction-only']), \ + patch.object(restored.instances,'locked',return_value=nullcontext()), \ + patch.object(restored,'prepare',return_value=[plan]), \ + patch.object(oci_ui,'_language','sk'),patch.object(oci_ui,'_cache',catalog), \ + patch.object(restored,'msg_error') as error,patch.object(restored,'msg_info2'): + self.assertEqual(restored.main(),1) + error.assert_called_once_with('Túto aplikáciu zatiaľ nemožno znova zaregistrovať:') + self.no_effects() + + def test_real_host_resource_check_reports_missing_data_without_creating_anything(self): + catalog=json.loads((ROOT/'lang/sk.json').read_text()) + plan={'restored':[{'vmid':110,'config':'mp0: /fiction-only/data,mp=/data\n', + 'copy':{'record':{'deployment':{},'observed':{}}}}], 'blockers':[],'notes':[]} + with patch.object(oci_ui,'_language','sk'),patch.object(oci_ui,'_cache',catalog), \ + patch.object(restored.os.path,'isdir',return_value=False), \ + patch.object(restored,'firewall_rule',return_value=None): + restored.check_host_resources(plan) + self.assertEqual(len(plan['blockers']),1) + self.assertIn('/fiction-only/data',plan['blockers'][0]) + self.assertIn('registráciu zopakujte',plan['blockers'][0]) + self.no_effects() + + +class RegistrationContractTests(unittest.TestCase): + def test_real_monitor_shell_recover_keeps_global_cli_contract_and_exit_six(self): + with tempfile.TemporaryDirectory() as folder: + base=Path(folder);(base/'scripts/oci').mkdir(parents=True) + (base/'utils.sh').write_text('load_language() { :; }\ninitialize_cache() { :; }\n') + (base/'scripts/oci/oci_manager_apps.sh').write_text('printf "%s\\n" "$@"\nexit 6\n') + script=(ROOT/'scripts/oci/manage_instance.sh').read_text() + script=script.replace('/usr/local/share/proxmenux',folder) + import os + result=subprocess.run(['bash','-c',script],capture_output=True,text=True, + env={**os.environ,'ACTION':'recover','VMID':'not-a-vmid'}) + self.assertEqual(result.returncode,6);self.assertEqual(result.stdout,'recover\n') + self.assertEqual(result.stderr,'') + + def test_curated_slovak_registration_words_and_format_fields(self): + catalog=json.loads((ROOT/'lang/sk.json').read_text()) + expected={ + 'Recover restored OCI applications':'Registrácia', + 'No restored OCI application is waiting to be recovered.':'registráciu', + 'Recover them now?':'zaregistrovať', + 'This application cannot be recovered yet:':'zaregistrovať', + 'The application could not be recovered:':'zaregistrovať', + 'Start the applications once they are registered? Answer No if the original containers are still running on another host: both would use the same addresses.':'vyberte Nie', + 'it is locked or its disk could not be mounted':'uzamknutý', + 'The local storage does not accept snippets':'local', + 'it uses an NVIDIA GPU and this host has no working NVIDIA driver and Container Toolkit. Install them and run the recovery again.':'NVIDIA Container Toolkit', + 'the NVIDIA hook of the container is not available:':'spúšťací skript', + 'its Rclone mount is published again on this host at':'v ceste', + 'Choose another bridge for the container in Proxmox (Network) and run the recovery again.':'registráciu', + 'Mount or create it with its data and run the recovery again.':'registráciu', + 'Connect it, or remove it from the container in Proxmox (Resources), and run the recovery again.':'registráciu', + } + fields=lambda text:sorted(f for _,f,_,_ in string.Formatter().parse(text) if f) + for key,word in expected.items(): + with self.subTest(key=key): + self.assertIn(word,catalog[key]);self.assertEqual(fields(key),fields(catalog[key])) + + def test_registration_web_text_is_distinct_from_previous_installation_recovery(self): + for locale in ('en','sk'): + data=json.loads((ROOT/'AppImage/messages'/locale/'common.json').read_text())['vmLxc'] + with self.subTest(locale=locale): + self.assertEqual(data['ociUpdates']['registerRestored'], + 'Znova zaregistrovať' if locale=='sk' else 'Register again') + self.assertEqual(data['ociUpdates']['recover'],'Obnoviť' if locale=='sk' else 'Recover') + self.assertIn('zaregistrovať' if locale=='sk' else 'Register again',data['updates']['ociRestoredBody']) + self.assertIn('Zaregistrovať' if locale=='sk' else 'Register',data['ociUpdates']['terminalTitleRecover']) + + +if __name__=='__main__':unittest.main() diff --git a/.github/scripts/tests/test_oci_removal_sk.py b/.github/scripts/tests/test_oci_removal_sk.py new file mode 100644 index 00000000..5af41c15 --- /dev/null +++ b/.github/scripts/tests/test_oci_removal_sk.py @@ -0,0 +1,235 @@ +"""Actual removal UI/guards in SK and EN; real host effects are forbidden.""" +from contextlib import nullcontext +import copy +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 i18n, management +from proxmenux_oci.ui import UserCancelled +import oci_instances as instances +import oci_remove as removal +import oci_ui + + +class RemovalSlovakTests(unittest.TestCase): + def setUp(self): + cache = json.loads((ROOT / 'lang/sk.json').read_text()) + for module in (i18n, oci_ui): + for name, value in (('_language', 'sk'), ('_cache', cache)): + p = patch.object(module, name, value) + p.start(); self.addCleanup(p.stop) + self.records = {} + self.make_records(2) + self.read = self.start(instances, 'read', side_effect=lambda root, vmid: self.records[vmid]) + self.start(management, '_selected_configuration', side_effect=self.config) + self.bridge = self.start(removal, 'bridge_in_use', return_value=False) + self.ui = Mock() + self.ui.review.return_value = False + self.forbidden = [] + for module, name in ((subprocess, 'run'), (subprocess, 'Popen'), (subprocess, 'check_output'), + (Path, 'write_text'), (Path, 'write_bytes'), (Path, 'unlink'), + (removal.shutil, 'rmtree'), (instances, 'write'), (instances, 'command'), + (management, '_run_lifecycle'), (removal, 'run'), + (removal, 'remove_host_state'), (removal.oci_console, 'remove_log'), + (removal, 'release_bridge'), (removal, 'remove_owned_host_firewall'), + (removal, 'release_shared_host_files'), (removal.work_backup, 'forget'), + (removal.image_cache, 'prune')): + self.forbidden.append(self.start(module, name, side_effect=AssertionError('Forbidden effect: ' + name))) + + def start(self, module, name, **kwargs): + p = patch.object(module, name, **kwargs) + result = p.start(); self.addCleanup(p.stop) + return result + + def make_records(self, count): + self.records.clear() + for offset in range(count): + vmid = 999990 + offset + self.records[vmid] = {'vmid': vmid, 'installation_id': 'fixture-' + str(vmid), + 'template': {'catalog_ui': {'title': 'Fixture App'}}, + 'deployment': {'mounts': [{'type': 'host-bind', 'source': '/fixture/saved', + 'container_path': '/saved'}]}} + if offset: + self.records[vmid]['stack_member'] = {'primary_vmid': 999990} + if count > 1: + self.records[999990]['stack'] = {'members': [{'vmid': vmid} for vmid in self.records], + 'deployment': {'network': {'private_bridge': 'vmbr999', 'private_subnet': '10.77.99.0/24'}}} + self.records[999990]['deployment']['host_firewall'] = {'port': 8080} + self.original = copy.deepcopy(self.records) + + def config(self, vmid): + return (f'hostname: fixture-{vmid}\nrootfs: fixture:vm-{vmid}-disk-0,size=8G\n' + f'mp0: fixture:vm-{vmid}-disk-1,mp=/data,size=16G\n' + 'mp1: /fixture/shared,mp=/shared\n').encode() + + def tearDown(self): + self.assertEqual(self.records, self.original) + for effect in self.forbidden: + effect.assert_not_called() + + def test_single_summary_separates_deleted_disks_and_retained_host_paths(self): + self.make_records(1) + text = management._removal_summary(ROOT / 'oci', 999990) + self.assertIn('Kontajnery určené na odstránenie:', text) + self.assertIn('Údaje kontajnera určené na vymazanie:', text) + self.assertIn('/data (16G)', text) + kept = text.split('Cesty hostiteľa nájdené')[1] + self.assertIn('/fixture/shared', kept); self.assertIn('/fixture/saved', kept) + self.assertNotIn('/fixture/shared', text.split('Cesty hostiteľa nájdené')[0]) + self.assertNotIn('súkromnej siete:', text) + + def test_primary_summary_counts_are_grammatical_for_two_three_and_five(self): + for count in (2, 3, 5): + with self.subTest(count=count): + self.make_records(count) + text = management._removal_summary(ROOT / 'oci', 999990) + self.assertIn(f'Počet kontajnerov aplikácie Fixture App: {count}.', text) + self.assertIn('Všetky sú určené na odstránenie.', text) + for vmid in self.records: + self.assertIn(f'CT {vmid}', text) + + def test_member_summary_warns_that_entire_application_is_selected(self): + text = management._removal_summary(ROOT / 'oci', 999991) + self.assertIn('CT 999991 patrí do aplikácie Fixture App (počet kontajnerov: 2).', text) + self.assertIn('odstránenie celej aplikácie', text) + self.assertNotIn('nádob', text) + + def test_free_bridge_is_only_targeted_and_firewall_removal_is_conditional(self): + text = management._removal_summary(ROOT / 'oci', 999990) + self.assertIn('Súkromná sieť určená na uvoľnenie, ak ju nepoužíva iná VM alebo iný CT: vmbr999', text) + self.assertIn('Môže sa odstrániť aj zodpovedajúce spravované pravidlo firewallu hostiteľa.', text) + + def test_shared_bridge_is_kept_and_not_reported_as_released(self): + self.bridge.return_value = True + text = management._removal_summary(ROOT / 'oci', 999990) + self.assertIn('Súkromná sieť zachovaná', text) + self.assertNotIn('určená na uvoľnenie', text) + + def test_missing_config_still_discloses_saved_host_paths_without_deleting(self): + with patch.object(management, '_selected_configuration', side_effect=OSError('fixture missing')): + text = management._removal_summary(ROOT / 'oci', 999990) + self.assertIn('/fixture/saved', text) + self.assertIn('rootfs -', text) + + def test_no_from_real_remove_review_never_calls_lifecycle(self): + self.assertFalse(management._remove(ROOT / 'oci', self.ui, 999991)) + review = self.ui.review.call_args + self.assertFalse(review.kwargs['default']) + self.assertEqual(review.kwargs['question'], + 'Odstrániť aplikáciu? Jej kontajnerové disky sa vymažú a obnoviť ich možno iba zo zálohy.') + + def test_cancelled_real_remove_review_never_calls_lifecycle(self): + self.ui.review.side_effect = UserCancelled('fixture cancelled') + with self.assertRaises(UserCancelled): + management._remove(ROOT / 'oci', self.ui, 999990) + + def test_preparation_error_does_not_show_confirmation_or_call_lifecycle(self): + with patch.object(removal, 'members_of', side_effect=ValueError('fixture record invalid')): + self.assertFalse(management._remove(ROOT / 'oci', self.ui, 999990)) + self.ui.review.assert_not_called() + self.assertIn('Odstránenie nebolo možné pripraviť:', self.ui.message.call_args.args[0]) + + def test_pending_operation_error_precedes_configuration_probe_and_all_mutations(self): + self.make_records(1) + self.records[999990]['pending_transaction'] = {'fixture': True} + self.original = copy.deepcopy(self.records) + with patch.object(removal, 'guest_config') as config: + with self.assertRaisesRegex(ValueError, 'Operácia tejto inštalácie sa ešte nedokončila'): + removal.remove(Path('/fixture/oci'), 999990) + config.assert_not_called() + + def test_container_on_other_node_errors_before_host_cleanup(self): + with patch.object(removal, 'guest_config', return_value=None), \ + patch.object(removal, 'guest_node', return_value='fixture-other-node'): + with self.assertRaisesRegex(ValueError, 'Kontajner beží na inom uzle klastra'): + removal.remove(Path('/fixture/oci'), 999990) + + def run_main(self, result=False, busy=False): + with patch.object(sys, 'argv', ['oci_remove.py', '999990']), \ + patch.object(removal.os, 'geteuid', return_value=0), \ + patch.object(instances, 'locked', side_effect=BlockingIOError if busy else None, + return_value=nullcontext()), \ + patch.object(removal, 'remove', return_value=result) as mocked_remove, \ + patch.object(removal, 'msg_ok') as ok, patch.object(removal, 'msg_error') as error: + code = removal.main() + return code, mocked_remove, ok, error + + def test_busy_registry_error_does_not_enter_removal(self): + code, remove, ok, error = self.run_main(busy=True) + self.assertEqual(code, 1); remove.assert_not_called(); ok.assert_not_called() + self.assertEqual(error.call_args.args[0], 'Register inštancií používa iná operácia OCI') + + def test_partial_completion_is_a_warning_to_review_not_unqualified_success(self): + code, remove, ok, error = self.run_main(result=True) + self.assertEqual(code, 0); error.assert_not_called() + self.assertEqual(ok.call_args.args[0], + 'Príkaz na odstránenie sa dokončil; skontrolujte všetky upozornenia vyššie.') + self.assertNotEqual(ok.call_args.args[0], i18n.translate('The application was removed')) + + def test_clean_completion_keeps_existing_success_contract(self): + code, remove, ok, error = self.run_main() + self.assertEqual(code, 0); error.assert_not_called() + self.assertEqual(ok.call_args.args[0], 'Aplikácia bola odstránená') + + def test_english_primary_and_member_summaries_keep_identical_sentences(self): + with patch.object(i18n, '_language', 'en'): + primary = management._removal_summary(ROOT / 'oci', 999990) + member = management._removal_summary(ROOT / 'oci', 999991) + self.assertTrue(primary.startswith('Fixture App runs in 2 containers. All of them are targeted for removal.\n')) + self.assertTrue(member.startswith('CT 999991 is one of the 2 containers of Fixture App. It cannot be removed on its own,')) + + def test_missing_translation_falls_back_to_the_same_english_summary(self): + with patch.object(i18n, '_cache', {}): + text = management._removal_summary(ROOT / 'oci', 999990) + self.assertTrue(text.startswith('Fixture App runs in 2 containers. All of them are targeted for removal.\n')) + + def test_yes_only_builds_the_existing_command_when_lifecycle_is_inert(self): + self.ui.review.return_value = True + with patch.object(management, '_run_lifecycle', return_value=True) as inert: + self.assertTrue(management._remove(ROOT / 'oci', self.ui, 999990)) + self.assertEqual(inert.call_args.args[0], + [sys.executable, str(ROOT / 'oci/remote/oci_remove.py'), '999990']) + + def test_single_and_stack_menu_routes_use_the_translated_label_and_real_no_review(self): + for count in (1, 2): + with self.subTest(count=count): + self.make_records(count) + self.ui.reset_mock() + self.ui.choose.return_value = 'remove' + row = {'vmid': 999990, 'stack': count > 1, 'pending': False, + 'status': 'installed', 'reason': 'matched'} + with patch.object(management, 'carry_records', return_value={}), \ + patch.object(management, 'check_selected', return_value=row): + self.assertFalse(management.manage_instance(ROOT / 'oci', self.ui, row)) + options = self.ui.choose.call_args.args[1] + self.assertIn(('remove', 'Odstrániť: zmazať aplikáciu a jej kontajnery'), options) + self.ui.review.assert_called_once() + self.assertFalse(self.ui.review.call_args.kwargs['default']) + + def test_changed_identity_warning_does_not_claim_the_other_container_was_deleted(self): + self.make_records(1) + # Exercise the real backend branch; record cleanup is inert as well. + with patch.object(removal, 'guest_config', return_value=b'fixture'), \ + patch.object(instances, 'identity', return_value='fixture-other-identity'), \ + patch.object(removal, 'remove_owned_host_firewall', return_value=True), \ + patch.object(removal, 'release_shared_host_files'), \ + patch.object(removal.work_backup, 'forget'), \ + patch.object(removal.image_cache, 'prune', return_value=[]), \ + patch.object(Path, 'exists', return_value=False), \ + patch.object(Path, 'is_dir', return_value=False), \ + patch.object(removal, 'msg_warn') as warning, \ + patch.object(removal, 'msg_ok') as ok, patch.object(removal, 'msg_info'): + self.assertTrue(removal.remove(Path('/fixture/oci'), 999990)) + self.assertEqual(warning.call_args.args[0], + 'VMID teraz patrí inému kontajneru; ten zostane nedotknutý: CT 999990') + self.assertNotIn('Odstránený kontajner:', str(ok.mock_calls)) + + +if __name__ == '__main__': + unittest.main() 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/.github/scripts/tests/test_oci_stack_update_sk.py b/.github/scripts/tests/test_oci_stack_update_sk.py new file mode 100644 index 00000000..4874197e --- /dev/null +++ b/.github/scripts/tests/test_oci_stack_update_sk.py @@ -0,0 +1,196 @@ +"""Coordinated update/recreate contracts; no host lifecycle is permitted.""" +import copy +import json +from pathlib import Path +import subprocess +import sys +from unittest.mock import patch + +from test_oci_update_cancellation import CancellationFixture, ROOT +from proxmenux_oci import cli, i18n, management as menu, ui as native_ui, updates +import oci_instances as instances +import oci_stack_plan as stack_plan +import oci_stack_transaction as transaction +import oci_ui + + +class StackFixture(CancellationFixture): + def setUp(self): + super().setUp() + self.row['stack'] = True + self.record.update(installation_id='fiction-main', stack={ + 'id': 'fiction-main', 'members': [ + {'vmid': vmid, 'installation_id': identity, 'status': 'installed', + 'stack_member': {'stack_id': 'fiction-main', 'primary_vmid': 110}} + for vmid, identity in [(110, 'fiction-main'), (111, 'fiction-dependent')]], + 'deployment': {'services': [{'vmid': 111}, {'vmid': 110}]}}) + self.original = copy.deepcopy(self.record) + self.extra_effects = [self.guard(Path, name) for name in ('write_text', 'write_bytes', 'unlink')] + self.extra_effects += [self.guard(subprocess, name) for name in ('run', 'Popen', 'check_output')] + self.extra_effects += [self.guard(transaction, 'execute'), self.guard(transaction, 'save'), + self.guard(menu.images, 'offer_removal')] + + def no_effects(self): + super().no_effects() + for effect in self.extra_effects: + effect.assert_not_called() + + +class StackCancellationTests(StackFixture): + def test_update_and_recreate_no_are_falsy_distinct_cancellation(self): + for action in ('update', 'recreate'): + with self.subTest(action=action): + result = menu.manage_instance(ROOT/'oci', self.ui, self.row, action=action) + self.assertIs(result, menu.CANCELLED) + self.assertFalse(result) + self.no_effects() + + def test_real_cli_cancel_returns_six_for_both_actions(self): + for action in ('update', 'recreate'): + with self.subTest(action=action), patch.object(cli, 'Catalog'): + self.assertEqual(cli.main(['manage', '110', '--action', action]), 6) + self.no_effects() + + def test_actual_dialog_no_and_escape_return_six_before_any_effect(self): + dialog = native_ui.DialogUI() + for action in ('update', 'recreate'): + for code in (1, 255): + with self.subTest(action=action, code=code), \ + patch.object(native_ui, 'interactive_ui', return_value=dialog), \ + patch.object(dialog, '_run', return_value=subprocess.CompletedProcess('dialog', code, stderr='')): + self.assertEqual(menu.direct_management(ROOT/'oci', 110, action), 6) + self.no_effects() + + def test_confirmation_defaults_and_member_count_are_preserved(self): + for action, default in [('update', True), ('recreate', False)]: + menu.manage_instance(ROOT/'oci', self.ui, self.row, action=action) + args, kwargs = self.ui.review.call_args + self.assertIn('2 containers', args[0]) + self.assertIn('main CT: 110', args[0]) + self.assertEqual(kwargs['default'], default) + self.no_effects() + + def test_native_menu_returns_to_the_application_list_after_no(self): + for action in ('update', 'recreate'): + with self.subTest(action=action): + self.ui.choose.reset_mock() + self.ui.choose.side_effect = ['110', action, None] + with patch.object(menu, '_clean_orphans'), patch.object(menu, 'offer_recovery'), \ + patch.object(menu, '_records_unread', return_value=[]): + menu.interactive_management(ROOT/'oci', self.ui) + self.assertEqual(self.ui.choose.call_count, 3) + self.no_effects() + + def test_batch_cancel_never_checks_the_next_application(self): + available = [{'vmid': 110, 'title': 'First'}, {'vmid': 112, 'title': 'Second'}] + self.ui.checklist.return_value = ['all'] + self.ui.review.side_effect = [True, False] + with patch.object(updates, 'UpdateCheck') as checker, \ + patch.object(menu, 'saved_inventory', return_value=[self.row, {**self.row, 'vmid': 112}]), \ + patch.object(menu, 'check_selected', side_effect=lambda project, row: row) as selected: + checker.return_value.status.return_value = {'available': available} + self.assertFalse(updates.select_updates(ROOT/'oci', self.ui, available)) + self.assertEqual([call.args[1]['vmid'] for call in selected.call_args_list], [110]) + self.no_effects() + + def test_rejected_backup_remains_failure_one_without_dispatch(self): + self.ui.review.return_value = True + self.backup.side_effect = None + self.backup.return_value = False + for action in ('update', 'recreate'): + self.assertEqual(menu.direct_management(ROOT/'oci', 110, action), 1) + self.lifecycle.assert_not_called() + self.assertEqual(self.record, self.original) + + def test_positive_confirmation_preserves_success_failure_and_exact_commands(self): + self.ui.review.return_value = True + self.backup.side_effect = None + self.backup.return_value = True + self.lifecycle.side_effect = None + for action in ('update', 'recreate'): + for result in (False, True): + self.lifecycle.reset_mock() + self.lifecycle.return_value = result + with patch.object(menu.images, 'offer_removal') as offer: + self.assertEqual(menu.direct_management(ROOT/'oci', 110, action, + lifecycle_args=('--keep-backup',)), 0 if result else 1) + expected = [sys.executable, str(ROOT/'oci/remote/oci_stack_native.py'), '110', '--keep-backup'] + if action == 'recreate': + expected += ['--operation', 'recreate'] + self.assertEqual(self.lifecycle.call_args.args[0], expected+['--acknowledge-external-data']) + self.assertEqual(offer.call_count, int(result)) + self.assertEqual(self.record, self.original) + self.write.assert_not_called() + self.command.assert_not_called() + + def test_acknowledgement_is_not_duplicated(self): + self.ui.review.return_value = True + self.backup.side_effect = None + self.backup.return_value = True + self.lifecycle.side_effect = None + self.lifecycle.return_value = False + menu.direct_management(ROOT/'oci', 110, 'recreate', lifecycle_args=('--acknowledge-external-data',)) + self.assertEqual(self.lifecycle.call_args.args[0].count('--acknowledge-external-data'), 1) + + +class StackSlovakTests(StackFixture): + def setUp(self): + super().setUp() + self.catalog = json.loads((ROOT/'lang/sk.json').read_text()) + for module in (i18n, oci_ui): + for name, value in [('_language', 'sk'), ('_cache', self.catalog)]: + item = patch.object(module, name, value) + item.start() + self.addCleanup(item.stop) + + def test_questions_and_titles_name_the_whole_application(self): + for action, question in [('update', 'Aktualizovať celú aplikáciu?'), + ('recreate', 'Znovu vytvoriť všetky kontajnery aplikácie?')]: + menu.manage_instance(ROOT/'oci', self.ui, self.row, action=action) + self.assertEqual(self.ui.review.call_args.kwargs['question'], question) + self.assertIn('aplikáciu s viacerými kontajnermi', self.ui.review.call_args.args[1]) + self.no_effects() + + def test_recreation_dialog_explains_saved_images_and_restoring_backups(self): + menu.manage_instance(ROOT/'oci', self.ui, self.row, action='recreate') + text = self.ui.review.call_args.args[0] + self.assertIn('uložených identifikátorov obrazov', text) + self.assertIn('2', text) + self.assertIn('110', text) + self.assertIn('zálohy sa obnovia', text) + self.assertNotIn('Stack', text) + self.no_effects() + + def test_shared_missing_primary_error_in_plan_and_publish_before_any_effect(self): + primary = copy.deepcopy(self.record) + primary['vmid'] = 112 + with self.assertRaisesRegex(ValueError, '^Chýba hlavný kontajner aplikácie$'): + stack_plan.build(primary, {}, {}, 'update') + with self.assertRaisesRegex(ValueError, '^Chýba hlavný kontajner aplikácie$'): + instances.publish_stack(Path('/fiction-only'), 110, {}, {}, []) + self.no_effects() + + def test_missing_member_error_keeps_volume_verification_requirement(self): + records = {row['vmid']: row for row in self.record['stack']['members']} + with self.assertRaisesRegex(ValueError, 'znova ich vytvorte až po overení ich dátových zväzkov'): + stack_plan.build(self.record, records, {110: 'fiction-main'}, 'update') + self.no_effects() + + def test_pending_and_conflicting_member_errors_keep_the_identifier(self): + records = {row['vmid']: copy.deepcopy(row) for row in self.record['stack']['members']} + inventory = {key: row['installation_id'] for key, row in records.items()} + records[111]['status'] = 'pending' + with self.assertRaisesRegex(ValueError, '^Nedokončená operácia existuje pre CT 111$'): + stack_plan.build(self.record, records, inventory, 'update') + records[111]['status'] = 'installed' + inventory[111] = 'different-installation' + with self.assertRaisesRegex(ValueError, '^Iná inštancia už používa VMID 111$'): + stack_plan.build(self.record, records, inventory, 'update') + self.no_effects() + + def test_plan_failure_is_read_only_and_distinguishes_invalid_identity(self): + primary = copy.deepcopy(self.record) + primary['stack']['id'] = 'different-stack' + with self.assertRaisesRegex(ValueError, '^Nekonzistentná identita aplikácie s viacerými kontajnermi$'): + stack_plan.build(primary, {}, {}, 'recreate') + self.no_effects() 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..ba88229c --- /dev/null +++ b/.github/scripts/tests/test_oci_storage_sk.py @@ -0,0 +1,210 @@ +"""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', + 'Kam uložiť priečinky consume a export', + '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/.github/scripts/tests/test_oci_update_cancellation.py b/.github/scripts/tests/test_oci_update_cancellation.py new file mode 100644 index 00000000..e1abaf8a --- /dev/null +++ b/.github/scripts/tests/test_oci_update_cancellation.py @@ -0,0 +1,168 @@ +"""Real native OCI menu/CLI paths with all external effects replaced.""" +from contextlib import redirect_stdout +import copy +import io +import json +from pathlib import Path +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 cli, i18n, management as menu, ui as native_ui, updates +import oci_instances as instances +import oci_instance_reconcile as reconcile + + +class CancellationFixture(unittest.TestCase): + def setUp(self): + self.record = {'status': 'installed', 'vmid': 110, 'deployment': {}, 'template': {}} + self.original = copy.deepcopy(self.record) + self.row = dict(vmid=110, reason='matched', stack=False, pending=False, status='installed', + title='Fixture application', hostname='fixture', image='fixture:latest') + self.ui = Mock() + self.ui.unattended = False + self.ui.review.return_value = False + for module, name, options in [ + (i18n, '_language', dict(new='en')), (i18n, '_cache', dict(new={})), + (menu.os, 'geteuid', dict(return_value=0)), (menu.shutil, 'which', dict(return_value='/fixture/pct')), + (native_ui, 'interactive_ui', dict(return_value=self.ui)), + (menu, 'recover_automatically', dict(return_value=None)), + (menu, 'carry_records', dict(return_value={})), + (menu, 'check_selected', dict(side_effect=lambda project, row: row)), + (menu, 'saved_inventory', dict(return_value=[self.row])), + (menu, '_selected_configuration', dict(return_value=b'fixture configuration')), + (instances, 'read', dict(return_value=self.record)), + (reconcile, 'propose', dict(return_value=None)), + ]: + item = patch.object(module, name, **options) + item.start() + self.addCleanup(item.stop) + self.lifecycle = self.guard(menu, '_run_lifecycle') + self.backup = self.guard(menu, '_work_backup_ready') + self.write = self.guard(instances, 'write') + self.command = self.guard(instances, 'command') + self.commit = self.guard(reconcile, 'commit') + + 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): + for mock in [self.lifecycle, self.backup, self.write, self.command, self.commit]: + mock.assert_not_called() + self.assertEqual(self.record, self.original) + + +class UpdateCancellationTests(CancellationFixture): + def test_no_is_a_distinct_falsy_result_before_backup_or_lifecycle(self): + result = menu.manage_instance(ROOT / 'oci', self.ui, self.row, action='update') + self.assertIs(result, menu.CANCELLED) + self.assertFalse(result) + self.no_effects() + + def test_real_cli_no_returns_cancel_code_instead_of_failure_or_success(self): + with patch.object(cli, 'Catalog'), redirect_stdout(io.StringIO()) as output: + result = cli.main(['manage', '110', '--action', 'update']) + self.assertEqual(result, 6) + self.assertEqual(output.getvalue(), '') # The terminal renders the localized outcome once. + self.no_effects() + + def test_no_in_stack_confirmation_keeps_every_member_unchanged(self): + self.row['stack'] = True + self.record['stack'] = {'members': [{'vmid': 110}, {'vmid': 111}]} + self.original = copy.deepcopy(self.record) + with redirect_stdout(io.StringIO()): + result = menu.direct_management(ROOT / 'oci', 110, 'update') + self.assertEqual(result, 6) + self.no_effects() + + def test_native_menu_returns_to_its_list_after_no(self): + self.ui.choose.side_effect = ['110', 'update', None] + with patch.object(menu, '_clean_orphans'), patch.object(menu, 'offer_recovery'), \ + patch.object(menu, '_records_unread', return_value=[]): + menu.interactive_management(ROOT / 'oci', self.ui) + self.assertEqual(self.ui.choose.call_count, 3) + self.no_effects() + + def test_batch_no_does_not_start_the_next_application(self): + available = [{'vmid': 110, 'title': 'First'}, {'vmid': 111, 'title': 'Second'}] + rows = [self.row, {**self.row, 'vmid': 111}] + self.ui.checklist.return_value = ['all'] + self.ui.review.side_effect = [True, False] # Batch review, first application's confirmation. + with patch.object(updates, 'UpdateCheck') as checker, patch.object(menu, 'saved_inventory', return_value=rows), \ + patch.object(menu, 'check_selected', wraps=lambda project, row: row) as selected: + checker.return_value.status.return_value = {'available': available} + self.assertFalse(updates.select_updates(ROOT / 'oci', self.ui, available)) + self.assertEqual([call.args[1]['vmid'] for call in selected.call_args_list], [110]) + self.no_effects() + + def test_accepted_update_failure_keeps_failure_code_one(self): + self.ui.review.return_value = True + self.backup.side_effect = None + self.backup.return_value = False + self.assertEqual(menu.direct_management(ROOT / 'oci', 110, 'update'), 1) + self.lifecycle.assert_not_called() + self.write.assert_not_called() + + def test_accepted_update_preserves_success_and_existing_lifecycle_command(self): + self.ui.review.return_value = True + self.backup.side_effect = None + self.backup.return_value = True + self.lifecycle.side_effect = None + self.lifecycle.return_value = True + self.assertEqual(menu.direct_management(ROOT / 'oci', 110, 'update'), 0) + self.lifecycle.assert_called_once() + command = self.lifecycle.call_args.args[0] + self.assertEqual(command[:3], [sys.executable, str(ROOT / 'oci/remote/oci_update_current.py'), '110']) + self.assertIn('--acknowledge-external-data', command) + self.write.assert_not_called() + + def test_actual_lifecycle_failure_remains_failure_after_positive_confirmation(self): + self.ui.review.return_value = True + self.backup.side_effect = None + self.backup.return_value = True + self.lifecycle.side_effect = None + self.lifecycle.return_value = False + self.assertEqual(menu.direct_management(ROOT / 'oci', 110, 'update'), 1) + self.lifecycle.assert_called_once() + self.write.assert_not_called() + + def test_unattended_positive_default_still_reaches_existing_update(self): + self.backup.side_effect = None + self.backup.return_value = True + self.lifecycle.side_effect = None + self.lifecycle.return_value = True + self.assertEqual(menu.direct_management(ROOT / 'oci', 110, 'update', unattended=True), 0) + self.lifecycle.assert_called_once() + self.write.assert_not_called() + + def test_existing_unattended_review_age_busy_and_missing_codes_are_preserved(self): + with patch.object(reconcile, 'propose', return_value={'details': ['external change']}), redirect_stdout(io.StringIO()): + self.assertEqual(menu.direct_management(ROOT / 'oci', 110, 'update', unattended=True), 4) + with patch.object(menu, '_image_too_recent', return_value=True), redirect_stdout(io.StringIO()): + self.assertEqual(menu.direct_management(ROOT / 'oci', 110, 'update', unattended=True, min_image_age_days=3), 5) + with patch.object(menu, 'saved_inventory', return_value=[]): + self.assertEqual(menu.direct_management(ROOT / 'oci', 110, 'update'), 2) + with patch.object(menu, 'recover_automatically', side_effect=BlockingIOError()): + self.assertEqual(menu.direct_management(ROOT / 'oci', 110, 'update'), 3) + self.no_effects() + + def test_slovak_dialog_and_recovery_choice_have_the_approved_meaning(self): + cache = json.loads((ROOT / 'lang/sk.json').read_text()) + with patch.object(i18n, '_language', 'sk'), patch.object(i18n, '_cache', cache): + menu.manage_instance(ROOT / 'oci', self.ui, self.row, action='update') + self.assertEqual(i18n.translate('Recover the previous installation'), 'Obnoviť predchádzajúcu inštaláciu') + text = self.ui.review.call_args.args[0] + for part in ['novší obraz aplikácie', 'overí sa jej integrita', 'pokúsi obnoviť', 'Pripojené adresáre hostiteľa']: + self.assertIn(part, text) + self.assertNotIn('kanál obrazov', text) + self.assertEqual(self.ui.review.call_args.kwargs['question'], 'Spustiť aktualizáciu?') + self.no_effects() + + +if __name__ == '__main__': + unittest.main() diff --git a/.github/scripts/tests/test_oci_update_preservation_wording.py b/.github/scripts/tests/test_oci_update_preservation_wording.py index e3fdae92..448b4832 100644 --- a/.github/scripts/tests/test_oci_update_preservation_wording.py +++ b/.github/scripts/tests/test_oci_update_preservation_wording.py @@ -24,9 +24,12 @@ OLD_GUARD = 'The current template changes the image or identity; an explicit mig GUARD = 'The current template changes the template identity or image repository; an explicit migration is required' OLD_PREVIEW = ('The saved image channel is checked for a newer image. If replacement is needed, the CT is stopped and ' 'a native backup is verified before its root is replaced. Host directories are outside that backup.') -PREVIEW = ('If the image channel has a new version, the CT is stopped, backed up and verified, and replaced with ' - 'the new image to update the container. If the update fails after the container was changed, the backup ' - 'is restored. An update that stops halfway is recovered from the OCI management menu.') +PREVIEW = ('If a newer application image is available, the container is stopped and backed up, and the backup ' + 'integrity is verified. The container is then updated using the new image.\n\n' + 'If the update fails after the container was changed, ProxMenux attempts to restore the previous ' + 'installation from the backup. If the operation remains incomplete, select the application in OCI ' + 'management and choose "Recover the previous installation".\n\n' + 'Host directories mounted in the container are not restored by the container backup.') def extracted(path, name, scope): @@ -130,7 +133,7 @@ class UpdateWording(unittest.TestCase): reconcile = ModuleType('oci_instance_reconcile') reconcile.propose = lambda *args: None scope = {'sys': SimpleNamespace(path=[], executable='python3'), - 'os': os, 'tempfile': tempfile, 'Path': Path, + 'os': os, 'tempfile': tempfile, 'Path': Path, 'CANCELLED': None, 'translate': lambda text: text, 'check_selected': lambda project, row: row, '_selected_configuration': lambda vmid: instances.command('pct', 'config', str(vmid)), 'images': SimpleNamespace(offer_removal=lambda *args: None), 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/.github/scripts/tests/test_outcome_promises_wording.py b/.github/scripts/tests/test_outcome_promises_wording.py index 2b793640..29e70f9e 100644 --- a/.github/scripts/tests/test_outcome_promises_wording.py +++ b/.github/scripts/tests/test_outcome_promises_wording.py @@ -20,7 +20,11 @@ class OutcomePromises(TestCase): texts = oci_menu_texts() self.assertEqual([text for text in texts if 'If anything fails' in text], []) previews = [text for text in texts if 'stops halfway is recovered from the OCI management menu' in text] - self.assertEqual(len(previews), 3) + self.assertEqual(len(previews), 2) # Coordinated stack update/recreation previews. + update = next(text for text in texts if text.startswith('If a newer application image is available')) + self.assertIn('attempts to restore the previous installation', update) + self.assertIn('If the operation remains incomplete', update) + self.assertIn('choose "Recover the previous installation"', update) def test_the_recovery_preview_says_when_each_step_happens(self): preview = next(text for text in oci_menu_texts() if 'previous native backup' in text) diff --git a/.github/scripts/tests/test_pbs_cli_localization.py b/.github/scripts/tests/test_pbs_cli_localization.py new file mode 100644 index 00000000..bda1064b --- /dev/null +++ b/.github/scripts/tests/test_pbs_cli_localization.py @@ -0,0 +1,250 @@ +"""PBS CLI language and no-effect boundaries using real functions, isolated files.""" +import contextlib +import copy +import importlib.util +import io +import json +import os +from pathlib import Path +import subprocess +import tempfile +import unittest +from unittest.mock import patch + +ROOT = Path(__file__).resolve().parents[3] + + +def function(path, name): + text = (ROOT/path).read_text() + start = text.index(name+'() {') + return text[start:text.index('\n}\n', start)+3] + + +def repository(components, suite='trixie'): + return dict(Types=['deb'], URIs=['https://credential.invalid/private'], Suites=[suite], + Components=components.split(), Enabled=True) + + +class RepositoryCliTests(unittest.TestCase): + def run_policy(self, case, language='sk', mode='plan', malformed=None, product='pbs'): + spec = importlib.util.spec_from_file_location('policy_fixture', ROOT/'scripts/global/repository_policy.py') + module = importlib.util.module_from_spec(spec); spec.loader.exec_module(module) + state = dict(files=[dict(path='/etc/apt/sources.list.d/pbs.sources', repositories=[repository('pbs-enterprise')]), + dict(path='/etc/apt/sources.list.d/debian.sources', repositories=[repository('main')])], + errors=[], digest='fixture', **{'standard-repos':[{'handle':'no-subscription'}]}) + status='notfound'; calls=[] + if case=='inventory': state['errors']=['PRIVATE RAW DIAGNOSTIC'] + if case=='status': status='unknown' + if case=='suite': state['files'][0]['repositories'][0]['Suites']=['bookworm'] + if case=='active': status='active'; state['files']=state['files'][1:] + if case=='debian': state['files']=state['files'][:1] + if case=='mixed': state['files'][0]['repositories'][0]['Components'].append('main') + if case=='handle': state['standard-repos']=[] + if case=='preserve': state['files'][0]['repositories'][0]['Components']=['pbs-no-subscription'] + original=copy.deepcopy(state) + def run(args): + calls.append(args) + if args[0]=='proxmox-backup-manager': return json.dumps(dict(status=status, serverid='PRIVATE SERVER ID')) + if 'create' in args: + state['files'][0]['repositories'][0]['Enabled']=False + if case=='partial': state['errors']=['PRIVATE RAW DIAGNOSTIC'] + return '' + if 'set' in args: + state['files'].append(dict(path='/etc/apt/sources.list.d/public.sources',repositories=[repository('pbs-no-subscription')])) + return '' + return json.dumps(state) + with tempfile.TemporaryDirectory(prefix='pbs-policy-i18n-') as folder: + module.BASE=Path(folder) + (module.BASE/'lang').mkdir() + (module.BASE/'config.json').write_text(json.dumps({'language':language})) + catalog=(ROOT/'lang/sk.json').read_text() if malformed is None else malformed + (module.BASE/'lang/sk.json').write_text(catalog) + stdout,stderr=io.StringIO(),io.StringIO() + suite='sid' if case=='unsupported' else 'trixie' + with patch.object(module,'run',side_effect=run), patch.object(module.sys,'argv',['repository_policy.py',mode,suite,product]), contextlib.redirect_stdout(stdout),contextlib.redirect_stderr(stderr): + result=module.main() + return result,stdout.getvalue(),stderr.getvalue(),calls,state,original + + def test_pbs_errors_are_localized_without_changing_decisions_or_exposing_raw_data(self): + expectations={'inventory':'Zoznam repozitárov APT', 'status':'Stav predplatného', + 'suite':'iné vydanie', 'active':'aktívne predplatné', 'debian':'základný repozitár Debianu', + 'mixed':'spoločný záznam APT', 'handle':'no-subscription', 'unsupported':'Nepodporované vydanie', + 'partial':'stav repozitárov je neznámy'} + for case,expected in expectations.items(): + with self.subTest(case=case): + result,out,error,calls,state,original=self.run_policy(case,mode='apply' if case=='partial' else 'plan') + self.assertEqual(result,1); self.assertEqual(out,''); self.assertIn(expected,error) + self.assertNotIn('PRIVATE',error); self.assertNotIn('credential.invalid',error) + writes=[c for c in calls if 'create' in c or 'set' in c] + if case=='partial': + self.assertEqual(len(writes),1) + self.assertFalse(state['files'][0]['repositories'][0]['Enabled']) + self.assertIn('Automatický návrat',error) + else: + self.assertEqual(writes,[]); self.assertEqual(state,original) + if case=='unsupported': self.assertEqual(calls,[]) + + def test_english_error_and_stdout_tokens_remain_compatible(self): + en=self.run_policy('unsupported',language='en') + self.assertEqual(en[2],'Unsupported Proxmox suite; no repository changed.\n') + pve=self.run_policy('unsupported',product='pve') + self.assertEqual(pve[2],en[2]) + for mode,expected in [('plan','offer\n'),('apply','changed\n')]: + result,out,error,*_=self.run_policy('offer',mode=mode) + self.assertEqual((result,out,error),(0,expected,'')) + result,out,error,calls,*_=self.run_policy('preserve',mode='apply') + self.assertEqual((result,out,error),(0,'preserve\n','')) + self.assertFalse(any(c[0]=='proxmox-backup-manager' or 'set' in c or 'create' in c for c in calls)) + + def test_bad_or_missing_translation_falls_back_to_original_english(self): + for catalog in ('{}','not json','[]',json.dumps({'Unsupported Proxmox suite; no repository changed.':42}), + json.dumps({'Unsupported Proxmox suite; no repository changed.':'{unknown}'})): + with self.subTest(catalog=catalog): + result,out,error,calls,*_=self.run_policy('unsupported',malformed=catalog) + self.assertEqual(result,1);self.assertEqual(out,'');self.assertEqual(calls,[]) + self.assertEqual(error,'Unsupported Proxmox suite; no repository changed.\n') + + def test_translation_cannot_drop_actual_repository_details(self): + spec=importlib.util.spec_from_file_location('policy_format_fixture',ROOT/'scripts/global/repository_policy.py') + module=importlib.util.module_from_spec(spec);spec.loader.exec_module(module) + with tempfile.TemporaryDirectory(prefix='pbs-policy-format-') as folder: + module.BASE=Path(folder);(module.BASE/'lang').mkdir() + (module.BASE/'config.json').write_text('{"language":"sk"}') + error=module.PolicyError('Inspect {ui}; no repository changed.',ui='Administration > Repositories') + for invalid in ('Skontrolujte repozitáre.','{ui.__class__}','{other}','{ui:.0}','{ui!r}'): + (module.BASE/'lang/sk.json').write_text(json.dumps({error.template:invalid})) + self.assertEqual(module.cli_error(error,'pbs'),str(error)) + for invalid in ('not json','[]','{"language":"../../private"}'): + (module.BASE/'config.json').write_text(invalid) + self.assertEqual(module.cli_error(error,'pbs'),str(error)) + + +UPDATE_HARNESS=r''' +BASE_DIR="$FIXTURE" +LANG_DIR="$REPO/lang" +SCRIPT_TITLE='fixture' +TAB='' BGN='' CL='' GN='' BL='' +mkdir -p "$FIXTURE/log" "$FIXTURE/tmp" "$FIXTURE/boot" "$FIXTURE/run" +: > "$FIXTURE/calls" +record() { printf '%s\n' "$*" >> "$FIXTURE/calls"; } +pmx_journal_context() { :; } +pmx_is_pbs() { [[ "$CASE" != pve ]]; } +pmx_platform_field() { [[ "$1" != supported ]] && printf '%s' "$SUITE" || printf true; } +ensure_pbs_repositories() { record repository-plan; return 0; } +dpkg-query() { [[ "$SUITE" == bookworm ]] && printf 3.4.0 || printf 4.0.1; } +apt-cache() { record apt-cache "$@"; printf ' Candidate: 4.0.2\n'; } +df() { printf 'Filesystem 1K-blocks Used Available Use%% Mounted\nfixture 10000 1000 %s 10%% /\n' "$([[ "$CASE" == disk ]] && echo 512000 || echo 4096000)"; } +apt-get() { record apt-get "$@"; [[ "$CASE" != refresh ]]; } +apt() { + record apt "$@" + if [[ "$*" == 'list --upgradable' ]]; then + printf 'Listing...\n' + [[ "$CASE" == current ]] || printf 'fixture/trixie 1.2 amd64 [upgradable from: 1.1]\n' + return 0 + fi + [[ "$CASE" != failure ]] +} +fixture_env() { "$@"; } +APT_ENV='fixture_env' +pmx_format_upgradable() { cat; } +pmx_record_execution() { record journal "$1"; } +pmx_dpkg_changes_since() { :; } +msg_error() { printf '%s\n' "$*"; } +msg_ok() { printf '%s\n' "$*"; } +msg_info2() { printf '%s\n' "$*"; } +msg_warn() { printf '%s\n' "$*"; } +msg_title() { :; } +clear() { :; } +show_proxmenux_logo() { :; } +whiptail() { printf '%s\n' "$*" >> "$FIXTURE/dialog"; [[ "$CASE" != cancel ]]; } +uname() { printf old-kernel; } +touch "$FIXTURE/boot/vmlinuz-new-kernel" +''' + + +class UpdateCliTests(unittest.TestCase): + def run_update(self,case,language='sk',suite='trixie'): + with tempfile.TemporaryDirectory(prefix='pbs-update-i18n-') as folder: + body=function('scripts/global/update-pbs.sh','update_pbs') + for old,new in [('/var/log/',folder+'/log/'),('/tmp/proxmenux_screen_capture_',folder+'/tmp/proxmenux_screen_capture_'),('/var/run/',folder+'/run/'),('/boot/',folder+'/boot/')]: body=body.replace(old,new) + script=UPDATE_HARNESS+function('scripts/utils.sh','translate')+body+'\nupdate_pbs\n' + result=subprocess.run(['bash','-c',script],capture_output=True,text=True,timeout=15, + env={**os.environ,'REPO':str(ROOT),'FIXTURE':folder,'CASE':case,'LANGUAGE':language,'SUITE':suite}) + files={str(p.relative_to(folder)):p.read_text() for p in Path(folder).rglob('*') if p.is_file()} + return result,files + + def test_pve_guard_cannot_reach_repository_or_apt_calls(self): + result,files=self.run_update('pve') + self.assertEqual(result.returncode,1,result.stderr) + self.assertEqual(files['calls'],'') + self.assertFalse(any(name.startswith('log/') for name in files)) + + def test_disk_and_upgrade_errors_keep_their_actual_parameters(self): + result,files=self.run_update('disk') + self.assertEqual(result.returncode,1,result.stderr) + self.assertIn('Nedostatok miesta na disku. Dostupné:',result.stdout) + self.assertIn('500MB',result.stdout) + self.assertNotIn('apt',files['calls']) + result,files=self.run_update('failure') + self.assertEqual(result.returncode,1,result.stderr) + self.assertIn('Aktualizácia systému zlyhala. Skontrolujte denník:',result.stdout) + self.assertIn('/log/proxmox-update-',result.stdout) + self.assertNotIn('autoremove',files['calls']) + + def test_update_status_cancel_refresh_error_and_reboot_notice(self): + for suite in ('bookworm','trixie'): + for case in ('current','cancel','refresh','success'): + with self.subTest(suite=suite,case=case): + result,files=self.run_update(case,suite=suite) + self.assertEqual(result.returncode,1 if case=='refresh' else 0,result.stderr) + if case!='success': self.assertNotIn('full-upgrade',files['calls']) + if case=='success': self.assertIn('reštartujte server',result.stdout) + if case in ('current','cancel'): self.assertIn('Aktuálna verzia PBS',files['dialog']) + + +class DialogTests(unittest.TestCase): + def test_automated_confirmation_and_banner_cancel_do_not_run_actions(self): + cases=[('scripts/menus/menu_post_install.sh','confirm_automated_script', + ['repozitár no-subscription','upozornenie na predplatné','pamäť','jadro','sieť']), + ('scripts/post_install/auto_post_install.sh','remove_subscription_banner', + ['Proxmox Backup Server – odstránenie upozornenia na predplatné'])] + for path,name,expected in cases: + with tempfile.TemporaryDirectory(prefix='pbs-dialog-') as folder: + script=function('scripts/utils.sh','translate')+function(path,name)+r''' +PMX_ON_PBS=true +LOCAL_SCRIPTS='/fixture/scripts' +clear() { :; }; sleep() { :; }; stop_spinner() { :; } +msg_warn() { printf '%s\n' "$*"; } +bash() { printf forbidden >> "$CAPTURE/actions"; } +register_tool() { printf forbidden >> "$CAPTURE/actions"; } +dialog() { printf '%s\n' "$*" >> "$CAPTURE/dialog"; return 1; } +whiptail() { dialog "$@"; } +'''+name+'\n' + result=subprocess.run(['bash','-c',script],capture_output=True,text=True,timeout=15, + env={**os.environ,'LANGUAGE':'sk','LANG_DIR':str(ROOT/'lang'),'CAPTURE':folder}) + self.assertEqual(result.returncode,1 if name=='remove_subscription_banner' else 0,result.stderr) + dialog=(Path(folder)/'dialog').read_text() + for text in expected:self.assertIn(text,dialog) + self.assertFalse((Path(folder)/'actions').exists()) + if name=='remove_subscription_banner':self.assertIn('bolo zrušené používateľom',result.stdout) + + def test_community_labels_preserve_dispatch_names_and_translate_display(self): + script=function('scripts/utils.sh','translate')+function('scripts/menus/menu_post_install.sh','post_install_label')+'\npost_install_label "$1"\n' + for text,expected in [('Proxmox Backup Server Post Install','nastavenie po inštalácii'), + ('Proxmox Backup Server Microcode','mikrokód procesora')]: + result=subprocess.run(['bash','-c',script,'bash',text],capture_output=True,text=True,timeout=15, + env={**os.environ,'LANGUAGE':'sk','LANG_DIR':str(ROOT/'lang')}) + self.assertEqual(result.returncode,0,result.stderr);self.assertIn(expected,result.stdout) + + def test_failed_apt_hook_check_removes_only_fixture_hook_with_localized_warning(self): + with tempfile.TemporaryDirectory(prefix='pbs-hook-') as folder: + script=function('scripts/utils.sh','translate')+function('scripts/global/remove-banner-pve-v3.sh','create_apt_hook')+r''' +apt-config() { return 1; } +msg_warn() { printf '%s\n' "$*"; } +create_apt_hook +''' + result=subprocess.run(['bash','-c',script],capture_output=True,text=True,timeout=15, + env={**os.environ,'LANGUAGE':'sk','LANG_DIR':str(ROOT/'lang'),'APT_HOOK':folder+'/hook'}) + self.assertEqual(result.returncode,0,result.stderr) + self.assertIn('Nesprávna syntax hooku APT',result.stdout) + self.assertFalse((Path(folder)/'hook').exists()) diff --git a/.github/scripts/tests/test_terminal_catalogs.py b/.github/scripts/tests/test_terminal_catalogs.py index a69aedd8..9ef0477e 100644 --- a/.github/scripts/tests/test_terminal_catalogs.py +++ b/.github/scripts/tests/test_terminal_catalogs.py @@ -107,6 +107,28 @@ class TerminalCatalogsTests(unittest.TestCase): (root / 'lang/es.json').write_text(json.dumps({'Check /etc/pve/storage.cfg': 'Compruebe /etc/PVE/storage.cfg'})) self.assertNotEqual(check('es,sk').returncode, 0) + def test_optional_completeness_still_rejects_invalid_present_translations(self): + with tempfile.TemporaryDirectory() as temporary: + root = Path(temporary) + (root / 'scripts').mkdir() + (root / 'lang').mkdir() + (root / 'scripts/check.sh').write_text('translate "Check /etc/pve/storage.cfg"') + (root / 'lang/sk.json').write_text(json.dumps({'Check /etc/pve/storage.cfg': 'Skontrolujte /etc/pve/storage.cfg'})) + (root / 'lang/es.json').write_text('{}') + + def check(languages, *flags): + return subprocess.run( + [sys.executable, '-B', str(SCRIPTS / 'check_terminal_catalogs.py'), + '--root', str(root), '--languages', languages, *flags], + capture_output=True, text=True, timeout=60, + ) + + self.assertEqual(check('es,sk').returncode, 0) + self.assertEqual(check('sk', '--require-complete').returncode, 0) + self.assertNotEqual(check('es', '--require-complete').returncode, 0) + (root / 'lang/es.json').write_text(json.dumps({'Check /etc/pve/storage.cfg': 'Compruebe /etc/PVE/storage.cfg'})) + self.assertNotEqual(check('es,sk').returncode, 0) + if __name__ == '__main__': unittest.main() diff --git a/.github/scripts/tests/test_zram_localization.py b/.github/scripts/tests/test_zram_localization.py new file mode 100644 index 00000000..bf9bc768 --- /dev/null +++ b/.github/scripts/tests/test_zram_localization.py @@ -0,0 +1,168 @@ +"""Render the real ZRAM CLI paths in isolated files with host effects stubbed.""" +import json +import os +from pathlib import Path +import subprocess +import tempfile +import unittest + +ROOT = Path(__file__).resolve().parents[3] +DETAILS = { + "version": ("Cannot determine installed systemd-zram-generator version", "Nepodarilo sa zistiť verziu nainštalovaného balíka systemd-zram-generator"), + "mismatch": ("Existing ZRAM profile is active but does not match its configuration", "Existujúci profil ZRAM je aktívny, ale nezodpovedá svojej konfigurácii"), + "stop": ("Could not stop existing dev-zram0.swap", "Nepodarilo sa zastaviť existujúcu jednotku dev-zram0.swap"), + "directory": ("Could not create ZRAM generator directory", "Nepodarilo sa vytvoriť adresár pre konfiguráciu generátora ZRAM"), + "config": ("Could not write ZRAM generator configuration", "Nepodarilo sa zapísať konfiguráciu generátora ZRAM"), + "marker": ("Could not write ZRAM package ownership state", "Nepodarilo sa zapísať údaj o tom, či balík ZRAM nainštaloval ProxMenux"), + "start": ("Could not activate dev-zram0.swap", "Nepodarilo sa aktivovať jednotku dev-zram0.swap"), + "verify": ("Active ZRAM algorithm, capacity or swap sources did not match the profile", "Algoritmus kompresie, veľkosť alebo zdroje swapu aktívnej ZRAM nezodpovedajú profilu"), +} +REFUSAL = "Another ZRAM generator configuration exists; refusing to overwrite it:" +REFUSAL_SK = "Existuje iná konfigurácia generátora ZRAM; neprepíše sa:" + + +def function(path, name): + text = path.read_text() + start = text.index(name + "() {") + return text[start:text.index("\n}\n", start) + 3] + + +HARNESS = r''' +set -u +BASE_DIR="$FIXTURE/state" +LANG_DIR="$REPO/lang" +mkdir -p "$BASE_DIR" "$FIXTURE/etc/systemd/zram-generator.conf.d" "$FIXTURE/proc" +CONFIG="$FIXTURE/etc/systemd/zram-generator.conf.d/90-proxmenux.conf" +MARKER="$BASE_DIR/zram-swap.state" +printf 'Filename\tType\tSize\tUsed\tPriority\n' > "$FIXTURE/proc/swaps" +printf '/swapfile none swap sw 0 0\n' > "$FIXTURE/etc/fstab" +: > "$FIXTURE/calls" +record() { printf '%s\n' "$*" >> "$FIXTURE/calls"; } +pmx_journal_context() { :; } +msg_error() { printf '%s\n' "$*"; } +msg_success() { printf '%s\n' "$*"; } +register_tool() { record register "$@"; } +pmx_install_pkg() { record package-install; return 1; } +apt-get() { record apt "$@"; return 1; } +dpkg-query() { + record dpkg-query + case "$*" in + *'${Status}'*) printf 'install ok installed\n';; + *'${Version}'*) [[ "$CASE" == version ]] || printf '1.2.0-1\n';; + esac +} +dpkg() { return 0; } +install() { record directory; [[ "$CASE" != directory ]]; } +pmx_write_file() { + record write "$1" + if [[ "$CASE" == config && "$1" == "$CONFIG" ]] || + [[ "$CASE" == marker && "$1" == "$MARKER" ]]; then + cat >/dev/null + return 1 + fi + cat > "$1" +} +pmx_remove_file() { record remove "$1"; rm -f -- "$1"; } +pmx_record_uninstall() { record record-uninstall; } +swapoff() { record swapoff; return 0; } +systemctl() { + record systemctl "$@" + [[ "$CASE" != start || "$1" != start ]] && + [[ "$CASE" != stop || "$1" != stop ]] +} +source "$REPO/scripts/post_install/zram_profile_helpers.sh" +zram_profile_verify_active() { [[ "$CASE" != verify && "$CASE" != mismatch ]]; } +if [[ "$CASE" == mismatch || "$CASE" == stop ]]; then + printf '# ProxMenux ZRAM profile\n[zram0]\nzram-size = ram / 10\n' > "$CONFIG" + [[ "$CASE" != mismatch ]] || zram_render_generator_config true > "$CONFIG" + printf 'installed_by_proxmenux=false\n' > "$MARKER" + printf '/dev/zram0\tpartition\t3355443\t8\t32767\n' >> "$FIXTURE/proc/swaps" +fi +if [[ "$CASE" == foreign ]]; then + printf '[zram1]\nzram-size = ram / 5\n' > "$FIXTURE/etc/systemd/zram-generator.conf" +fi +if [[ "$CASE" == unreadable ]]; then + zram_foreign_generator_config() { return 2; } +fi +''' + + +class ZramLocalizationTests(unittest.TestCase): + def test_missing_optional_translation_uses_original_english(self): + with tempfile.TemporaryDirectory(prefix="zram-fallback-") as folder: + (Path(folder) / 'xx.json').write_text('{}') + script = function(ROOT / "scripts/utils.sh", "translate") + '\ntranslate "$1"\n' + result = subprocess.run(["bash", "-c", script, "bash", DETAILS['version'][0]], + text=True, capture_output=True, timeout=15, + env={**os.environ, 'LANGUAGE': 'xx', 'LANG_DIR': folder}) + self.assertEqual(result.returncode, 0, result.stderr) + self.assertEqual(result.stdout.strip(), DETAILS['version'][0]) + + def run_case(self, case, language="sk"): + with tempfile.TemporaryDirectory(prefix="zram-i18n-") as folder: + directory = Path(folder) + installer = function(ROOT / "scripts/post_install/customizable_post_install.sh", "configure_zram_swap") + installer = installer.replace("/etc/systemd/zram-generator.conf.d/90-proxmenux.conf", folder + "/etc/systemd/zram-generator.conf.d/90-proxmenux.conf") + installer = installer.replace("/proc/swaps", folder + "/proc/swaps").replace("/etc/fstab", folder + "/etc/fstab") + installer = installer.replace('zram_foreign_generator_config "$config"', 'zram_foreign_generator_config "$config" "$FIXTURE"') + installer = installer.replace('zram_list_foreign_systemd_zram_units)', 'zram_list_foreign_systemd_zram_units "$FIXTURE")') + script = HARNESS + function(ROOT / "scripts/utils.sh", "translate") + installer + "\nconfigure_zram_swap\n" + result = subprocess.run(["bash", "-c", script], text=True, capture_output=True, + env={**os.environ, "REPO": str(ROOT), "FIXTURE": folder, "CASE": case, "LANGUAGE": language}, timeout=15) + calls = (directory / "calls").read_text().splitlines() + files = {str(p.relative_to(directory)): p.read_text() for p in directory.rglob("*") if p.is_file()} + return result, calls, files + + def test_all_activation_details_are_localized_and_english_is_preserved(self): + for case, (english, slovak) in DETAILS.items(): + for language, expected in (("sk", slovak), ("en", english)): + with self.subTest(case=case, language=language): + result, calls, files = self.run_case(case, language) + self.assertEqual(result.returncode, 1, result.stderr) + self.assertIn(expected, result.stdout) + self.assertEqual(files["etc/fstab"], "/swapfile none swap sw 0 0\n") + if case in ("version", "mismatch"): + self.assertTrue(all(call == "dpkg-query" for call in calls), calls) + elif case == "stop": + self.assertEqual(files["state/zram-swap.state"], "installed_by_proxmenux=false\n") + self.assertIn("# ProxMenux ZRAM profile", files["etc/systemd/zram-generator.conf.d/90-proxmenux.conf"]) + else: + self.assertNotIn("state/zram-swap.state", files) + self.assertNotIn("etc/systemd/zram-generator.conf.d/90-proxmenux.conf", files) + self.assertFalse(any(call.startswith(("apt ", "package-install", "register ")) for call in calls), calls) + + def test_foreign_generator_is_refused_in_both_languages_without_any_effect(self): + for language, expected in (("sk", REFUSAL_SK), ("en", REFUSAL)): + result, calls, files = self.run_case("foreign", language) + self.assertEqual(result.returncode, 1, result.stderr) + self.assertIn(expected, result.stdout) + self.assertIn("/etc/systemd/zram-generator.conf", result.stdout) + self.assertEqual(calls, []) + self.assertEqual(files["etc/systemd/zram-generator.conf"], "[zram1]\nzram-size = ram / 5\n") + self.assertNotIn("state/zram-swap.state", files) + self.assertNotIn("etc/systemd/zram-generator.conf.d/90-proxmenux.conf", files) + self.assertEqual(files["etc/fstab"], "/swapfile none swap sw 0 0\n") + self.assertEqual(files["proc/swaps"], "Filename\tType\tSize\tUsed\tPriority\n") + + def test_failed_inspection_is_not_mistaken_for_no_conflict(self): + result, calls, files = self.run_case("unreadable") + self.assertEqual(result.returncode, 1, result.stderr) + self.assertIn("Nie je možné skontrolovať existujúcu konfiguráciu generátora ZRAM", result.stdout) + self.assertEqual(calls, []) + self.assertNotIn("state/zram-swap.state", files) + self.assertNotIn("etc/systemd/zram-generator.conf.d/90-proxmenux.conf", files) + + def test_uninstall_label_and_cancel_do_not_call_uninstall(self): + for language, label in (("sk", "Profil swapu ZRAM"), ("en", "ZRAM swap profile")): + with tempfile.TemporaryDirectory(prefix="zram-menu-") as folder: + tools = Path(folder) / "tools.json" + tools.write_text('{"zram_swap":true}') + script = function(ROOT / "scripts/utils.sh", "translate") + script += function(ROOT / "scripts/post_install/uninstall-tools.sh", "show_uninstall_menu") + script += '\nensure_tools_json() { :; }; migrate_installed_tools() { :; }\nuninstall_zram_swap() { printf forbidden; return 1; }\ndialog() { printf "%s\\n" "$@" > "$MENU_CAPTURE"; return 1; }\nshow_uninstall_menu\n' + result = subprocess.run(["bash", "-c", script], text=True, capture_output=True, + env={**os.environ, "LANGUAGE": language, "LANG_DIR": str(ROOT / "lang"), "TOOLS_JSON": str(tools), "MENU_CAPTURE": folder + "/dialog.txt"}, timeout=15) + self.assertEqual(result.returncode, 0, result.stderr) + self.assertIn(label, (Path(folder) / "dialog.txt").read_text()) + self.assertNotIn("forbidden", result.stdout + result.stderr) + self.assertEqual(json.loads(tools.read_text()), {"zram_swap": True}) diff --git a/.github/workflows/test-i18n.yml b/.github/workflows/test-i18n.yml index 7f4dfb51..828db33a 100644 --- a/.github/workflows/test-i18n.yml +++ b/.github/workflows/test-i18n.yml @@ -71,8 +71,8 @@ jobs: run: | test -x /bin/bash test -x /usr/bin/jq - - name: Install OCI wording test dependency - run: python3 -m pip install 'PyYAML>=6,<7' + - name: Install OCI wording test dependencies + run: python3 -m pip install 'PyYAML>=6,<7' 'jsonschema==4.25.1' - name: Run offline i18n and script regressions env: PYTHONDONTWRITEBYTECODE: '1' diff --git a/.github/workflows/test-offline-qualified.yml b/.github/workflows/test-offline-qualified.yml index 1993c320..53880af5 100644 --- a/.github/workflows/test-offline-qualified.yml +++ b/.github/workflows/test-offline-qualified.yml @@ -16,6 +16,7 @@ on: - 'AppImage/scripts/tests/test_local_app_icons.py' - 'AppImage/scripts/tests/test_local_app_icon_isolation.py' - 'AppImage/scripts/tests/test_docker_app_discovery.py' + - 'AppImage/scripts/tests/test_pbs_i18n.py' - 'AppImage/scripts/tests/fixtures/docker_discovery_inspect.json' - 'AppImage/app/**' - 'AppImage/components/**' @@ -41,6 +42,7 @@ on: - 'AppImage/scripts/tests/test_local_app_icons.py' - 'AppImage/scripts/tests/test_local_app_icon_isolation.py' - 'AppImage/scripts/tests/test_docker_app_discovery.py' + - 'AppImage/scripts/tests/test_pbs_i18n.py' - 'AppImage/scripts/tests/fixtures/docker_discovery_inspect.json' - 'AppImage/app/**' - 'AppImage/components/**' diff --git a/.github/workflows/test-pbs.yml b/.github/workflows/test-pbs.yml index 2dbc71b0..84a23736 100644 --- a/.github/workflows/test-pbs.yml +++ b/.github/workflows/test-pbs.yml @@ -6,6 +6,7 @@ on: - '.github/workflows/test-pbs.yml' - 'AppImage/scripts/*pbs*.py' - 'AppImage/scripts/tests/test_pbs.py' + - 'AppImage/scripts/tests/test_pbs_i18n.py' - 'AppImage/scripts/health_monitor.py' - 'AppImage/scripts/auth_manager.py' - 'AppImage/scripts/build_appimage.sh' @@ -51,6 +52,7 @@ jobs: - name: Platform, real TLS, APIs, health and AppImage packaging run: | python -B -m unittest discover -s AppImage/scripts/tests -p test_pbs.py -v + python -B -m unittest discover -s AppImage/scripts/tests -p test_pbs_i18n.py -v python -B -m unittest discover -s AppImage/scripts/tests -p test_auth_manager_ssl_reload.py -v for script in scripts/global/platform-functions.sh scripts/global/repository-functions.sh scripts/menus/pbs_menu.sh scripts/utilities/pbs_update.sh scripts/menus/main_menu.sh scripts/post_install/auto_post_install.sh scripts/post_install/customizable_post_install.sh scripts/post_install/uninstall-tools.sh scripts/global/update-pbs.sh scripts/menus/menu_post_install.sh; do bash -n "$script" diff --git a/AppImage/components/host-backup.tsx b/AppImage/components/host-backup.tsx index 07e10b94..30434ff7 100644 --- a/AppImage/components/host-backup.tsx +++ b/AppImage/components/host-backup.tsx @@ -48,6 +48,7 @@ import { import { ScriptTerminalModal } from "./script-terminal-modal" import { RestoreProgressCard } from "./restore-progress-card" import { fetchApi, getApiUrl } from "../lib/api-config" +import { hostBackupErrorText } from "../lib/host-backup-messages" import { fetchTerminalTicket } from "../lib/terminal-ws" import { formatStorage, formatBytes, cancelButtonClass } from "../lib/utils" import { getStorageUsageColor } from "../lib/storage-usage-color" @@ -525,7 +526,7 @@ function PbsKeyfileActions({ pbsRepository }: { pbsRepository?: string }) { await mutateInfo() closeUpload() } catch (e) { - setErr(e instanceof Error ? e.message : String(e)) + setErr(hostBackupErrorText(e, t)) setBusy(false) } } @@ -542,7 +543,7 @@ function PbsKeyfileActions({ pbsRepository }: { pbsRepository?: string }) { await mutateInfo() closeDelete() } catch (e) { - setErr(e instanceof Error ? e.message : String(e)) + setErr(hostBackupErrorText(e, t)) setBusy(false) } } @@ -765,7 +766,7 @@ function KeyfileActionsBar({ setPass1("") setPass2("") } catch (e) { - setErr(e instanceof Error ? e.message : String(e)) + setErr(hostBackupErrorText(e, t)) } finally { setBusy(false) } @@ -956,7 +957,7 @@ export function HostBackup() { mutateJobs() setJobToDelete(null) } catch (e) { - setActionError(t("backup.errors.deleteFailed", { error: `"${id}": ${e instanceof Error ? e.message : String(e)}` })) + setActionError(t("backup.errors.deleteFailed", { error: `"${id}": ${hostBackupErrorText(e, t)}` })) } finally { setBusyJobId(null) } @@ -1334,7 +1335,7 @@ export function HostBackup() {
{t("backup.archives.remoteQueryWarning")}
{remoteArchivesResp.errors.map((e, i) => (
- {e.backend}/{e.repo_name}: {e.error} + {e.backend}/{e.repo_name}: {hostBackupErrorText(e.error, t)}
))} @@ -1761,7 +1762,7 @@ function InspectModal({ setImportFile(null) setImportPath("") } catch (e) { - setImportError(e instanceof Error ? e.message : String(e)) + setImportError(hostBackupErrorText(e, t)) } finally { setImporting(false) } @@ -1812,7 +1813,7 @@ function InspectModal({ : undefined, }) } catch (e) { - setRestoreError(e instanceof Error ? e.message : String(e)) + setRestoreError(hostBackupErrorText(e, t)) } finally { setRestorePreparing(false) } @@ -1841,7 +1842,7 @@ function InspectModal({ a.click() document.body.removeChild(a) } catch (e) { - setError(t("backup.errors.downloadFailed", { error: e instanceof Error ? e.message : String(e) })) + setError(t("backup.errors.downloadFailed", { error: hostBackupErrorText(e, t) })) } finally { // The download itself runs in the browser's network stack; // we just initiated it. Clear the spinner immediately. @@ -1914,7 +1915,7 @@ function InspectModal({ document.body.removeChild(a) setExportTask(null) } catch (e) { - setError(t("backup.errors.downloadFailed", { error: e instanceof Error ? e.message : String(e) })) + setError(t("backup.errors.downloadFailed", { error: hostBackupErrorText(e, t) })) } finally { setDownloading(false) } @@ -1962,7 +1963,7 @@ function InspectModal({ setShowDeleteArchiveConfirm(false) if (onDeleted) onDeleted(); else onClose() } catch (e) { - setError(t("backup.errors.deleteFailed", { error: e instanceof Error ? e.message : String(e) })) + setError(t("backup.errors.deleteFailed", { error: hostBackupErrorText(e, t) })) } finally { setDeletingArchive(false) } @@ -1989,7 +1990,7 @@ function InspectModal({ ) as NonNullable setInstructions(res) } catch (e) { - setError(e instanceof Error ? e.message : String(e)) + setError(hostBackupErrorText(e, t)) } finally { setFetchingInstructions(false) } @@ -2021,7 +2022,7 @@ function InspectModal({ ) setReport(res) } catch (e: any) { - setError(e?.message || t("backup.errors.preflightFailed")) + setError(hostBackupErrorText(e, t)) } finally { setRunning(false) } @@ -2164,7 +2165,7 @@ function InspectModal({ — {exportTask.message} {exportTask.state === "failed" && exportTask.error && ( -
{exportTask.error}
+
{hostBackupErrorText(exportTask.error, t)}
)} {exportTask.state === "completed" && exportTask.size_bytes > 0 && (
{t("backup.archives.packedSizeLabel")} {formatBytes(exportTask.size_bytes)}
@@ -2706,7 +2707,7 @@ function PreflightReportView({ report }: { report: PreflightReport }) {
{c.id} - {c.message} + {hostBackupErrorText(c.message, t)}
) @@ -3326,9 +3327,9 @@ function CreateJobDialog({ } catch (e) { const err = e as Error & { body?: { tool_output?: string; tool_exit_code?: number } } const detail = err.body?.tool_output - ? `${err.message}\n\n${t("backup.errors.proxmoxBackupClientOutput")}:\n${err.body.tool_output}` - : err.message - setError(t("backup.errors.encryptionSetupFailed", { detail: detail || String(e) })) + ? `${hostBackupErrorText(err, t)}\n\n${t("backup.errors.proxmoxBackupClientOutput")}:\n${err.body.tool_output}` + : hostBackupErrorText(err, t) + setError(t("backup.errors.encryptionSetupFailed", { error: detail || hostBackupErrorText(e, t) })) setPbsImportBusy(false) setSubmitting(false) return @@ -3391,7 +3392,7 @@ function CreateJobDialog({ }) onCreated() } catch (e) { - setError(e instanceof Error ? e.message : String(e)) + setError(hostBackupErrorText(e, t)) } finally { setSubmitting(false) } @@ -3764,7 +3765,7 @@ function CreateJobDialog({ ) : (
- {t("backup.validation.invalidLabel")} {calendarPreview.error} + {t("backup.validation.invalidLabel")} {hostBackupErrorText(calendarPreview.error, t)}
) ) : ( @@ -4696,9 +4697,9 @@ function ManualBackupDialog({ } catch (e) { const err = e as Error & { body?: { tool_output?: string; tool_exit_code?: number } } const detail = err.body?.tool_output - ? `${err.message}\n\n${t("backup.errors.proxmoxBackupClientOutput")}:\n${err.body.tool_output}` - : err.message - setError(t("backup.errors.encryptionSetupFailed", { detail: detail || String(e) })) + ? `${hostBackupErrorText(err, t)}\n\n${t("backup.errors.proxmoxBackupClientOutput")}:\n${err.body.tool_output}` + : hostBackupErrorText(err, t) + setError(t("backup.errors.encryptionSetupFailed", { error: detail || hostBackupErrorText(e, t) })) setPbsImportBusy(false) setSubmitting(false) return @@ -4738,7 +4739,7 @@ function ManualBackupDialog({ ) onLaunched(resp.job_id) } catch (e) { - setError(e instanceof Error ? e.message : String(e)) + setError(hostBackupErrorText(e, t)) } finally { setSubmitting(false) } @@ -5542,7 +5543,7 @@ function DestinationsSection({ await fetchApi(`/api/host-backups/destinations/pbs/${encodeURIComponent(name)}${force ? "?force=true" : ""}`, { method: "DELETE" }) onChanged() } catch (e) { - setError(e instanceof Error ? e.message : String(e)) + setError(hostBackupErrorText(e, t)) } finally { setBusyKey(null) } @@ -5554,7 +5555,7 @@ function DestinationsSection({ await fetchApi(`/api/host-backups/destinations/borg/${encodeURIComponent(name)}${force ? "?force=true" : ""}`, { method: "DELETE" }) onChanged() } catch (e) { - setError(e instanceof Error ? e.message : String(e)) + setError(hostBackupErrorText(e, t)) } finally { setBusyKey(null) } @@ -5571,7 +5572,7 @@ function DestinationsSection({ ) onChanged() } catch (e) { - setError(e instanceof Error ? e.message : String(e)) + setError(hostBackupErrorText(e, t)) } finally { setBusyKey(null) } @@ -5599,7 +5600,7 @@ function DestinationsSection({ }) onChanged() } catch (e) { - setError(e instanceof Error ? e.message : String(e)) + setError(hostBackupErrorText(e, t)) } finally { setBusyKey(null) } @@ -6042,7 +6043,7 @@ function DestinationRow({ {capacity?.error && (

- {t("backup.destinations.capacityUnavailable", { error: capacity.error })} + {t("backup.destinations.capacityUnavailable", { error: hostBackupErrorText(capacity.error, t) })}

)} {!capacity && ( @@ -6341,7 +6342,7 @@ function AddDestinationDialog({ ) setGeneratedKey(resp) } catch (e) { - setError(e instanceof Error ? e.message : String(e)) + setError(hostBackupErrorText(e, t)) } finally { setGeneratingKey(false) } @@ -6405,7 +6406,7 @@ function AddDestinationDialog({ } onSaved(savedRepo) } catch (e) { - setError(e instanceof Error ? e.message : String(e)) + setError(hostBackupErrorText(e, t)) } finally { setSubmitting(false) } @@ -6756,7 +6757,7 @@ function UsbPicker({ mutate() if (resp?.mountpoint) onPick(resp.mountpoint) } catch (e) { - setError(e instanceof Error ? e.message : String(e)) + setError(hostBackupErrorText(e, t)) } finally { setBusyKey(null) } @@ -6784,7 +6785,7 @@ function UsbPicker({ setFormatTyped("") if (resp?.mountpoint) onPick(resp.mountpoint) } catch (e) { - setError(e instanceof Error ? e.message : String(e)) + setError(hostBackupErrorText(e, t)) } finally { setBusyKey(null) } @@ -7001,7 +7002,7 @@ function ExtraPathsSection() { setNewPath("") mutate() } catch (e) { - setError(e instanceof Error ? e.message : String(e)) + setError(hostBackupErrorText(e, t)) } finally { setSubmitting(false) } @@ -7014,7 +7015,7 @@ function ExtraPathsSection() { await fetchApi(`/api/host-backups/extra-paths?path=${encodeURIComponent(p)}`, { method: "DELETE" }) mutate() } catch (e) { - setError(e instanceof Error ? e.message : String(e)) + setError(hostBackupErrorText(e, t)) } finally { setBusyPath(null) } @@ -7180,7 +7181,7 @@ function UsbDrivesSection() { }) mutate() } catch (e) { - setError(e instanceof Error ? e.message : String(e)) + setError(hostBackupErrorText(e, t)) } finally { setBusyKey(null) } @@ -7198,7 +7199,7 @@ function UsbDrivesSection() { }) mutate() } catch (e) { - setError(e instanceof Error ? e.message : String(e)) + setError(hostBackupErrorText(e, t)) } finally { setBusyKey(null) } @@ -7222,7 +7223,7 @@ function UsbDrivesSection() { setFormatTarget(null) setFormatTyped("") } catch (e) { - setError(e instanceof Error ? e.message : String(e)) + setError(hostBackupErrorText(e, t)) } finally { setBusyKey(null) } @@ -7508,7 +7509,7 @@ function JobDetailModal({ setRunning(false) setRunBaseline(null) setRunBaselineLogPath(null) - setActionError(t("backup.errors.runFailed", { error: e instanceof Error ? e.message : String(e) })) + setActionError(t("backup.errors.runFailed", { error: hostBackupErrorText(e, t) })) } } @@ -7522,7 +7523,7 @@ function JobDetailModal({ await refetch() onChanged() } catch (e) { - setActionError(t("backup.errors.toggleFailed", { error: e instanceof Error ? e.message : String(e) })) + setActionError(t("backup.errors.toggleFailed", { error: hostBackupErrorText(e, t) })) } finally { setBusy("") } @@ -8155,7 +8156,7 @@ function PbsKeyfileRecoveryDialog({ }) onRecovered() } catch (e) { - setError(e instanceof Error ? e.message : String(e)) + setError(hostBackupErrorText(e, t)) } finally { setBusy(false) } @@ -8342,7 +8343,7 @@ function ArchiveContentsModal({ body: JSON.stringify(body), }) .then((r: any) => setData(r)) - .catch((e) => setError(e instanceof Error ? e.message : String(e))) + .catch((e) => setError(hostBackupErrorText(e, t))) .finally(() => setLoading(false)) }, [open, source, repo_name, snapshot, path]) @@ -8571,7 +8572,7 @@ function PlanSummary({ plan }: { plan: any }) {
{t("backup.plan.blockers")}
    {blockers.map((b, i) => ( -
  • {typeof b === "string" ? b : (b.message || JSON.stringify(b))}
  • +
  • {hostBackupErrorText(typeof b === "string" ? b : (b.message || JSON.stringify(b)), t)}
  • ))}
@@ -8581,7 +8582,7 @@ function PlanSummary({ plan }: { plan: any }) {
{t("backup.plan.warnings")}
    {warnings.map((w, i) => ( -
  • {typeof w === "string" ? w : (w.message || JSON.stringify(w))}
  • +
  • {hostBackupErrorText(typeof w === "string" ? w : (w.message || JSON.stringify(w)), t)}
  • ))}
@@ -8611,7 +8612,7 @@ function StorageSection({ storage }: { storage: any }) {
{e.name || e.storage || `entry ${i}`} {e.type && {e.type}} - {e.message &&
{e.message}
} + {e.message &&
{hostBackupErrorText(e.message, t)}
}
) diff --git a/AppImage/components/lxc-app-panel.tsx b/AppImage/components/lxc-app-panel.tsx index ffd06ea5..0c7cd6e4 100644 --- a/AppImage/components/lxc-app-panel.tsx +++ b/AppImage/components/lxc-app-panel.tsx @@ -37,6 +37,7 @@ import { fetchLxcApps, getLxcAppsCached, setLxcAppsCached, subscribeLxcApps } fr import { categoryChipStyle, useIsLightTheme } from "../lib/category-color" import { getCategoryLabel } from "../lib/category-label" import { useT } from "@/lib/i18n/provider" +import { localizeAppEditorError } from "../lib/lxc-app-editor-errors" // installed_via is optional now — an empty value means "register only, // no version tracking, no warnings, just a clickable link". Docker @@ -728,7 +729,7 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci, c if (lower.startsWith("registry unreachable")) { return t("vmLxc.appEditor.upstreamErrorRegistry") } - return msg + return localizeAppEditorError(msg, t) } const editorOpen = !!editing && editing.targetVmid === vmid @@ -1212,7 +1213,7 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci, c } const removeOne = async (appId: string) => { - if (!confirm("Remove this application from the CT's App tab?")) return + if (!confirm(t("vmLxc.appEditor.confirmRemove"))) return setBusyAppId(appId) setError(null) try { @@ -2069,14 +2070,14 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci, c id="app-package" value={draft.package || ""} onChange={(e) => setField({ package: e.target.value })} - placeholder={method === "dpkg" ? "e.g. jellyfin-server" : "e.g. tailscale"} + placeholder={t("vmLxc.appEditor.packageExample", { package: method === "dpkg" ? "jellyfin-server" : "tailscale" })} />
- Auto-filled from Name. Verify with{" "} + {t("vmLxc.appEditor.packageHelpBefore")}{" "} {method === "dpkg" ? "dpkg -l | grep " : "apk info | grep "} {" "} - inside the CT. + {t("vmLxc.appEditor.packageHelpAfter")}
)} @@ -2092,8 +2093,8 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci, c className="font-mono text-xs" />
- Absolute path. Find it with{" "} - which <app> or{" "} + {t("vmLxc.appEditor.binaryHelpBefore")}{" "} + which <app>{" "}{t("vmLxc.appEditor.binaryHelpOr")}{" "} systemctl show <service> -p ExecStart.
@@ -2558,7 +2559,7 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci, c {detectorTest.installed.version ? (
{detectorTest.installed.version}
) : ( -
{detectorTest.installed.error || t("vmLxc.appEditor.detectorTestNoVersion")}
+
{localizeUpstreamError(detectorTest.installed.error) || t("vmLxc.appEditor.detectorTestNoVersion")}
)}
{detectorTest.installed.method || "—"} @@ -2574,7 +2575,7 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci, c ) : detectorTest.upstream.version ? (
{detectorTest.upstream.version}
) : ( -
{detectorTest.upstream.error || t("vmLxc.appEditor.detectorTestNoVersion")}
+
{localizeUpstreamError(detectorTest.upstream.error) || t("vmLxc.appEditor.detectorTestNoVersion")}
)} {detectorTest.upstream.type && (
{detectorTest.upstream.type}
@@ -2587,7 +2588,7 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci, c {error && (
- {error} + {localizeAppEditorError(error, t)}
)} @@ -3343,7 +3344,7 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci, c {error && (
- {error} + {localizeAppEditorError(error, t)}
)}
diff --git a/AppImage/components/monitor-switcher.tsx b/AppImage/components/monitor-switcher.tsx index 89f8d249..7fb88eb9 100644 --- a/AppImage/components/monitor-switcher.tsx +++ b/AppImage/components/monitor-switcher.tsx @@ -14,6 +14,7 @@ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from "./ui/dropdown-menu" import { fetchApi } from "../lib/api-config" +import { monitorLinkError } from "../lib/monitor-link-errors" import { useT } from "../lib/i18n/provider" interface MonitorLink { @@ -185,8 +186,9 @@ export function MonitorSwitcher({ nodeName, compact = false }: { nodeName: strin await refreshCache("/api/monitor-links") setOfferOrigin(false) } catch (err) { - await refreshCache("/api/monitor-links") - setAddError(err instanceof Error ? err.message : t("monitorLinks.saveFailed")) + setAddError(monitorLinkError(err, t)) + try { await refreshCache("/api/monitor-links") } + catch { /* SWR shows the load error; keep the localized mutation error. */ } } finally { setAdding(false) } } const notNow = () => { @@ -260,7 +262,7 @@ export function MonitorSwitcher({ nodeName, compact = false }: { nodeName: strin {manageOpen && } {origin && { if (!open) notNow() }}> - event.stopPropagation()}> + event.stopPropagation()}> {t("monitorLinks.knownTitle")} {t("monitorLinks.knownBody", { name: origin.name })} @@ -290,7 +292,7 @@ export function MonitorSwitcher({ nodeName, compact = false }: { nodeName: strin function ManageLinksDialog({ open, onOpenChange }: { open: boolean; onOpenChange: (open: boolean) => void }) { const t = useT() - const { data, mutate } = useSWR("/api/monitor-links?all=1", fetcher, { revalidateOnFocus: false }) + const { data, mutate, error: loadError, isLoading } = useSWR("/api/monitor-links?all=1", fetcher, { revalidateOnFocus: false }) const [form, setForm] = useState({ name: "", url: "", product: "pve" }) const [addresses, setAddresses] = useState>({}) const [editing, setEditing] = useState(null) @@ -304,14 +306,14 @@ function ManageLinksDialog({ open, onOpenChange }: { open: boolean; onOpenChange await mutate() await refreshCache("/api/monitor-links") } catch (err) { - setError(err instanceof Error ? err.message : t("monitorLinks.saveFailed")) + setError(monitorLinkError(err, t)) } finally { setBusy(false) } } const send = (path: string, method: string, body?: unknown) => fetchApi(path, { method, ...(body === undefined ? {} : { body: JSON.stringify(body) }) }) return - event.stopPropagation()}> {t("monitorLinks.dialogTitle")} @@ -320,7 +322,7 @@ function ManageLinksDialog({ open, onOpenChange }: { open: boolean; onOpenChange

{t("monitorLinks.addTitle")}

-
+
setForm({ ...form, name: event.target.value })} /> @@ -350,6 +352,8 @@ function ManageLinksDialog({ open, onOpenChange }: { open: boolean; onOpenChange {error &&

{error}

}
+ {isLoading &&

{t("monitorLinks.checking")}

} + {loadError &&

{t("monitorLinks.loadFailed")}

} {data?.links.length === 0 &&

{t("monitorLinks.empty")}

} {data?.links.map(link => { const own = link.manual || link.custom_url @@ -378,8 +382,8 @@ function ManageLinksDialog({ open, onOpenChange }: { open: boolean; onOpenChange {t("monitorLinks.thisNode")}
: isEditing - ?
- + setAddresses({ ...addresses, [link.key]: event.target.value })} />
-

{store.error || t("pbs.capacityUnavailable")}

+
} const tone = usageTone(percent) @@ -62,10 +64,11 @@ export function DatastoreUsageRow({ store, compact = false }: { store: PBSDatast // Same layout as the "Proxmox storage" cards of the PVE Monitor. export function PBSDatastoreCard({ store }: { store: PBSDatastore }) { const t = useT() + const { language } = useI18n() const percent = datastorePercent(store) const tone = percent == null ? null : usageTone(percent) const fullDate = store["estimated-full-date"] - const type = store["backend-type"] || "datastore" + const type = store["backend-type"] || t("pbs.datastoreType") return
@@ -99,13 +102,13 @@ export function PBSDatastoreCard({ store }: { store: PBSDatastore }) {
) : ( -

{store.error || t("storage.capacityNotReported")}

+ )} {(store.path || fullDate !== undefined) &&
{store.path && {store.path}} {fullDate !== undefined && {t("pbs.estimatedFull")}: - {fullDate > 0 ? new Date(fullDate * 1000).toLocaleDateString() : t("pbs.estimatedFullUnknown")} + {fullDate > 0 ? new Date(fullDate * 1000).toLocaleDateString(language) : t("pbs.estimatedFullUnknown")} }
}
diff --git a/AppImage/components/pbs-panel.tsx b/AppImage/components/pbs-panel.tsx index 5ea6856d..b18a3e12 100644 --- a/AppImage/components/pbs-panel.tsx +++ b/AppImage/components/pbs-panel.tsx @@ -14,8 +14,10 @@ import { Label } from "./ui/label" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "./ui/select" import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "./ui/dialog" import { PBSDatastoreCard, type PBSDatastore } from "./pbs-datastore-usage" +import { PBSProblemMessage } from "./pbs-problem-message" +import { pbsDiagnostic, pbsResultText, pbsServiceState, pbsTaskType, formatPBSDuration } from "../lib/pbs-messages" import { fetchApi } from "../lib/api-config" -import { useT } from "../lib/i18n/provider" +import { useT, useI18n } from "../lib/i18n/provider" interface Connection { id: string; name: string; url: string; token_id: string; fingerprint: string; has_token: boolean } interface Detected { name: string; url: string; fingerprint: string } @@ -26,6 +28,7 @@ interface PBSStatus { name: string; version: string | null; fetched_at: number; services: Record; datastores: PBSDatastore[] | null; tasks: Task[] | null; sync: Job[] | null; verify: Job[] | null; prune: Job[] | null; errors: Record; + error_details?: Record }>; } const emptyForm = { id: "", name: "", url: "", token_id: "", fingerprint: "", token_secret: "", username: "", password: "" } @@ -46,9 +49,10 @@ const TASK_ICONS: Record = { termproxy: Terminal, dircreate: Database, "create-datastore": Database, } -// PBS reports "OK", "WARNINGS: n" or the error text; a task without one is still running. +// PBS reports "unknown", "OK", "WARNINGS: n" or an error; no state is still running. function taskState(task: Task): keyof typeof badgeTone { if (!task.status) return task.endtime ? "muted" : "running" + if (task.status === "unknown") return "muted" if (task.status === "OK") return "ok" if (task.status.startsWith("WARNINGS")) return "warn" return "error" @@ -56,27 +60,19 @@ function taskState(task: Task): keyof typeof badgeTone { // PBS reports "OK", "WARNINGS: n" or the error text of the last run. function jobState(state?: string): keyof typeof badgeTone { - if (!state) return "muted" + if (!state || state === "unknown") return "muted" if (state.toLowerCase() === "ok") return "ok" if (state.toLowerCase().startsWith("warn")) return "warn" return "error" } -function formatDuration(seconds: number) { - if (!Number.isFinite(seconds) || seconds < 0) return "—" - if (seconds < 60) return `${Math.round(seconds)}s` - const minutes = Math.floor(seconds / 60) - if (minutes < 60) return `${minutes}m ${Math.round(seconds % 60)}s` - const hours = Math.floor(minutes / 60) - return hours < 24 ? `${hours}h ${minutes % 60}m` : `${Math.floor(hours / 24)}d ${hours % 24}h` -} - // `localOnly` is the PBS host's own Monitor: no connection picker, the // header Refresh already reloads the page data. Its tabs show one `view` each. export function PBSPanel({ localOnly = false, view = "all" }: { localOnly?: boolean; view?: "all" | "datastores" | "tasks" } = {}) { const showStores = view !== "tasks" const showTasks = view !== "datastores" const t = useT() + const { language } = useI18n() const { data: connections, error: connectionError, mutate: reloadConnections } = useSWR( "/api/pbs/servers", url => fetchApi(url), { revalidateOnFocus: false }) const [selected, setSelected] = useState("") @@ -85,7 +81,8 @@ export function PBSPanel({ localOnly = false, view = "all" }: { localOnly?: bool const [method, setMethod] = useState("password") const [busy, setBusy] = useState(false) const [message, setMessage] = useState("") - const [error, setError] = useState("") + const [error, setError] = useState(null) + const [errorFallback, setErrorFallback] = useState("pbs.saveFailed") const { data, error: statusError, isLoading, mutate } = useSWR( selected ? `/api/pbs/status?server=${encodeURIComponent(selected)}` : null, url => fetchApi(url), { refreshInterval: 30000, revalidateOnFocus: false }) @@ -102,7 +99,9 @@ export function PBSPanel({ localOnly = false, view = "all" }: { localOnly?: bool } const save = async () => { + setErrorFallback("pbs.saveFailed") setBusy(true); setError(""); setMessage("") + let saved = false try { // A password is sent once to create a read-only token; only the token is kept. const { username, password, ...connection } = form @@ -113,22 +112,26 @@ export function PBSPanel({ localOnly = false, view = "all" }: { localOnly?: bool : await fetchApi<{ id: string }>("/api/pbs/servers", { method: "POST", body: JSON.stringify({ ...connection, id: form.id || undefined, token_secret: form.token_secret || undefined, }) }) + saved = true await reloadConnections() setSelected(result.id) setForm(emptyForm) setManage(false) - } catch (err) { setError(err instanceof Error ? err.message : t("pbs.saveFailed")) } + } catch (err) { setError(saved ? { body: { code: "pbs_saved_refresh_failed" }, message: pbsDiagnostic(err) } : err) } finally { setBusy(false) } } const remove = async () => { if (!form.id || !window.confirm(t("pbs.removeConfirm"))) return + setErrorFallback("pbs.removeFailed") setBusy(true); setError(""); setMessage("") + let removed = false try { await fetchApi(`/api/pbs/servers/${encodeURIComponent(form.id)}`, { method: "DELETE" }) + removed = true setForm(emptyForm) await reloadConnections() - } catch (err) { setError(err instanceof Error ? err.message : t("pbs.saveFailed")) } + } catch (err) { setError(removed ? { body: { code: "pbs_removed_refresh_failed" }, message: pbsDiagnostic(err) } : err) } finally { setBusy(false) } } const now = Date.now() / 1000 @@ -150,8 +153,9 @@ export function PBSPanel({ localOnly = false, view = "all" }: { localOnly?: bool {t("pbs.manage")}
} - {(connectionError || statusError) &&

- {String((connectionError || statusError)?.message || t("pbs.loadFailed"))}

} + {(connectionError || statusError) &&
+ +
} {isLoading &&

{t("pbs.loading")}

} {!selected && !connectionError && connections &&

{t("pbs.noServer")}

} {!localOnly && !manage && (connections?.detected?.length || 0) > 0 && @@ -171,7 +175,7 @@ export function PBSPanel({ localOnly = false, view = "all" }: { localOnly?: bool } {!localOnly && { if (!busy) setManage(open) }}> - + {t("pbs.manage")} {method === "password" && !form.id ? t("pbs.passwordHelp") : t("pbs.permissionsHelp")} @@ -201,19 +205,26 @@ export function PBSPanel({ localOnly = false, view = "all" }: { localOnly?: bool )}
} -
+
{(["name", "url", ...(method === "password" && !form.id ? ["username", "password"] : ["token_id", "token_secret"]), "fingerprint"] as const).map(field => { const secret = field === "token_secret" || field === "password" - return
- + const help = field === "url" ? "pbs.urlHelp" : field === "username" ? "pbs.usernameHelp" + : field === "token_id" ? "pbs.tokenIdHelp" : field === "token_secret" + ? form.id ? "pbs.tokenSecretKeepHelp" : "pbs.tokenSecretHelp" : undefined + return
+ setForm({ ...form, [field]: event.target.value })} /> + {help &&

{t(help)}

}
})}

{t("pbs.tlsHelp")}

- {error &&

{error}

} + {!!error &&
+ +
} {message &&

{message}

}
{form.id &&
} {data && <> {!localOnly &&
- {data.name} · PBS {data.version || "—"} · {t("pbs.updatedAt", { time: new Date(data.fetched_at * 1000).toLocaleTimeString() })} + {data.name} · PBS {data.version || "—"} · {t("pbs.updatedAt", { time: new Date(data.fetched_at * 1000).toLocaleTimeString(language) })} {Object.keys(data.services).length > 0 && Object.values(data.services).every(state => state === "active") ? {t("pbs.servicesActive")} : Object.entries(data.services).filter(([, state]) => state !== "active").map(([service, state]) => - {service}: {state})} + {service}: {pbsServiceState(state, t)})}
} {Object.entries(data.errors).filter(([section]) => section === "datastores" ? showStores : showTasks) - .map(([section, detail]) =>

{t(`pbs.${section}`)}: {detail}

)} + .map(([section, detail]) =>
+

{t(`pbs.${["datastores", "tasks", "sync", "verify", "prune"].includes(section) ? section : "title"}`)}

+ +
)} {showStores && {t("pbs.datastores")} @@ -268,14 +282,14 @@ export function PBSPanel({ localOnly = false, view = "all" }: { localOnly?: bool return - {row.worker_type} + {pbsTaskType(row.worker_type, t)} {row.worker_id && {row.worker_id}} - {row.starttime ? new Date(row.starttime * 1000).toLocaleString() : "—"} - {row.starttime && end ? formatDuration(end - row.starttime) : "—"} - - {state === "running" ? t("pbs.running") : row.status || "—"} - + {row.starttime ? new Date(row.starttime * 1000).toLocaleString(language) : "—"} + {row.starttime && end ? formatPBSDuration(end - row.starttime, t) : "—"} + + + })} } @@ -299,7 +313,7 @@ export function PBSPanel({ localOnly = false, view = "all" }: { localOnly?: bool {t(`pbs.${kind}`)} · {row.id} {row.store || "—"} {row.schedule || "—"} - {row["last-run-state"] || "—"} + )} })()} @@ -309,3 +323,15 @@ export function PBSPanel({ localOnly = false, view = "all" }: { localOnly?: bool } } + +function PBSResultBadge({ status, running = false, tone }: { status?: string; running?: boolean; tone: string }) { + const t = useT() + const badge = + {running ? t("pbs.running") : pbsResultText(status, t)} + + if (running || !status || status === "unknown" || /^ok$/i.test(status) || /^WARNINGS:\s*\d+\s*$/i.test(status)) return badge + return
+ {badge} +
{status}
+
+} diff --git a/AppImage/components/pbs-problem-message.tsx b/AppImage/components/pbs-problem-message.tsx new file mode 100644 index 00000000..f8286da9 --- /dev/null +++ b/AppImage/components/pbs-problem-message.tsx @@ -0,0 +1,19 @@ +"use client" + +import { pbsErrorText, pbsIsKnownError } from "../lib/pbs-messages" +import { useT } from "../lib/i18n/provider" + +// Known application messages are already explained in the active language. +// Preserve unrecognized external diagnostics as escaped technical details. +export function PBSProblemMessage({ problem, raw, fallback, className = "" }: { + problem?: unknown; raw?: string; fallback?: string; className?: string +}) { + const t = useT() + return
+

{pbsErrorText(problem, t, fallback)}

+ {raw && !pbsIsKnownError(problem) &&
+ {t("pbs.technicalDetails")} +
{raw}
+
} +
+} diff --git a/AppImage/components/script-terminal-modal.tsx b/AppImage/components/script-terminal-modal.tsx index c993281d..db33d093 100644 --- a/AppImage/components/script-terminal-modal.tsx +++ b/AppImage/components/script-terminal-modal.tsx @@ -31,6 +31,7 @@ import { import "xterm/css/xterm.css" import { API_PORT } from "@/lib/api-config" import { getTicketedWsUrl } from "@/lib/terminal-ws" +import { scriptCompletion, scriptCompletionOutput } from "@/lib/script-completion" import { useT } from "../lib/i18n/provider" interface WebInteraction { @@ -52,6 +53,7 @@ interface ScriptTerminalModalProps { params?: Record completedSuccessfullyMessage?: string completedWithErrorMessage?: (exitCode: number) => string + cancelledExitCode?: number // Optional callback fired when the script's WebSocket closes // (script_runner sends an exit code and then closes). Lets the // parent auto-dismiss the modal — used by host-backup's Restore @@ -69,6 +71,7 @@ export function ScriptTerminalModal({ params = { EXECUTION_MODE: "web" }, completedSuccessfullyMessage, completedWithErrorMessage, + cancelledExitCode, onComplete, }: ScriptTerminalModalProps) { const t = useT() @@ -103,10 +106,12 @@ export function ScriptTerminalModal({ const getCompletionMessage = useCallback( (exitCode: number) => - exitCode === 0 + scriptCompletion(exitCode, cancelledExitCode).kind === "cancelled" + ? t("scriptTerminal.cancelled") + : exitCode === 0 ? (completedSuccessfullyMessage ?? t("scriptTerminal.completedSuccessfully")) : (completedWithErrorMessage?.(exitCode) ?? t("scriptTerminal.completedWithError", { code: exitCode })), - [completedSuccessfullyMessage, completedWithErrorMessage, t], + [completedSuccessfullyMessage, completedWithErrorMessage, cancelledExitCode, t], ) const terminalContainerRef = useRef(null) @@ -139,6 +144,11 @@ export function ScriptTerminalModal({ reconnectTimeoutRef.current = setTimeout(async () => { if (wsRef.current?.readyState !== WebSocket.OPEN && termRef.current) { if (wsRef.current) { + // Replacing a stale socket is not a script result. Its close event + // must not complete the operation before the new socket reports it. + wsRef.current.onclose = null + wsRef.current.onerror = null + wsRef.current.onmessage = null wsRef.current.close() } @@ -176,6 +186,7 @@ const initMessage = { } ws.onmessage = (event) => { + if (completionReceivedRef.current) return // Filter out pong responses from heartbeat if (event.data === '{"type": "pong"}' || event.data === '{"type":"pong"}') { return @@ -189,10 +200,10 @@ const initMessage = { : null if (exitMatch) { const exitCode = Number(exitMatch[1]) - termRef.current?.write(event.data) + if (scriptCompletion(exitCode, cancelledExitCode).kind !== "cancelled") termRef.current?.write(event.data) completionReceivedRef.current = true setIsComplete(true) - termRef.current?.writeln(`\x1b[${exitCode === 0 ? "32" : "31"}m${getCompletionMessage(exitCode)}\x1b[0m`) + termRef.current?.writeln(scriptCompletionOutput(exitCode, getCompletionMessage(exitCode), cancelledExitCode)) onCompleteRef.current?.(exitCode) if (ws.readyState === WebSocket.OPEN) ws.close(1000, "script complete") return @@ -223,7 +234,7 @@ const initMessage = { const exitCode = Number(msg.exit_code ?? 1) completionReceivedRef.current = true setIsComplete(true) - termRef.current?.writeln(`\x1b[${exitCode === 0 ? "32" : "31"}m${getCompletionMessage(exitCode)}\x1b[0m`) + termRef.current?.writeln(scriptCompletionOutput(exitCode, getCompletionMessage(exitCode), cancelledExitCode)) onCompleteRef.current?.(exitCode) if (ws.readyState === WebSocket.OPEN) ws.close(1000, "script complete") return @@ -261,7 +272,7 @@ const initMessage = { } } }, 1000) - }, [isOpen, isComplete, scriptPath, getCompletionMessage, t]) + }, [isOpen, isComplete, scriptPath, getCompletionMessage, cancelledExitCode, t]) const sendKey = useCallback((key: string) => { if (!termRef.current) return @@ -392,6 +403,7 @@ const initMessage = { } ws.onmessage = (event) => { + if (completionReceivedRef.current) return // Filter out pong responses from heartbeat - don't display in terminal if (event.data === '{"type": "pong"}' || event.data === '{"type":"pong"}') { return @@ -405,10 +417,10 @@ const initMessage = { : null if (exitMatch) { const exitCode = Number(exitMatch[1]) - term.write(event.data) + if (scriptCompletion(exitCode, cancelledExitCode).kind !== "cancelled") term.write(event.data) completionReceivedRef.current = true setIsComplete(true) - term.writeln(`\x1b[${exitCode === 0 ? "32" : "31"}m${getCompletionMessage(exitCode)}\x1b[0m`) + term.writeln(scriptCompletionOutput(exitCode, getCompletionMessage(exitCode), cancelledExitCode)) onCompleteRef.current?.(exitCode) if (ws.readyState === WebSocket.OPEN) ws.close(1000, "script complete") return @@ -441,7 +453,7 @@ const initMessage = { const exitCode = Number(msg.exit_code ?? 1) completionReceivedRef.current = true setIsComplete(true) - term.writeln(`\x1b[${exitCode === 0 ? "32" : "31"}m${getCompletionMessage(exitCode)}\x1b[0m`) + term.writeln(scriptCompletionOutput(exitCode, getCompletionMessage(exitCode), cancelledExitCode)) onCompleteRef.current?.(exitCode) if (ws.readyState === WebSocket.OPEN) ws.close(1000, "script complete") return @@ -814,7 +826,7 @@ const initMessage = { )} {(isMobile || isTablet) && ( -
+
)}
)} @@ -8014,6 +8017,7 @@ export function VirtualMachines() { onClose={() => { const vmid = ociAction.vmid setOciAction(null) + if (!shouldRefreshOciAfterCompletion(ociCompletionCodeRef.current)) return // The image, the digest and the record changed: read them again. fetchApi(`/api/vms/${vmid}/apps/check`, { method: "POST" }) .catch(() => undefined) @@ -8027,7 +8031,10 @@ export function VirtualMachines() { }} scriptPath="/usr/local/share/proxmenux/scripts/oci/manage_instance.sh" scriptName="oci_manage_instance" - title={ociAction.action === "update" ? t("vmLxc.ociUpdates.terminalTitleUpdate") + cancelledExitCode={OCI_CANCELLED_EXIT_CODE} + onComplete={(exitCode) => { ociCompletionCodeRef.current = exitCode }} + title={ociAction.action === "update" ? t(ociAction.recoverPrevious + ? "vmLxc.ociUpdates.terminalTitleRecoverPrevious" : "vmLxc.ociUpdates.terminalTitleUpdate") : ociAction.action === "recover" ? t("vmLxc.ociUpdates.terminalTitleRecover") : t("vmLxc.ociUpdates.terminalTitleModify")} description={t("vmLxc.ociUpdates.terminalDescription")} diff --git a/AppImage/lib/host-backup-messages.ts b/AppImage/lib/host-backup-messages.ts new file mode 100644 index 00000000..6129df23 --- /dev/null +++ b/AppImage/lib/host-backup-messages.ts @@ -0,0 +1,141 @@ +// Legacy HostBackup API messages are an English wire contract shared with CLI callers. +// Match complete, source-verified messages only; never derive a translation key from input. +// This presentation-only adapter keeps unknown tool diagnostics and parameter text intact. +type Translate = (key: string, params?: Record) => string + +const fixed = new Map([ + ["path must be absolute", "backup.apiErrors.absolutePath"], + ["this path is already configured", "backup.apiErrors.pathConfigured"], + ["path is required", "backup.apiErrors.pathRequired"], + ["path query parameter is required", "backup.apiErrors.pathQuery"], + ["path not found", "backup.apiErrors.pathNotFound"], + ["invalid job id", "backup.apiErrors.invalidJobId"], + ["job not found", "backup.apiErrors.jobNotFound"], + ["runner script not installed", "backup.apiErrors.runnerMissing"], + ["no restore state to dismiss", "backup.apiErrors.noRestore"], + ["invalid file name", "backup.apiErrors.invalidFile"], + ["not found", "backup.apiErrors.notFound"], + ["log path outside allowed directory", "backup.apiErrors.logOutside"], + ["targets must be a list", "backup.apiErrors.targetsList"], + ["empty expression", "backup.apiErrors.emptyExpression"], + ["invalid id (use letters, digits, _ or -)", "backup.apiErrors.invalidId"], + ["backend must be pbs, local or borg", "backup.apiErrors.backend"], + ["backend must be pbs or borg", "backup.apiErrors.remoteBackend"], + ["backend must be 'pbs' or 'borg'", "backup.apiErrors.remoteBackendQuoted"], + ["profile_mode must be default or custom", "backup.apiErrors.profileMode"], + ["borg cannot be attached (PVE vzdump only writes to pbs/local storages)", "backup.apiErrors.borgAttached"], + ["borg is not a valid backend for attached jobs (PVE vzdump only writes to pbs/local storages)", "backup.apiErrors.borgAttachedLong"], + ["pve_parent_job_id and pve_storage are required for attached", "backup.apiErrors.parentRequired"], + ["paths must be a list of absolute paths", "backup.apiErrors.absolutePaths"], + ["custom profile needs at least one path", "backup.apiErrors.customPath"], + ["could not resolve default profile paths", "backup.apiErrors.defaultPaths"], + ["retention must be an object", "backup.apiErrors.retentionObject"], + ["pbs_repository is required", "backup.apiErrors.pbsRepository"], + ["pbs_encrypt_mode must be 'none', 'new' or 'existing'", "backup.apiErrors.pbsEncryption"], + ["failed to create PBS encryption keyfile", "backup.apiErrors.pbsKeyFailed"], + ["failed to create PBS encryption keyfile (is proxmox-backup-client installed?)", "backup.apiErrors.pbsClientMissing"], + ["borg_repo is required", "backup.apiErrors.borgRepository"], + ["borg_encrypt_mode must be one of: none, repokey, keyfile, authenticated", "backup.apiErrors.borgEncryption"], + ["encrypt_mode must be one of: none, repokey, keyfile, authenticated", "backup.apiErrors.encryption"], + ["borg_passphrase is required when encryption is enabled (save it on the destination or pass one in the request)", "backup.apiErrors.borgPassphrase"], + ["passphrase is required when encryption is enabled", "backup.apiErrors.passphrase"], + ["password is required", "backup.apiErrors.password"], + ["confirm_device must match device exactly (typo / safety check)", "backup.apiErrors.deviceConfirmation"], + ["invalid device path", "backup.apiErrors.invalidDevice"], + ["absolute mountpoint required", "backup.apiErrors.absoluteMountpoint"], + ["archive layout not recognized — no rootfs/ found", "backup.apiErrors.archiveLayout"], + ["archive not found", "backup.apiErrors.archiveMissing"], + ["archive path is not a regular file", "backup.apiErrors.archiveNotFile"], + ["invalid name", "backup.apiErrors.invalidName"], + ["invalid staging_path", "backup.apiErrors.invalidStaging"], + ["job name cannot be changed (delete + recreate to rename)", "backup.apiErrors.jobRename"], + ["key_path must be absolute", "backup.apiErrors.absoluteKey"], + ["mode must be \"local\" or \"ssh\"", "backup.apiErrors.mode"], + ["name is required (letters, digits, _ or -)", "backup.apiErrors.nameRequired"], + ["no log available for this job yet", "backup.apiErrors.noLog"], + ["no manual PBS configs file", "backup.apiErrors.noPbsConfig"], + ["output file missing", "backup.apiErrors.outputMissing"], + ["parser output was not valid JSON", "backup.apiErrors.parserJson"], + ["run_restore output was not valid JSON", "backup.apiErrors.restoreJson"], + ["repo is required", "backup.apiErrors.repoRequired"], + ["repo_name and snapshot are required", "backup.apiErrors.repoSnapshot"], + ["repo_name and snapshot are required for borg", "backup.apiErrors.borgRepoSnapshot"], + ["repo_name and snapshot are required for pbs", "backup.apiErrors.pbsRepoSnapshot"], + ["repo_name is required", "backup.apiErrors.repoName"], + ["restore tooling not installed on this host", "backup.apiErrors.restoreMissing"], + ["server and datastore are required", "backup.apiErrors.serverDatastore"], + ["snapshot is required", "backup.apiErrors.snapshotRequired"], + ["source must be pbs, borg, or local", "backup.apiErrors.source"], + ["ssh_port must be an integer between 1 and 65535", "backup.apiErrors.sshPort"], + ["ssh_user, ssh_host and ssh_remote_path are required for ssh mode", "backup.apiErrors.sshRequired"], + ["target has no repository path", "backup.apiErrors.repositoryPath"], + ["task not found or expired", "backup.apiErrors.taskExpired"], + ["invalid expression", "backup.apiErrors.invalidExpression"], + ["no report emitted", "backup.apiErrors.noReport"], + ["parse_manifest exited non-zero", "backup.apiErrors.parseManifestFailed"], +]) + +const parameterized: ReadonlyArray = [ + [new RegExp("^job already exists: ([\\s\\S]+)$"), "backup.apiErrors.jobExists"], + [new RegExp("^path does not exist on this host: ([\\s\\S]+)$"), "backup.apiErrors.pathMissing"], + [new RegExp("^device does not exist: ([\\s\\S]+)$"), "backup.apiErrors.deviceMissing"], + [new RegExp("^not a mountpoint: ([\\s\\S]+)$"), "backup.apiErrors.mountpoint"], + [new RegExp("^local archive not found: ([\\s\\S]+)$"), "backup.apiErrors.localArchiveMissing"], + [new RegExp("^Borg destination '([\\s\\S]+)' not found$"), "backup.apiErrors.borgDestination"], + [new RegExp("^PBS destination '([\\s\\S]+)' not found$"), "backup.apiErrors.pbsDestination"], + [new RegExp("^no password available for PBS repo '([\\s\\S]+)'$"), "backup.apiErrors.pbsPassword"], + [new RegExp("^Borg repo \"([\\s\\S]+)\" not configured$"), "backup.apiErrors.borgRepoMissing"], + [new RegExp("^PBS repo \"([\\s\\S]+)\" not configured$"), "backup.apiErrors.pbsRepoMissing"], + [new RegExp("^Borg target not found: ([\\s\\S]+)$"), "backup.apiErrors.borgTargetMissing"], + [new RegExp("^PBS repo not found: ([\\s\\S]+)$"), "backup.apiErrors.pbsTargetMissing"], + [new RegExp("^PVE vzdump job not found: ([\\s\\S]+)$"), "backup.apiErrors.pveJobMissing"], + [new RegExp("^cannot persist state: ([\\s\\S]+)$"), "backup.apiErrors.statePersist"], + [new RegExp("^cannot prepare ssh dir: ([\\s\\S]+)$"), "backup.apiErrors.sshDirectory"], + [new RegExp("^cannot read log: ([\\s\\S]+)$"), "backup.apiErrors.logRead"], + [new RegExp("^could not update \\.env: ([\\s\\S]+)$"), "backup.apiErrors.envUpdate"], + [new RegExp("^failed to persist PBS config: ([\\s\\S]+)$"), "backup.apiErrors.pbsConfigWrite"], + [new RegExp("^failed to persist: ([\\s\\S]+)$"), "backup.apiErrors.persist"], + [new RegExp("^failed to remove archive: ([\\s\\S]+)$"), "backup.apiErrors.archiveRemove"], + [new RegExp("^failed to start: ([\\s\\S]+)$"), "backup.apiErrors.start"], + [new RegExp("^failed to update borg-targets\\.txt: ([\\s\\S]+)$"), "backup.apiErrors.borgTargetsUpdate"], + [new RegExp("^failed to update pbs-manual-configs\\.txt: ([\\s\\S]+)$"), "backup.apiErrors.pbsTargetsUpdate"], + [new RegExp("^failed to update systemd units: ([\\s\\S]+)$"), "backup.apiErrors.unitsUpdate"], + [new RegExp("^failed to write borg-targets\\.txt: ([\\s\\S]+)$"), "backup.apiErrors.borgTargetsWrite"], + [new RegExp("^failed to write job files: ([\\s\\S]+)$"), "backup.apiErrors.jobWrite"], + [new RegExp("^failed to write local-target\\.conf: ([\\s\\S]+)$"), "backup.apiErrors.localTargetWrite"], + [new RegExp("^failed to write systemd units: ([\\s\\S]+)$"), "backup.apiErrors.unitsWrite"], + [new RegExp("^format failed: ([\\s\\S]+)$"), "backup.apiErrors.format"], + [new RegExp("^invalid on_calendar: ([\\s\\S]+)$"), "backup.apiErrors.calendar"], + [new RegExp("^mount failed: ([\\s\\S]+)$"), "backup.apiErrors.mount"], + [new RegExp("^parser invocation failed: ([\\s\\S]+)$"), "backup.apiErrors.parserInvocation"], + [new RegExp("^preflight invocation failed: ([\\s\\S]+)$"), "backup.apiErrors.preflightInvocation"], + [new RegExp("^public key not found after generation: ([\\s\\S]+)$"), "backup.apiErrors.publicKeyMissing"], + [new RegExp("^retention\\.([\\s\\S]+) must be an integer$"), "backup.apiErrors.retentionInteger"], + [new RegExp("^retention\\.([\\s\\S]+) must be non-negative$"), "backup.apiErrors.retentionNegative"], + [new RegExp("^ssh-keygen failed: ([\\s\\S]+)$"), "backup.apiErrors.keygen"], + [new RegExp("^systemctl failed: ([\\s\\S]+)$"), "backup.apiErrors.systemctl"], + [new RegExp("^umount failed: ([\\s\\S]+)$"), "backup.apiErrors.unmount"], + [new RegExp("^task is in state \"([\\s\\S]+)\", not completed$"), "backup.apiErrors.taskIncomplete"], + [new RegExp("^unknown kind: ([\\s\\S]+)$"), "backup.apiErrors.unknownKind"], + [new RegExp("^unknown mode \"([\\s\\S]+)\"$"), "backup.apiErrors.unknownMode"], + [new RegExp("^([\\s\\S]+) is the built-in default and cannot be removed$"), "backup.apiErrors.defaultRemove"], + [new RegExp("^([\\s\\S]+) is the built-in default; no need to add it$"), "backup.apiErrors.defaultAdd"], + [new RegExp("^pbs_encrypt_mode='existing' but no keyfile is installed at ([\\s\\S]+) — import one first with POST /api/host-backups/pbs-encryption/import$"), "backup.apiErrors.keyImport"], + [new RegExp("^PVE job storage mismatch \\(job uses ([\\s\\S]+), payload says ([\\s\\S]+)\\)$"), "backup.apiErrors.storageMismatch"], +] + +export function hostBackupErrorText(problem: unknown, t: Translate): string { + const message = typeof problem === "string" ? problem + : problem && typeof problem === "object" && "message" in problem && typeof problem.message === "string" + ? problem.message : "" + if (!message) return t("backup.apiErrors.requestFailed") + const key = fixed.get(message) + if (key) return t(key) + // Keep unusually large tool output verbatim, without running pattern matching over it. + if (message.length > 16384) return message + for (const [pattern, patternKey] of parameterized) { + const match = pattern.exec(message) + if (match) return t(patternKey, { value: match[1], other: match[2] ?? "" }) + } + return message +} diff --git a/AppImage/lib/lxc-app-editor-errors.ts b/AppImage/lib/lxc-app-editor-errors.ts new file mode 100644 index 00000000..f1a2a5eb --- /dev/null +++ b/AppImage/lib/lxc-app-editor-errors.ts @@ -0,0 +1,130 @@ +type Translate = (key: string, params?: Record) => string + +// Exact lxc_apps validation/persistence messages; never change their API contract. +// Anchored patterns leave unknown diagnostics intact, including paths and commands. +const RULES: [RegExp, string, string[]][] = [ + [/^an OCI operation on this container is running$/, "ociBusy", []], + [/^([\s\S]+) is not installed via dpkg$/, "dpkgMissing", ["package"]], + [/^dpkg\-query failed$/, "dpkgFailed", []], + [/^no version matched in dpkg output$/, "dpkgNoVersion", []], + [/^apk info failed$/, "apkFailed", []], + [/^no version matched in apk output$/, "apkNoVersion", []], + [/^could not read ([\s\S]+)$/, "fileRead", ["path"]], + [/^file_regex did not match ([\s\S]+)$/, "fileNoMatch", ["path"]], + [/^binary invocation failed$/, "binaryFailed", []], + [/^no version matched in binary output$/, "binaryNoVersion", []], + [/^python \-c importlib\.metadata failed$/, "pythonFailed", []], + [/^no version matched in Python distribution output$/, "pythonNoVersion", []], + [/^could not resolve the container's installed image$/, "dockerImageResolve", []], + [/^docker inspect failed$/, "dockerInspectFailed", []], + [/^container has no ([\s\S]+) label$/, "dockerLabelMissing", ["label"]], + [/^docker label reports ([\s\S]+) \(mutable tag, not a version\)$/, "dockerLabelMutable", ["tag"]], + [/^no version matched in docker label output$/, "dockerLabelNoVersion", []], + [/^docker exec failed$/, "dockerExecFailed", []], + [/^no version matched in docker exec output$/, "dockerExecNoVersion", []], + [/^command_argv is empty$/, "commandEmpty", []], + [/^command failed$/, "commandFailed", []], + [/^no version matched in command output$/, "commandNoVersion", []], + [/^unsupported method: ([\s\S]+)$/, "unsupportedMethod", ["method"]], + [/^unknown upstream_type: ([\s\S]+)$/, "unknownUpstream", ["type"]], + [/^([A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+): not found$/, "githubNotFound", ["repo"]], + [/^github rejected the request \(403\)$/, "githubRejected", []], + [/^github error (\d+)$/, "githubError", ["code"]], + [/^no tag \/ release name in response$/, "noRelease", []], + [/^tag_regex did not match '([\s\S]+)'$/, "tagNoMatch", ["tag"]], + [/^http error (\d+)$/, "httpError", ["code"]], + [/^invalid JSON response: ([\s\S]+)$/, "invalidJson", ["detail"]], + [/^json_path '([\s\S]+)' did not resolve$/, "jsonPathUnresolved", ["path"]], + [/^empty value at json_path$/, "jsonEmpty", []], + [/^no tags matched \(docker_hub\)$/, "dockerNoTags", []], + [/^tag_regex matched only moving tags; use Docker image digest tracking$/, "dockerMovingOnly", []], + [/^docker hub error (\d+)$/, "dockerHubError", ["code"]], + [/^invalid docker hub JSON: ([\s\S]+)$/, "dockerHubJson", ["detail"]], + [/^no tags returned by docker hub$/, "dockerHubEmpty", []], + [/^payload must be a JSON object$/, "payload", []], + [/^name is required and must be 1\-64 chars of letters\/digits\/spaces\/\._\+\-\(\)\/$/, "name", []], + [/^installed_via must be one of: ([\s\S]+) or empty$/, "method", ["values"]], + [/^package is required \(letters\/digits\/\._\+@:\/ up to 127 chars\)$/, "package", []], + [/^file_path is required and must be an absolute path$/, "filePath", []], + [/^file_regex is required$/, "fileRegex", []], + [/^file_regex is not a valid regex: ([\s\S]+)$/, "fileRegexInvalid", ["detail"]], + [/^binary_path is required and must be an absolute path$/, "binaryPath", []], + [/^python_path is required and must be an absolute path$/, "pythonPath", []], + [/^distribution is required \(PEP 503 name\)$/, "distribution", []], + [/^container_name is required \(docker naming rules\)$/, "container", []], + [/^label is required \(OCI label naming rules\)$/, "label", []], + [/^binary_path is required \(absolute path or bare command\)$/, "dockerBinary", []], + [/^installed_version is required for the manual method$/, "manualVersion", []], + [/^installed_version exceeds (\d+) chars$/, "versionLength", ["max"]], + [/^installed_version contains a forbidden control character$/, "versionControl", []], + [/^installed_regex is not a valid regex: ([\s\S]+)$/, "installedRegexInvalid", ["detail"]], + [/^upstream_type must be one of: ([\s\S]+)$/, "upstreamType", ["values"]], + [/^tag_regex is not a valid regex: ([\s\S]+)$/, "tagRegexInvalid", ["detail"]], + [/^repo is required for upstream_type=github$/, "repoRequired", []], + [/^repo must be 'owner\/name'$/, "repoFormat", []], + [/^github_source must be one of: ([\s\S]+)$/, "githubSource", ["values"]], + [/^upstream_url is required for upstream_type=http_json$/, "upstreamUrlRequired", []], + [/^upstream_url must be an http\(s\) URL$/, "upstreamUrl", []], + [/^upstream_url exceeds (\d+) chars$/, "upstreamUrlLength", ["max"]], + [/^upstream_json_path is required for upstream_type=http_json$/, "jsonPathRequired", []], + [/^upstream_json_path exceeds (\d+) chars$/, "jsonPathLength", ["max"]], + [/^upstream_json_path uses forbidden characters$/, "jsonPathCharacters", []], + [/^docker_image is required for upstream_type=docker_hub$/, "dockerImageRequired", []], + [/^docker_image exceeds (\d+) chars$/, "dockerImageLength", ["max"]], + [/^docker_image must match Docker Hub naming \(owner\/name or name\)$/, "dockerImageFormat", []], + [/^health_path must be a valid URL path \(max 255 chars\)$/, "healthPath", []], + [/^logo_url must be an http\(s\) URL or this VM's cached local icon$/, "logoUrl", []], + [/^invalid discovery_id$/, "discoveryId", []], + [/^helper_slug must be a lowercase slug \(letters\/digits\/\._\-\)$/, "helperSlug", []], + [/^update_via only accepts 'docker'$/, "updateVia", []], + [/^update_via=docker requires a docker_label or docker_exec detector$/, "dockerDetector", []], + [/^update_via=docker cannot be combined with ([\s\S]+)$/, "dockerConflict", ["field"]], + [/^update_command must be a string$/, "updateCommandType", []], + [/^update_command exceeds (\d+) chars$/, "updateCommandLength", ["max"]], + [/^update_command contains a null byte$/, "updateCommandNull", []], + [/^update_method must be none, helper or custom$/, "updateMethod", []], + [/^update_command is required for update_method=custom$/, "updateCommandRequired", []], + [/^update_command is only allowed for update_method=custom$/, "updateCommandOnlyCustom", []], + [/^a supported helper_slug is required for update_method=helper$/, "helperRequired", []], + [/^Docker\-delegated apps update through their image, not a separate app updater$/, "dockerUpdater", []], + [/^command_argv is required \(non\-empty list\)$/, "commandRequired", []], + [/^command_argv must be a non\-empty list of strings$/, "commandList", []], + [/^command_argv accepts at most (\d+) entries$/, "commandCount", ["max"]], + [/^command_argv\[(\d+)\] must be a non\-empty string$/, "commandEntry", ["index"]], + [/^command_argv\[(\d+)\] exceeds (\d+) chars$/, "commandEntryLength", ["index", "max"]], + [/^command_argv\[(\d+)\] contains a forbidden control character$/, "commandEntryControl", ["index"]], + [/^binary_args must be a list of strings$/, "binaryArgsList", []], + [/^binary_args accepts at most (\d+) entries$/, "binaryArgsCount", ["max"]], + [/^binary_args\[(\d+)\] must be a non\-empty string$/, "binaryArgEntry", ["index"]], + [/^binary_args\[(\d+)\] exceeds (\d+) chars$/, "binaryArgLength", ["index", "max"]], + [/^binary_args\[(\d+)\] contains a forbidden control character$/, "binaryArgControl", ["index"]], + [/^ports must be a list of \{port, description, scheme\}$/, "portsList", []], + [/^ports\[(\d+)\] must be an object$/, "portObject", ["index"]], + [/^ports\[(\d+)\]\.port is required$/, "portRequired", ["index"]], + [/^ports\[(\d+)\]\.port must be an integer$/, "portInteger", ["index"]], + [/^ports\[(\d+)\]\.port must be 1\-65535$/, "portRange", ["index"]], + [/^port (\d+) appears more than once for this app$/, "portDuplicate", ["port"]], + [/^ports\[(\d+)\]\.description has invalid characters$/, "portDescription", ["index"]], + [/^ports\[(\d+)\]\.scheme must be 'http' or 'https'$/, "portScheme", ["index"]], + [/^ports\[(\d+)\]\.web_path must be a valid URL path \(max 255 chars\)$/, "portPath", ["index"]], + [/^ports\[(\d+)\]\.logo_url must be an http\(s\) URL \(max 512 chars\)$/, "portLogo", ["index"]], + [/^ports\[(\d+)\]\.category has invalid characters or is too long$/, "portCategory", ["index"]], + [/^ports\[(\d+)\]\.custom_url must be an http\(s\) URL \(max 512 chars\)$/, "portCustomUrl", ["index"]], + [/^tag_regex exceeds 512 chars$/, "tagRegexLength", []], + [/^could not persist sidecar \(permission\?\)$/, "persistPermission", []], + [/^could not persist sidecar$/, "persist", []], + [/^no apps registered for this vmid$/, "noApps", []], + [/^app_id '([\s\S]+)' not found$/, "appMissing", ["appId"]], + [/^app not found$/, "appNotFound", []], +] + +export function localizeAppEditorError(message: string | null | undefined, t: Translate): string { + if (!message) return "" + for (const [pattern, key, names] of RULES) { + const match = pattern.exec(message) + if (!match) continue + const params = Object.fromEntries(names.map((name, index) => [name, match[index + 1]])) + return t(`vmLxc.appEditor.errors.${key}`, params) + } + return message +} diff --git a/AppImage/lib/monitor-link-errors.ts b/AppImage/lib/monitor-link-errors.ts new file mode 100644 index 00000000..f186c227 --- /dev/null +++ b/AppImage/lib/monitor-link-errors.ts @@ -0,0 +1,29 @@ +type Translate = (key: string, params?: Record) => string + +const ERROR_KEYS: Record = { + monitor_link_address_required: "addressRequired", + monitor_link_invalid_address: "invalidAddress", + monitor_link_address_credentials: "addressCredentials", + monitor_link_invalid_port: "invalidPort", + monitor_link_invalid_request: "invalidRequest", + monitor_link_duplicate: "duplicate", + monitor_link_not_found: "notFound", + monitor_link_detected_remove: "detectedRemove", +} + +// fetchApi preserves the structured response on Error.body. Never expose raw +// server/network messages or treat arbitrary error codes as translation keys. +export function monitorLinkError(error: unknown, t: Translate): string { + const fallback = () => t("monitorLinks.saveFailed") + if (!error || typeof error !== "object" || !("body" in error)) return fallback() + const body = error.body + if (!body || typeof body !== "object" || !("code" in body) || typeof body.code !== "string") return fallback() + if (body.code === "monitor_link_limit") { + const params = "params" in body ? body.params : null + const count = params && typeof params === "object" && "count" in params ? params.count : null + return typeof count === "number" && Number.isSafeInteger(count) && count > 0 + ? t("monitorLinks.errors.limit", { count }) : fallback() + } + return Object.prototype.hasOwnProperty.call(ERROR_KEYS, body.code) + ? t(`monitorLinks.errors.${ERROR_KEYS[body.code]}`) : fallback() +} diff --git a/AppImage/lib/optimization-source-errors.ts b/AppImage/lib/optimization-source-errors.ts new file mode 100644 index 00000000..fffd13bc --- /dev/null +++ b/AppImage/lib/optimization-source-errors.ts @@ -0,0 +1,39 @@ +type Translate = (key: string, params?: Record) => string + +const SOURCE_TOOLS = new Set([ + "subscription_banner", "time_sync", "apt_languages", "journald", "logrotate", + "system_limits", "memory_settings", "zram_swap", "kernel_panic", "apt_ipv4", + "kexec", "rpc", "motd", "system_utils", "network_optimization", "bashrc_custom", + "figurine", "fastfetch", "log2ram", "zfs_autotrim", "amd_fixes", "persistent_network", + "vfio_iommu", "lvm_repair", "repo_cleanup", "proxmox_repos", "entropy", +]) + +export function optimizationSourceName(tool: string, fallback: string, t: Translate): string { + return SOURCE_TOOLS.has(tool) ? t(`settings.optimizations.sourceToolNames.${tool}`) : fallback +} + +export interface OptimizationSourceError { + kind: "unavailable" | "loadFailed" + detail?: string +} + +export interface OptimizationSourceResponse { + success?: unknown + source?: unknown + function?: unknown + script?: unknown + deprecated?: unknown + error?: unknown +} + +// Keep the blueprint's English API contract intact; translate only its display. +export function optimizationSourceError(error: OptimizationSourceError, t: Translate): string { + const detail = error.detail || "" + const key = "settings.optimizations." + if (detail === "Function not found in available scripts") return t(key + "sourceFunctionMissing") + if (detail.startsWith("Unknown tool: ")) return t(key + "sourceUnknownTool", { tool: detail.slice(14) }) + if (detail.startsWith("No function mapping for ")) return t(key + "sourceNoMapping", { tool: detail.slice(24) }) + if (detail === "Source code not available") return t(key + "sourceUnavailable") + const message = t(key + (error.kind === "unavailable" ? "sourceUnavailable" : "sourceLoadFailed")) + return detail ? `${message} ${detail}` : message +} diff --git a/AppImage/lib/pbs-messages.ts b/AppImage/lib/pbs-messages.ts new file mode 100644 index 00000000..6314d317 --- /dev/null +++ b/AppImage/lib/pbs-messages.ts @@ -0,0 +1,85 @@ +type Translate = (key: string, params?: Record) => string + +const ERROR_KEYS: Record = { + pbs_config_read: "pbs.errors.configRead", pbs_invalid_config: "pbs.errors.invalidConfig", + pbs_invalid_field: "pbs.errors.invalidField", pbs_invalid_url: "pbs.errors.invalidUrl", + pbs_name_required: "pbs.errors.nameRequired", pbs_token_id_format: "pbs.errors.tokenIdFormat", + pbs_token_secret: "pbs.errors.tokenSecret", pbs_invalid_token_id: "pbs.errors.invalidTokenId", + pbs_invalid_fingerprint: "pbs.errors.invalidFingerprint", pbs_fingerprint_mismatch: "pbs.errors.fingerprintMismatch", + pbs_token_rejected: "pbs.errors.tokenRejected", pbs_invalid_response: "pbs.errors.invalidResponse", + pbs_invalid_json: "pbs.errors.invalidJson", pbs_connect_failed: "pbs.errors.connectFailed", + pbs_invalid_id: "pbs.errors.invalidId", pbs_invalid_datastores: "pbs.errors.invalidDatastores", + pbs_username: "pbs.errors.username", pbs_password: "pbs.errors.password", + pbs_login_rejected: "pbs.errors.loginRejected", pbs_invalid_login: "pbs.errors.invalidLogin", + pbs_token_create_denied: "pbs.errors.tokenCreateDenied", pbs_invalid_token: "pbs.errors.invalidToken", + pbs_audit_role_denied: "pbs.errors.auditRoleDenied", pbs_not_found: "pbs.errors.notFound", + pbs_read_failed: "pbs.errors.readFailed", pbs_invalid_list: "pbs.errors.invalidList", + pbs_local_unavailable: "pbs.errors.localUnavailable", pbs_auth_required: "pbs.errors.authRequired", + pbs_save_failed: "pbs.saveFailed", pbs_remove_failed: "pbs.removeFailed", + pbs_saved_refresh_failed: "pbs.savedRefreshFailed", pbs_removed_refresh_failed: "pbs.removedRefreshFailed", + pbs_datastore_offline: "pbs.errors.datastoreOffline", pbs_datastore_unavailable: "pbs.errors.datastoreUnavailable", +} + +// Accept structured codes, never arbitrary error text as a translation key. +function pbsErrorTranslation(error: unknown): { key: string; params?: { count: number } } | null { + const body = error && typeof error === "object" && "body" in error ? error.body : error + if (!body || typeof body !== "object" || !("code" in body) || typeof body.code !== "string") return null + if (body.code === "pbs_connection_limit") { + const params = "params" in body ? body.params : null + const count = params && typeof params === "object" && "count" in params ? params.count : null + return typeof count === "number" && Number.isSafeInteger(count) && count > 0 + ? { key: "pbs.errors.connectionLimit", params: { count } } : null + } + return Object.prototype.hasOwnProperty.call(ERROR_KEYS, body.code) ? { key: ERROR_KEYS[body.code] } : null +} + +export function pbsIsKnownError(error: unknown): boolean { + return pbsErrorTranslation(error) !== null +} + +export function pbsErrorText(error: unknown, t: Translate, fallback = "pbs.loadFailed"): string { + const translated = pbsErrorTranslation(error) + return translated ? t(translated.key, translated.params) : t(fallback) +} + +export function pbsDiagnostic(error: unknown): string | undefined { + if (!error || typeof error !== "object") return undefined + const body = "body" in error ? error.body : null + if (body && typeof body === "object" && "error" in body && typeof body.error === "string") return body.error + return "message" in error && typeof error.message === "string" ? error.message : undefined +} + +const TASK_TYPES: Record = { + backup: "backup", reader: "restore", verify: "verify", verificationjob: "verify", + verify_group: "verifyGroup", verify_snapshot: "verifySnapshot", prune: "prune", prunejob: "prune", + garbage_collection: "garbageCollection", sync: "sync", syncjob: "sync", aptupdate: "updateCheck", + termproxy: "terminal", dircreate: "createDatastore", "create-datastore": "createDatastore", +} +export function pbsTaskType(type: string | undefined, t: Translate): string { + return type && Object.prototype.hasOwnProperty.call(TASK_TYPES, type) + ? t(`pbs.taskTypes.${TASK_TYPES[type]}`) : t("pbs.taskTypes.other", { type: type || "—" }) +} + +export function pbsResultText(status: string | undefined, t: Translate): string { + if (!status || status === "unknown") return t("pbs.states.unknown") + if (status.toLowerCase() === "ok") return t("pbs.states.ok") + const warnings = /^WARNINGS:\s*(\d+)\s*$/i.exec(status) + if (warnings && Number.isSafeInteger(Number(warnings[1]))) return t("pbs.states.warnings", { count: Number(warnings[1]) }) + return /^warn/i.test(status) ? t("pbs.states.warning") : t("pbs.states.error") +} + +export function pbsServiceState(state: string, t: Translate): string { + const known = ["active", "inactive", "failed", "activating", "deactivating", "unknown"] + return t(`pbs.serviceStates.${known.includes(state) ? state : "unknown"}`) +} + +export function formatPBSDuration(seconds: number, t: Translate): string { + if (!Number.isFinite(seconds) || seconds < 0) return "—" + const unit = (key: string, count: number) => t(`pbs.durationUnits.${key}`, { count }) + if (seconds < 60) return unit("seconds", Math.round(seconds)) + const minutes = Math.floor(seconds / 60) + if (minutes < 60) return `${unit("minutes", minutes)} ${unit("seconds", Math.round(seconds % 60))}` + const hours = Math.floor(minutes / 60) + return hours < 24 ? `${unit("hours", hours)} ${unit("minutes", minutes % 60)}` + : `${unit("days", Math.floor(hours / 24))} ${unit("hours", hours % 24)}` +} diff --git a/AppImage/lib/script-completion.ts b/AppImage/lib/script-completion.ts new file mode 100644 index 00000000..18070de5 --- /dev/null +++ b/AppImage/lib/script-completion.ts @@ -0,0 +1,22 @@ +// Native OCI `manage` reserves this code for explicit user cancellation. +export const OCI_CANCELLED_EXIT_CODE = 6 + +export function scriptCompletion(exitCode: number, cancelledExitCode?: number) { + if (exitCode === 0) return { kind: "success", color: "32" } as const + if (cancelledExitCode !== undefined && exitCode === cancelledExitCode) { + return { kind: "cancelled", color: "36" } as const + } + return { kind: "error", color: "31" } as const +} + +export function shouldRefreshOciAfterCompletion(exitCode?: number) { + return exitCode !== OCI_CANCELLED_EXIT_CODE +} + +export function scriptCompletionOutput(exitCode: number, message: string, cancelledExitCode?: number) { + const completion = scriptCompletion(exitCode, cancelledExitCode) + // Queue RIS with the result so earlier ncurses writes finish before reset. + // A synchronous terminal.reset() could be overwritten by that pending output. + const reset = completion.kind === "cancelled" ? "\x1bc" : "" + return `${reset}\x1b[${completion.color}m${message}\x1b[0m` +} diff --git a/AppImage/messages/de/common.json b/AppImage/messages/de/common.json index 870a21ea..56b803d0 100644 --- a/AppImage/messages/de/common.json +++ b/AppImage/messages/de/common.json @@ -1231,7 +1231,9 @@ "update": "Aktualisieren", "modify": "Ändern", "recover": "Wiederherstellen", + "registerRestored": "Erneut registrieren", "terminalTitleUpdate": "OCI-Anwendung aktualisieren", + "terminalTitleRecoverPrevious": "Vorherige OCI-Installation wiederherstellen", "terminalTitleModify": "OCI-Anwendung ändern", "terminalTitleRecover": "Wiederhergestellte OCI-Anwendung registrieren", "terminalDescription": "Es läuft derselbe Vorgang wie im ProxMenux-Menü: OCI manager Apps → Installierte OCI-Anwendungen verwalten.", @@ -1760,7 +1762,128 @@ "dockerEvidenceImage": "Image", "dockerEvidencePort": "Veröffentlichter TCP-Port", "dockerEvidenceProject": "Compose-Projekt", - "dockerEndpointReview": "Container mit veröffentlichten TCP-Ports. Bestätigen Sie Namen und Webadresse vor dem Speichern. Die Registrierung richtet keine Updates ein." + "dockerEndpointReview": "Container mit veröffentlichten TCP-Ports. Bestätigen Sie Namen und Webadresse vor dem Speichern. Die Registrierung richtet keine Updates ein.", + "confirmRemove": "Den Eintrag dieser Anwendung aus der Registerkarte App entfernen? Die Anwendung wird dadurch nicht deinstalliert.", + "packageExample": "z. B. {package}", + "packageHelpBefore": "Automatisch aus dem Namen ausgefüllt. Prüfen Sie dies mit", + "packageHelpAfter": "innerhalb des CT.", + "binaryHelpBefore": "Absoluter Pfad. Ermitteln Sie ihn mit", + "binaryHelpOr": "oder", + "errors": { + "ociBusy": "ein OCI-Vorgang an diesem Container läuft", + "dpkgMissing": "{package} ist nicht über dpkg installiert", + "dpkgFailed": "dpkg-query ist fehlgeschlagen", + "dpkgNoVersion": "keine passende Version in der dpkg-Ausgabe", + "apkFailed": "apk info ist fehlgeschlagen", + "apkNoVersion": "keine passende Version in der apk-Ausgabe", + "fileRead": "{path} konnte nicht gelesen werden", + "fileNoMatch": "file_regex hat in {path} keine Übereinstimmung gefunden", + "binaryFailed": "Aufruf der Binärdatei fehlgeschlagen", + "binaryNoVersion": "keine passende Version in der Ausgabe der Binärdatei", + "pythonFailed": "python -c importlib.metadata ist fehlgeschlagen", + "pythonNoVersion": "keine passende Version in der Ausgabe der Python-Distribution", + "dockerImageResolve": "das installierte Image des Containers konnte nicht ermittelt werden", + "dockerInspectFailed": "docker inspect ist fehlgeschlagen", + "dockerLabelMissing": "der Container hat kein Label {label}", + "dockerLabelMutable": "das Docker-Label meldet {tag} (veränderlicher Tag, keine Version)", + "dockerLabelNoVersion": "keine passende Version in der Ausgabe des Docker-Labels", + "dockerExecFailed": "docker exec ist fehlgeschlagen", + "dockerExecNoVersion": "keine passende Version in der Ausgabe von docker exec", + "commandEmpty": "command_argv ist leer", + "commandFailed": "Befehl fehlgeschlagen", + "commandNoVersion": "keine passende Version in der Befehlsausgabe", + "unsupportedMethod": "nicht unterstützte Methode: {method}", + "unknownUpstream": "unbekannter upstream_type: {type}", + "githubNotFound": "{repo}: nicht gefunden", + "githubRejected": "GitHub hat die Anfrage abgelehnt (403)", + "githubError": "GitHub-Fehler {code}", + "noRelease": "kein Tag / Release-Name in der Antwort", + "tagNoMatch": "tag_regex passt nicht auf '{tag}'", + "httpError": "HTTP-Fehler {code}", + "invalidJson": "ungültige JSON-Antwort: {detail}", + "jsonPathUnresolved": "json_path '{path}' konnte nicht aufgelöst werden", + "jsonEmpty": "leerer Wert bei json_path", + "dockerNoTags": "keine passenden Tags (docker_hub)", + "dockerMovingOnly": "tag_regex passt nur auf bewegliche Tags; verwenden Sie die Digest-Verfolgung der Docker-Images", + "dockerHubError": "Docker-Hub-Fehler {code}", + "dockerHubJson": "ungültiges JSON von Docker Hub: {detail}", + "dockerHubEmpty": "Docker Hub hat keine Tags zurückgegeben", + "payload": "die Nutzdaten müssen ein JSON-Objekt sein", + "name": "name ist erforderlich und muss 1-64 Zeichen aus Buchstaben/Ziffern/Leerzeichen/._+-()/ enthalten", + "method": "installed_via muss einer der folgenden Werte sein: {values} oder leer", + "package": "package ist erforderlich (Buchstaben/Ziffern/._+@:/ bis zu 127 Zeichen)", + "filePath": "file_path ist erforderlich und muss ein absoluter Pfad sein", + "fileRegex": "file_regex ist erforderlich", + "fileRegexInvalid": "file_regex ist kein gültiger regulärer Ausdruck: {detail}", + "binaryPath": "binary_path ist erforderlich und muss ein absoluter Pfad sein", + "pythonPath": "python_path ist erforderlich und muss ein absoluter Pfad sein", + "distribution": "distribution ist erforderlich (Name nach PEP 503)", + "container": "container_name ist erforderlich (Docker-Namensregeln)", + "label": "label ist erforderlich (OCI-Namensregeln für Labels)", + "dockerBinary": "binary_path ist erforderlich (absoluter Pfad oder bloßer Befehl)", + "manualVersion": "installed_version ist für die manuelle Methode erforderlich", + "versionLength": "installed_version überschreitet {max} Zeichen", + "versionControl": "installed_version enthält ein unzulässiges Steuerzeichen", + "installedRegexInvalid": "installed_regex ist kein gültiger regulärer Ausdruck: {detail}", + "upstreamType": "upstream_type muss einer der folgenden Werte sein: {values}", + "tagRegexInvalid": "tag_regex ist kein gültiger regulärer Ausdruck: {detail}", + "repoRequired": "repo ist für upstream_type=github erforderlich", + "repoFormat": "repo muss 'owner/name' sein", + "githubSource": "github_source muss einer der folgenden Werte sein: {values}", + "upstreamUrlRequired": "upstream_url ist für upstream_type=http_json erforderlich", + "upstreamUrl": "upstream_url muss eine http(s)-URL sein", + "upstreamUrlLength": "upstream_url überschreitet {max} Zeichen", + "jsonPathRequired": "upstream_json_path ist für upstream_type=http_json erforderlich", + "jsonPathLength": "upstream_json_path überschreitet {max} Zeichen", + "jsonPathCharacters": "upstream_json_path verwendet unzulässige Zeichen", + "dockerImageRequired": "docker_image ist für upstream_type=docker_hub erforderlich", + "dockerImageLength": "docker_image überschreitet {max} Zeichen", + "dockerImageFormat": "docker_image muss der Docker-Hub-Benennung entsprechen (owner/name oder name)", + "healthPath": "health_path muss ein gültiger URL-Pfad sein (max. 255 Zeichen)", + "logoUrl": "logo_url muss eine http(s)-URL oder das lokal zwischengespeicherte Symbol dieser VM sein", + "discoveryId": "ungültige discovery_id", + "helperSlug": "helper_slug muss ein Slug in Kleinbuchstaben sein (Buchstaben/Ziffern/._-)", + "updateVia": "update_via akzeptiert nur 'docker'", + "dockerDetector": "update_via=docker erfordert einen Detektor docker_label oder docker_exec", + "dockerConflict": "update_via=docker kann nicht mit {field} kombiniert werden", + "updateCommandType": "update_command muss eine Zeichenkette sein", + "updateCommandLength": "update_command überschreitet {max} Zeichen", + "updateCommandNull": "update_command enthält ein Null-Byte", + "updateMethod": "update_method muss none, helper oder custom sein", + "updateCommandRequired": "update_command ist für update_method=custom erforderlich", + "updateCommandOnlyCustom": "update_command ist nur für update_method=custom zulässig", + "helperRequired": "für update_method=helper ist ein unterstützter helper_slug erforderlich", + "dockerUpdater": "An Docker delegierte Apps werden über ihr Image aktualisiert, nicht über einen separaten App-Updater", + "commandRequired": "command_argv ist erforderlich (nicht leere Liste)", + "commandList": "command_argv muss eine nicht leere Liste von Zeichenketten sein", + "commandCount": "command_argv akzeptiert höchstens {max} Einträge", + "commandEntry": "command_argv[{index}] muss eine nicht leere Zeichenkette sein", + "commandEntryLength": "command_argv[{index}] überschreitet {max} Zeichen", + "commandEntryControl": "command_argv[{index}] enthält ein unzulässiges Steuerzeichen", + "binaryArgsList": "binary_args muss eine Liste von Zeichenketten sein", + "binaryArgsCount": "binary_args akzeptiert höchstens {max} Einträge", + "binaryArgEntry": "binary_args[{index}] muss eine nicht leere Zeichenkette sein", + "binaryArgLength": "binary_args[{index}] überschreitet {max} Zeichen", + "binaryArgControl": "binary_args[{index}] enthält ein unzulässiges Steuerzeichen", + "portsList": "ports muss eine Liste von {port, description, scheme} sein", + "portObject": "ports[{index}] muss ein Objekt sein", + "portRequired": "ports[{index}].port ist erforderlich", + "portInteger": "ports[{index}].port muss eine Ganzzahl sein", + "portRange": "ports[{index}].port muss zwischen 1 und 65535 liegen", + "portDuplicate": "Port {port} kommt für diese App mehrfach vor", + "portDescription": "ports[{index}].description enthält ungültige Zeichen", + "portScheme": "ports[{index}].scheme muss 'http' oder 'https' sein", + "portPath": "ports[{index}].web_path muss ein gültiger URL-Pfad sein (max. 255 Zeichen)", + "portLogo": "ports[{index}].logo_url muss eine http(s)-URL sein (max. 512 Zeichen)", + "portCategory": "ports[{index}].category enthält ungültige Zeichen oder ist zu lang", + "portCustomUrl": "ports[{index}].custom_url muss eine http(s)-URL sein (max. 512 Zeichen)", + "tagRegexLength": "tag_regex überschreitet 512 Zeichen", + "persistPermission": "Sidecar konnte nicht gespeichert werden (Berechtigung?)", + "persist": "Sidecar konnte nicht gespeichert werden", + "noApps": "für diese vmid sind keine Apps registriert", + "appMissing": "app_id '{appId}' nicht gefunden", + "appNotFound": "App nicht gefunden" + } }, "statusFilter": { "ariaLabel": "Virtuelle Maschinen und Container filtern", @@ -2294,6 +2417,42 @@ "updateManyDescription": "Wiederholen Sie die Nachinstallationsfunktionen von {count} nacheinander.", "legacySourceTitle": "Legacy-Optimierung – klicken Sie, um die Quelle anzuzeigen", "sourceTitle": "Klicken Sie hier, um den Quellcode anzuzeigen", + "sourceDialogTitle": "Quellcode: {name}", + "sourceLoading": "Quellcode wird geladen…", + "sourceUnavailable": "Der Quellcode ist nicht verfügbar.", + "sourceLoadFailed": "Der Quellcode konnte nicht geladen werden. Versuchen Sie es erneut.", + "sourceFunctionMissing": "Die Funktion wurde in den verfügbaren Skripten nicht gefunden.", + "sourceUnknownTool": "Unbekanntes Tool: {tool}", + "sourceNoMapping": "Dem Tool {tool} ist keine Funktion zugeordnet.", + "sourceToolNames": { + "subscription_banner": "Entfernung des Abonnementbanners", + "time_sync": "Zeitsynchronisierung", + "apt_languages": "APT-Sprachdateien überspringen", + "journald": "Journald-Optimierung", + "logrotate": "Logrotate-Optimierung", + "system_limits": "Erhöhung der Systemlimits", + "memory_settings": "Optimierung der Speichereinstellungen", + "zram_swap": "ZRAM-Swap-Profil", + "kernel_panic": "Konfiguration bei Kernel Panic", + "apt_ipv4": "APT IPv4 erzwingen", + "kexec": "kexec für schnelle Neustarts", + "rpc": "RPC / rpcbind deaktivieren", + "motd": "Benutzerdefiniertes MOTD-Banner", + "system_utils": "Systemdienstprogramme", + "network_optimization": "Netzwerkoptimierungen", + "bashrc_custom": "Bashrc-Anpassung", + "figurine": "Figurine", + "fastfetch": "Fastfetch", + "log2ram": "Log2ram (SSD-Schutz)", + "zfs_autotrim": "ZFS Autotrim", + "amd_fixes": "Korrekturen für AMD-CPUs (Ryzen/EPYC)", + "persistent_network": "Persistente Netzwerkschnittstellen festlegen", + "vfio_iommu": "VFIO/IOMMU-Passthrough", + "lvm_repair": "Reparatur der LVM-PV-Header", + "repo_cleanup": "Repository-Bereinigung", + "proxmox_repos": "Proxmox-APT-Repositorys", + "entropy": "Entropie-Erzeugung (haveged)" + }, "legacy": "Vermächtnis", "updateToolTitle": "Aktualisieren Sie {name} auf v{version}", "availableUpdates": "Verfügbare Updates", @@ -4820,6 +4979,124 @@ "cancel": "Abbrechen", "save": "Aufbewahrung speichern", "useDefault": "Proxmox-Standard verwenden (keine Richtlinie für diesen Speicher)" + }, + "apiErrors": { + "requestFailed": "Die Anfrage ist fehlgeschlagen.", + "absolutePath": "der Pfad muss absolut sein", + "pathConfigured": "dieser Pfad ist bereits konfiguriert", + "pathRequired": "der Pfad ist erforderlich", + "pathQuery": "der Abfrageparameter path ist erforderlich", + "pathNotFound": "Pfad nicht gefunden", + "invalidJobId": "ungültige Auftrags-ID", + "jobNotFound": "Auftrag nicht gefunden", + "runnerMissing": "Ausführungsskript nicht installiert", + "noRestore": "kein Wiederherstellungsstatus zum Verwerfen vorhanden", + "invalidFile": "ungültiger Dateiname", + "notFound": "nicht gefunden", + "logOutside": "Protokollpfad außerhalb des zulässigen Verzeichnisses", + "targetsList": "targets muss eine Liste sein", + "emptyExpression": "leerer Ausdruck", + "invalidId": "ungültige ID (Buchstaben, Ziffern, _ oder - verwenden)", + "backend": "backend muss pbs, local oder borg sein", + "remoteBackend": "backend muss pbs oder borg sein", + "remoteBackendQuoted": "backend muss 'pbs' oder 'borg' sein", + "profileMode": "profile_mode muss default oder custom sein", + "borgAttached": "borg kann nicht angehängt werden (PVE vzdump schreibt nur auf pbs/local-Speicher)", + "borgAttachedLong": "borg ist kein gültiges Backend für angehängte Aufträge (PVE vzdump schreibt nur auf pbs/local-Speicher)", + "parentRequired": "pve_parent_job_id und pve_storage sind für attached erforderlich", + "absolutePaths": "paths muss eine Liste absoluter Pfade sein", + "customPath": "das benutzerdefinierte Profil benötigt mindestens einen Pfad", + "defaultPaths": "die Pfade des Standardprofils konnten nicht ermittelt werden", + "retentionObject": "retention muss ein Objekt sein", + "pbsRepository": "pbs_repository ist erforderlich", + "pbsEncryption": "pbs_encrypt_mode muss 'none', 'new' oder 'existing' sein", + "pbsKeyFailed": "die PBS-Verschlüsselungsschlüsseldatei konnte nicht erstellt werden", + "pbsClientMissing": "die PBS-Verschlüsselungsschlüsseldatei konnte nicht erstellt werden (ist proxmox-backup-client installiert?)", + "borgRepository": "borg_repo ist erforderlich", + "borgEncryption": "borg_encrypt_mode muss einer der folgenden Werte sein: none, repokey, keyfile, authenticated", + "encryption": "encrypt_mode muss einer der folgenden Werte sein: none, repokey, keyfile, authenticated", + "borgPassphrase": "borg_passphrase ist erforderlich, wenn die Verschlüsselung aktiviert ist (am Ziel speichern oder in der Anfrage übergeben)", + "passphrase": "die Passphrase ist erforderlich, wenn die Verschlüsselung aktiviert ist", + "password": "das Passwort ist erforderlich", + "deviceConfirmation": "confirm_device muss exakt mit device übereinstimmen (Tippfehler-/Sicherheitsprüfung)", + "invalidDevice": "ungültiger Gerätepfad", + "absoluteMountpoint": "absoluter Einhängepunkt erforderlich", + "archiveLayout": "Archivstruktur nicht erkannt – kein rootfs/ gefunden", + "archiveMissing": "Archiv nicht gefunden", + "archiveNotFile": "der Archivpfad ist keine reguläre Datei", + "invalidName": "ungültiger Name", + "invalidStaging": "ungültiger staging_path", + "jobRename": "der Auftragsname kann nicht geändert werden (zum Umbenennen löschen und neu erstellen)", + "absoluteKey": "key_path muss absolut sein", + "mode": "mode muss \"local\" oder \"ssh\" sein", + "nameRequired": "der Name ist erforderlich (Buchstaben, Ziffern, _ oder -)", + "noLog": "für diesen Auftrag ist noch kein Protokoll verfügbar", + "noPbsConfig": "keine Datei mit manuellen PBS-Konfigurationen", + "outputMissing": "Ausgabedatei fehlt", + "parserJson": "die Ausgabe des Parsers war kein gültiges JSON", + "restoreJson": "die Ausgabe von run_restore war kein gültiges JSON", + "repoRequired": "repo ist erforderlich", + "repoSnapshot": "repo_name und snapshot sind erforderlich", + "borgRepoSnapshot": "repo_name und snapshot sind für borg erforderlich", + "pbsRepoSnapshot": "repo_name und snapshot sind für pbs erforderlich", + "repoName": "repo_name ist erforderlich", + "restoreMissing": "die Wiederherstellungswerkzeuge sind auf diesem Host nicht installiert", + "serverDatastore": "server und datastore sind erforderlich", + "snapshotRequired": "snapshot ist erforderlich", + "source": "source muss pbs, borg oder local sein", + "sshPort": "ssh_port muss eine Ganzzahl zwischen 1 und 65535 sein", + "sshRequired": "ssh_user, ssh_host und ssh_remote_path sind für den ssh-Modus erforderlich", + "repositoryPath": "das Ziel hat keinen Repository-Pfad", + "taskExpired": "Aufgabe nicht gefunden oder abgelaufen", + "invalidExpression": "ungültiger Ausdruck", + "noReport": "kein Bericht ausgegeben", + "parseManifestFailed": "parse_manifest wurde mit einem Fehlercode beendet", + "jobExists": "Auftrag existiert bereits: {value}", + "pathMissing": "Pfad existiert auf diesem Host nicht: {value}", + "deviceMissing": "Gerät existiert nicht: {value}", + "mountpoint": "kein Einhängepunkt: {value}", + "localArchiveMissing": "lokales Archiv nicht gefunden: {value}", + "borgDestination": "Borg-Ziel '{value}' nicht gefunden", + "pbsDestination": "PBS-Ziel '{value}' nicht gefunden", + "pbsPassword": "kein Passwort für das PBS-Repo '{value}' verfügbar", + "borgRepoMissing": "Borg-Repo \"{value}\" nicht konfiguriert", + "pbsRepoMissing": "PBS-Repo \"{value}\" nicht konfiguriert", + "borgTargetMissing": "Borg-Ziel nicht gefunden: {value}", + "pbsTargetMissing": "PBS-Repo nicht gefunden: {value}", + "pveJobMissing": "PVE-vzdump-Auftrag nicht gefunden: {value}", + "statePersist": "Status kann nicht gespeichert werden: {value}", + "sshDirectory": "SSH-Verzeichnis kann nicht vorbereitet werden: {value}", + "logRead": "Protokoll kann nicht gelesen werden: {value}", + "envUpdate": ".env konnte nicht aktualisiert werden: {value}", + "pbsConfigWrite": "PBS-Konfiguration konnte nicht gespeichert werden: {value}", + "persist": "Speichern fehlgeschlagen: {value}", + "archiveRemove": "Archiv konnte nicht entfernt werden: {value}", + "start": "Start fehlgeschlagen: {value}", + "borgTargetsUpdate": "borg-targets.txt konnte nicht aktualisiert werden: {value}", + "pbsTargetsUpdate": "pbs-manual-configs.txt konnte nicht aktualisiert werden: {value}", + "unitsUpdate": "systemd-Units konnten nicht aktualisiert werden: {value}", + "borgTargetsWrite": "borg-targets.txt konnte nicht geschrieben werden: {value}", + "jobWrite": "Auftragsdateien konnten nicht geschrieben werden: {value}", + "localTargetWrite": "local-target.conf konnte nicht geschrieben werden: {value}", + "unitsWrite": "systemd-Units konnten nicht geschrieben werden: {value}", + "format": "Formatieren fehlgeschlagen: {value}", + "calendar": "ungültiger on_calendar-Wert: {value}", + "mount": "Einhängen fehlgeschlagen: {value}", + "parserInvocation": "Aufruf des Parsers fehlgeschlagen: {value}", + "preflightInvocation": "Aufruf der Vorabprüfung fehlgeschlagen: {value}", + "publicKeyMissing": "öffentlicher Schlüssel nach der Erzeugung nicht gefunden: {value}", + "retentionInteger": "retention.{value} muss eine Ganzzahl sein", + "retentionNegative": "retention.{value} darf nicht negativ sein", + "keygen": "ssh-keygen fehlgeschlagen: {value}", + "systemctl": "systemctl fehlgeschlagen: {value}", + "unmount": "umount fehlgeschlagen: {value}", + "taskIncomplete": "die Aufgabe ist im Status \"{value}\", nicht abgeschlossen", + "unknownKind": "unbekannte Art: {value}", + "unknownMode": "unbekannter Modus \"{value}\"", + "defaultRemove": "{value} ist der integrierte Standard und kann nicht entfernt werden", + "defaultAdd": "{value} ist der integrierte Standard; er muss nicht hinzugefügt werden", + "keyImport": "Unter {value} ist keine PBS-Schlüsseldatei installiert. Importieren Sie zuerst die Schlüsseldatei.", + "storageMismatch": "Speicher des PVE-Auftrags stimmt nicht überein (Auftrag verwendet {value}, Nutzdaten geben {other} an)" } }, "healthStatus": { @@ -5320,6 +5597,7 @@ "websocketError": "Es ist ein WebSocket-Fehler aufgetreten", "connectionClosed": "Verbindung geschlossen", "completedSuccessfully": "Skript erfolgreich abgeschlossen", + "cancelled": "Vorgang abgebrochen.", "completedWithError": "Skript mit Fehlercode {code} beendet", "yes": "Ja", "yourInput": "Ihr Beitrag:", @@ -7311,7 +7589,7 @@ "signInWith": "Anmelden mit", "methodPassword": "Benutzer und Passwort", "methodToken": "API-Token", - "username": "Benutzer (benutzer@realm)", + "username": "Benutzer", "password": "Passwort", "passwordHelp": "Das Passwort wird nur einmal verwendet, um ein schreibgeschütztes API-Token (Rolle Audit) für diesen Monitor zu erstellen. Gespeichert wird nur dieses Token, nie das Passwort. Aktivieren Sie zuerst die Monitor-Authentifizierung.", "cancel": "Abbrechen", @@ -7324,10 +7602,10 @@ "editConnection": "Zu bearbeitende Verbindung", "add": "Neue Verbindung hinzufügen", "name": "Name", - "url": "HTTPS-URL (für den nativen PBS-Port :8007 angeben)", - "token_id": "API-Token-ID (user@realm!token)", - "token_secret": "API-Token-Geheimnis (leer lassen, um das gespeicherte Geheimnis beizubehalten)", - "fingerprint": "SHA256-Zertifikatfingerabdruck (optional)", + "url": "HTTPS-Adresse", + "token_id": "API-Token-ID", + "token_secret": "API-Token-Geheimnis", + "fingerprint": "SHA256-Fingerabdruck (optional)", "tlsHelp": "Lassen Sie den Fingerabdruck für die normale Prüfung von Zertifizierungsstelle und Hostname leer. Kopieren Sie bei einem selbstsignierten Zertifikat dessen SHA256-Fingerabdruck aus der PBS-Konsole oder einem anderen vertrauenswürdigen Kanal. Der Fingerabdruck wird vor der Übermittlung von Zugangsdaten geprüft.", "saved": "PBS-Verbindung geprüft und gespeichert.", "saveFailed": "PBS-Verbindung konnte nicht gespeichert werden.", @@ -7369,7 +7647,85 @@ "estimatedFull": "Voraussichtlich voll", "estimatedFullUnknown": "Noch nicht genügend Daten", "duration": "Dauer", - "noJobs": "Es sind keine Synchronisierungs-, Überprüfungs- oder Löschzeitpläne konfiguriert." + "noJobs": "Es sind keine Synchronisierungs-, Überprüfungs- oder Löschzeitpläne konfiguriert.", + "errors": { + "configRead": "Die gespeicherten PBS-Verbindungen konnten nicht gelesen werden. Prüfen Sie die Konfigurationsdatei und die Berechtigungen.", + "invalidConfig": "Die Einstellungen der PBS-Verbindung sind ungültig. Prüfen Sie das Formular und versuchen Sie es erneut.", + "invalidField": "Ein Verbindungsfeld ist ungültig oder zu lang.", + "invalidUrl": "Verwenden Sie eine HTTPS-Adresse des PBS ohne eingebettete Zugangsdaten, Abfrageparameter oder Fragment.", + "nameRequired": "Geben Sie einen Servernamen mit höchstens 128 Zeichen ein.", + "tokenIdFormat": "Geben Sie die PBS-API-Token-ID im Format user@realm!token ein.", + "tokenSecret": "Geben Sie ein gültiges API-Token-Geheimnis ohne Leerzeichen oder Steuerzeichen ein.", + "invalidTokenId": "Die API-Token-ID darf nur ASCII-Zeichen enthalten.", + "invalidFingerprint": "Geben Sie den SHA256-Fingerabdruck des Zertifikats ein: 64 Hexadezimalzeichen, optional durch Doppelpunkte getrennt.", + "fingerprintMismatch": "Das PBS-Zertifikat stimmt nicht mit dem Fingerabdruck überein. Es wurden keine Zugangsdaten gesendet.", + "tokenRejected": "PBS hat das API-Token oder seine Berechtigungen abgelehnt. Prüfen Sie die ACLs sowohl des Benutzers als auch des Tokens.", + "invalidResponse": "PBS hat eine unerwartete Antwort zurückgegeben. Weiterleitungen werden nicht verfolgt.", + "invalidJson": "PBS hat ein ungültiges JSON-Dokument zurückgegeben.", + "connectFailed": "Über verifiziertes HTTPS konnte keine Verbindung zu PBS hergestellt werden. Prüfen Sie Adresse, Zertifikat und Dienst.", + "invalidId": "Die ID der PBS-Verbindung ist ungültig. Laden Sie die Verbindungsliste neu.", + "invalidDatastores": "PBS hat eine ungültige Datenspeicherliste zurückgegeben.", + "connectionLimit": "Es können höchstens {count} PBS-Verbindungen konfiguriert werden.", + "username": "Geben Sie den PBS-Benutzer im Format user@realm ein, zum Beispiel root@pam.", + "password": "Geben Sie das Passwort des PBS-Benutzers ein.", + "loginRejected": "PBS hat den Benutzernamen oder das Passwort abgelehnt.", + "invalidLogin": "PBS hat eine ungültige Anmeldeantwort zurückgegeben.", + "tokenCreateDenied": "Dieser PBS-Benutzer kann keine API-Tokens erstellen.", + "invalidToken": "PBS hat ein ungültiges API-Token zurückgegeben.", + "auditRoleDenied": "Dieser PBS-Benutzer kann die Rolle Audit nicht vergeben. Melden Sie sich als root@pam oder als anderer Administrator an.", + "notFound": "Die PBS-Verbindung wurde nicht gefunden. Laden Sie die Verbindungsliste neu.", + "readFailed": "PBS-Daten konnten nicht gelesen werden. Prüfen Sie den Dienst und die Berechtigungen.", + "invalidList": "PBS hat eine ungültige Datenliste zurückgegeben.", + "localUnavailable": "PBS ist auf diesem Host nicht verfügbar.", + "authRequired": "Aktivieren Sie die lokale Authentifizierung im Monitor, bevor Sie entfernte PBS-Verbindungen verwalten.", + "datastoreOffline": "Der Datenspeicher ist offline, im Wartungsmodus oder sein zugrunde liegendes Gerät ist nicht eingehängt.", + "datastoreUnavailable": "Das Dateisystem des Datenspeichers ist nicht verfügbar." + }, + "taskTypes": { + "backup": "Backup", + "restore": "Wiederherstellung", + "verify": "Verifizierung", + "verifyGroup": "Verifizierung der Backup-Gruppe", + "verifySnapshot": "Verifizierung des Snapshots", + "prune": "Bereinigung", + "garbageCollection": "Garbage Collection", + "sync": "Synchronisierung", + "updateCheck": "Nach Updates suchen", + "terminal": "Terminal", + "createDatastore": "Datenspeicher erstellen", + "other": "Andere Aufgabe ({type})" + }, + "states": { + "ok": "OK", + "unknown": "Unbekannt", + "warnings": "Warnungen: {count}", + "warning": "Warnung", + "error": "Fehler" + }, + "serviceStates": { + "active": "Aktiv", + "inactive": "Inaktiv", + "failed": "Fehlgeschlagen", + "activating": "Wird gestartet", + "deactivating": "Wird gestoppt", + "unknown": "Unbekannt" + }, + "durationUnits": { + "seconds": "{count} s", + "minutes": "{count} min", + "hours": "{count} h", + "days": "{count} T" + }, + "urlHelp": "Geben Sie :8007 für den Standard-PBS-Port an, zum Beispiel https://pbs.example:8007.", + "usernameHelp": "Verwenden Sie user@realm, zum Beispiel root@pam.", + "tokenIdHelp": "Verwenden Sie user@realm!token, zum Beispiel monitor@pbs!proxmenux.", + "tokenSecretHelp": "Geben Sie das Geheimnis dieses API-Tokens ein.", + "tokenSecretKeepHelp": "Leer lassen, um das gespeicherte Token-Geheimnis beizubehalten.", + "removeFailed": "Die PBS-Verbindung konnte nicht entfernt werden.", + "savedRefreshFailed": "Die PBS-Verbindung wurde gespeichert, aber die Verbindungsliste konnte nicht aktualisiert werden. Laden Sie die Seite neu, bevor Sie eine weitere Änderung vornehmen.", + "removedRefreshFailed": "Die PBS-Verbindung wurde entfernt, aber die Verbindungsliste konnte nicht aktualisiert werden. Laden Sie die Seite neu.", + "technicalDetails": "Technische Details", + "datastoreType": "Datenspeicher" }, "monitorLinks": { "groups": { @@ -7408,6 +7764,17 @@ "addSelected": "Auswahl hinzufügen", "pbsWebInterface": "PBS-Weboberfläche", "changeAddress": "Adresse ändern", - "cancel": "Abbrechen" + "cancel": "Abbrechen", + "errors": { + "addressRequired": "Geben Sie die Adresse des Monitors ein.", + "invalidAddress": "Die Adresse muss mit http:// oder https:// beginnen und einen Host angeben.", + "addressCredentials": "Die Adresse darf keinen Benutzer und kein Passwort enthalten.", + "invalidPort": "Der Port der Adresse ist ungültig.", + "invalidRequest": "Die Anfrage ist ungültig. Laden Sie die Seite neu und versuchen Sie es erneut.", + "limit": "Es können höchstens {count} Knoten hinzugefügt werden.", + "duplicate": "Diese Adresse ist bereits in der Liste.", + "notFound": "Der Knoten wurde nicht gefunden. Laden Sie die Liste neu und versuchen Sie es erneut.", + "detectedRemove": "Nur manuell hinzugefügte Knoten können entfernt werden. Erkannte Knoten können ausgeblendet werden." + } } } diff --git a/AppImage/messages/en/common.json b/AppImage/messages/en/common.json index 08fe0147..65a42efe 100644 --- a/AppImage/messages/en/common.json +++ b/AppImage/messages/en/common.json @@ -14,7 +14,7 @@ "signInWith": "Sign in with", "methodPassword": "User and password", "methodToken": "API token", - "username": "User (user@realm)", + "username": "User", "password": "Password", "passwordHelp": "The password is used once to create a read-only API token (Audit role) for this Monitor. Only that token is saved, never the password. Enable Monitor authentication first.", "cancel": "Cancel", @@ -27,10 +27,15 @@ "editConnection": "Connection to edit", "add": "Add a new connection", "name": "Name", - "url": "HTTPS URL (include :8007 for the native PBS port)", - "token_id": "API token ID (user@realm!token)", - "token_secret": "API token secret (leave empty to keep the stored secret)", - "fingerprint": "SHA256 certificate fingerprint (optional)", + "url": "HTTPS address", + "urlHelp": "Include :8007 for the default PBS port, for example https://pbs.example:8007.", + "usernameHelp": "Use user@realm, for example root@pam.", + "tokenIdHelp": "Use user@realm!token, for example monitor@pbs!proxmenux.", + "tokenSecretHelp": "Enter the secret of this API token.", + "tokenSecretKeepHelp": "Leave empty to keep the saved token secret.", + "token_id": "API token ID", + "token_secret": "API token secret", + "fingerprint": "SHA256 fingerprint (optional)", "tlsHelp": "Leave the fingerprint empty for normal CA and hostname verification. For a self-signed certificate, copy its SHA256 fingerprint from the PBS console or another trusted channel. The pin is checked before sending credentials.", "saved": "PBS connection verified and saved.", "saveFailed": "Could not save the PBS connection.", @@ -72,7 +77,55 @@ "estimatedFull": "Estimated full", "estimatedFullUnknown": "Not enough data yet", "duration": "Duration", - "noJobs": "No sync, verification or prune schedules are configured." + "noJobs": "No sync, verification or prune schedules are configured.", + "removeFailed": "Could not remove the PBS connection.", + "savedRefreshFailed": "The PBS connection was saved, but the connection list could not be refreshed. Reload the page before trying another change.", + "removedRefreshFailed": "The PBS connection was removed, but the connection list could not be refreshed. Reload the page.", + "technicalDetails": "Technical details", + "datastoreType": "Datastore", + "errors": { + "configRead": "Could not read the saved PBS connections. Check the configuration file and permissions.", + "invalidConfig": "The PBS connection settings are not valid. Check the form and try again.", + "invalidField": "A connection field is not valid or is too long.", + "invalidUrl": "Use an HTTPS PBS address without embedded credentials, query parameters or a fragment.", + "nameRequired": "Enter a server name of at most 128 characters.", + "tokenIdFormat": "Enter the PBS API token ID in user@realm!token format.", + "tokenSecret": "Enter a valid API token secret without spaces or control characters.", + "invalidTokenId": "The API token ID must contain only ASCII characters.", + "invalidFingerprint": "Enter the certificate's SHA256 fingerprint: 64 hexadecimal characters, optionally separated by colons.", + "fingerprintMismatch": "The PBS certificate does not match the fingerprint. No credentials were sent.", + "tokenRejected": "PBS rejected the API token or its permissions. Check the ACLs of both the user and the token.", + "invalidResponse": "PBS returned an unexpected response. Redirects are not followed.", + "invalidJson": "PBS returned an invalid JSON document.", + "connectFailed": "Could not connect to PBS over verified HTTPS. Check the address, certificate and service.", + "invalidId": "The PBS connection ID is not valid. Reload the connection list.", + "invalidDatastores": "PBS returned an invalid datastore list.", + "connectionLimit": "At most {count} PBS connections may be configured.", + "username": "Enter the PBS user in user@realm format, for example root@pam.", + "password": "Enter the PBS user's password.", + "loginRejected": "PBS rejected the username or password.", + "invalidLogin": "PBS returned an invalid sign-in response.", + "tokenCreateDenied": "This PBS user cannot create API tokens.", + "invalidToken": "PBS returned an invalid API token.", + "auditRoleDenied": "This PBS user cannot grant the Audit role. Sign in as root@pam or another administrator.", + "notFound": "The PBS connection was not found. Reload the connection list.", + "readFailed": "Could not read PBS data. Check its service and permissions.", + "invalidList": "PBS returned an invalid data list.", + "localUnavailable": "PBS is not available on this host.", + "authRequired": "Enable local authentication in Monitor before managing remote PBS connections.", + "datastoreOffline": "The datastore is offline, in maintenance mode or its backing device is not mounted.", + "datastoreUnavailable": "The datastore filesystem is not available." + }, + "taskTypes": { + "backup": "Backup", "restore": "Restore", "verify": "Verification", + "verifyGroup": "Backup group verification", "verifySnapshot": "Snapshot verification", + "prune": "Prune", "garbageCollection": "Garbage collection", "sync": "Synchronization", + "updateCheck": "Check for updates", "terminal": "Terminal", "createDatastore": "Create datastore", + "other": "Other task ({type})" + }, + "states": { "ok": "OK", "unknown": "Unknown", "warnings": "Warnings: {count}", "warning": "Warning", "error": "Error" }, + "serviceStates": { "active": "Active", "inactive": "Inactive", "failed": "Failed", "activating": "Starting", "deactivating": "Stopping", "unknown": "Unknown" }, + "durationUnits": { "seconds": "{count} s", "minutes": "{count} min", "hours": "{count} h", "days": "{count} d" } }, "app": { "title": "ProxMenux Monitor", @@ -1327,9 +1380,11 @@ "update": "Update", "modify": "Modify", "recover": "Recover", + "registerRestored": "Register again", "terminalTitleUpdate": "Update OCI application", + "terminalTitleRecoverPrevious": "Recover the previous OCI installation", "terminalTitleModify": "Modify OCI application", - "terminalTitleRecover": "Recover restored OCI application", + "terminalTitleRecover": "Register restored OCI applications", "terminalDescription": "Runs the same process as the ProxMenux menu: OCI manager Apps → Manage installed OCI applications.", "keepBackup": "Keep the backup taken before updating", "noKeepBackup": "The backup taken before updating is not kept", @@ -1560,7 +1615,7 @@ "ociTitle": "OCI image container", "ociBody": "This container was created from an OCI image outside OCI manager Apps. It is updated by replacing its image, which ProxMenux does not manage for it.", "ociRestoredTitle": "Restored OCI application", - "ociRestoredBody": "This container was restored from a backup and this host has no record of its application, so it cannot be updated from here yet. Recover registers it again on this host, the same as OCI manager Apps → Manage installed OCI applications.", + "ociRestoredBody": "This container was restored from a backup and this host has no record of its OCI application, so it cannot be updated here yet. Register again opens the registration of restored OCI applications on this node, as in OCI manager Apps → Manage installed OCI applications.", "dockerImagesTitle": "Docker images", "dockerAppTitle": "Docker", "dockerImagesSubheading": "Images", @@ -1620,6 +1675,127 @@ "loadFailed": "Could not load the bulk update configuration." }, "appEditor": { + "confirmRemove": "Remove this application's record from the App tab? This does not uninstall the application.", + "packageExample": "e.g. {package}", + "packageHelpBefore": "Auto-filled from Name. Verify with", + "packageHelpAfter": "inside the CT.", + "binaryHelpBefore": "Absolute path. Find it with", + "binaryHelpOr": "or", + "errors": { + "ociBusy": "an OCI operation on this container is running", + "dpkgMissing": "{package} is not installed via dpkg", + "dpkgFailed": "dpkg-query failed", + "dpkgNoVersion": "no version matched in dpkg output", + "apkFailed": "apk info failed", + "apkNoVersion": "no version matched in apk output", + "fileRead": "could not read {path}", + "fileNoMatch": "file_regex did not match {path}", + "binaryFailed": "binary invocation failed", + "binaryNoVersion": "no version matched in binary output", + "pythonFailed": "python -c importlib.metadata failed", + "pythonNoVersion": "no version matched in Python distribution output", + "dockerImageResolve": "could not resolve the container's installed image", + "dockerInspectFailed": "docker inspect failed", + "dockerLabelMissing": "container has no {label} label", + "dockerLabelMutable": "docker label reports {tag} (mutable tag, not a version)", + "dockerLabelNoVersion": "no version matched in docker label output", + "dockerExecFailed": "docker exec failed", + "dockerExecNoVersion": "no version matched in docker exec output", + "commandEmpty": "command_argv is empty", + "commandFailed": "command failed", + "commandNoVersion": "no version matched in command output", + "unsupportedMethod": "unsupported method: {method}", + "unknownUpstream": "unknown upstream_type: {type}", + "githubNotFound": "{repo}: not found", + "githubRejected": "github rejected the request (403)", + "githubError": "github error {code}", + "noRelease": "no tag / release name in response", + "tagNoMatch": "tag_regex did not match '{tag}'", + "httpError": "http error {code}", + "invalidJson": "invalid JSON response: {detail}", + "jsonPathUnresolved": "json_path '{path}' did not resolve", + "jsonEmpty": "empty value at json_path", + "dockerNoTags": "no tags matched (docker_hub)", + "dockerMovingOnly": "tag_regex matched only moving tags; use Docker image digest tracking", + "dockerHubError": "docker hub error {code}", + "dockerHubJson": "invalid docker hub JSON: {detail}", + "dockerHubEmpty": "no tags returned by docker hub", + "payload": "payload must be a JSON object", + "name": "name is required and must be 1-64 chars of letters/digits/spaces/._+-()/", + "method": "installed_via must be one of: {values} or empty", + "package": "package is required (letters/digits/._+@:/ up to 127 chars)", + "filePath": "file_path is required and must be an absolute path", + "fileRegex": "file_regex is required", + "fileRegexInvalid": "file_regex is not a valid regex: {detail}", + "binaryPath": "binary_path is required and must be an absolute path", + "pythonPath": "python_path is required and must be an absolute path", + "distribution": "distribution is required (PEP 503 name)", + "container": "container_name is required (docker naming rules)", + "label": "label is required (OCI label naming rules)", + "dockerBinary": "binary_path is required (absolute path or bare command)", + "manualVersion": "installed_version is required for the manual method", + "versionLength": "installed_version exceeds {max} chars", + "versionControl": "installed_version contains a forbidden control character", + "installedRegexInvalid": "installed_regex is not a valid regex: {detail}", + "upstreamType": "upstream_type must be one of: {values}", + "tagRegexInvalid": "tag_regex is not a valid regex: {detail}", + "repoRequired": "repo is required for upstream_type=github", + "repoFormat": "repo must be 'owner/name'", + "githubSource": "github_source must be one of: {values}", + "upstreamUrlRequired": "upstream_url is required for upstream_type=http_json", + "upstreamUrl": "upstream_url must be an http(s) URL", + "upstreamUrlLength": "upstream_url exceeds {max} chars", + "jsonPathRequired": "upstream_json_path is required for upstream_type=http_json", + "jsonPathLength": "upstream_json_path exceeds {max} chars", + "jsonPathCharacters": "upstream_json_path uses forbidden characters", + "dockerImageRequired": "docker_image is required for upstream_type=docker_hub", + "dockerImageLength": "docker_image exceeds {max} chars", + "dockerImageFormat": "docker_image must match Docker Hub naming (owner/name or name)", + "healthPath": "health_path must be a valid URL path (max 255 chars)", + "logoUrl": "logo_url must be an http(s) URL or this VM's cached local icon", + "discoveryId": "invalid discovery_id", + "helperSlug": "helper_slug must be a lowercase slug (letters/digits/._-)", + "updateVia": "update_via only accepts 'docker'", + "dockerDetector": "update_via=docker requires a docker_label or docker_exec detector", + "dockerConflict": "update_via=docker cannot be combined with {field}", + "updateCommandType": "update_command must be a string", + "updateCommandLength": "update_command exceeds {max} chars", + "updateCommandNull": "update_command contains a null byte", + "updateMethod": "update_method must be none, helper or custom", + "updateCommandRequired": "update_command is required for update_method=custom", + "updateCommandOnlyCustom": "update_command is only allowed for update_method=custom", + "helperRequired": "a supported helper_slug is required for update_method=helper", + "dockerUpdater": "Docker-delegated apps update through their image, not a separate app updater", + "commandRequired": "command_argv is required (non-empty list)", + "commandList": "command_argv must be a non-empty list of strings", + "commandCount": "command_argv accepts at most {max} entries", + "commandEntry": "command_argv[{index}] must be a non-empty string", + "commandEntryLength": "command_argv[{index}] exceeds {max} chars", + "commandEntryControl": "command_argv[{index}] contains a forbidden control character", + "binaryArgsList": "binary_args must be a list of strings", + "binaryArgsCount": "binary_args accepts at most {max} entries", + "binaryArgEntry": "binary_args[{index}] must be a non-empty string", + "binaryArgLength": "binary_args[{index}] exceeds {max} chars", + "binaryArgControl": "binary_args[{index}] contains a forbidden control character", + "portsList": "ports must be a list of {port, description, scheme}", + "portObject": "ports[{index}] must be an object", + "portRequired": "ports[{index}].port is required", + "portInteger": "ports[{index}].port must be an integer", + "portRange": "ports[{index}].port must be 1-65535", + "portDuplicate": "port {port} appears more than once for this app", + "portDescription": "ports[{index}].description has invalid characters", + "portScheme": "ports[{index}].scheme must be 'http' or 'https'", + "portPath": "ports[{index}].web_path must be a valid URL path (max 255 chars)", + "portLogo": "ports[{index}].logo_url must be an http(s) URL (max 512 chars)", + "portCategory": "ports[{index}].category has invalid characters or is too long", + "portCustomUrl": "ports[{index}].custom_url must be an http(s) URL (max 512 chars)", + "tagRegexLength": "tag_regex exceeds 512 chars", + "persistPermission": "could not persist sidecar (permission?)", + "persist": "could not persist sidecar", + "noApps": "no apps registered for this vmid", + "appMissing": "app_id '{appId}' not found", + "appNotFound": "app not found" + }, "closePanel": "Close panel", "cancelButton": "Cancel", "saveButton": "Save", @@ -2370,6 +2546,42 @@ "updateManyDescription": "Re-running {count} post-install functions in sequence.", "legacySourceTitle": "Legacy optimization - click to view source", "sourceTitle": "Click to view source code", + "sourceDialogTitle": "Source code: {name}", + "sourceLoading": "Loading source code…", + "sourceUnavailable": "Source code is not available.", + "sourceLoadFailed": "Could not load the source code. Try again.", + "sourceFunctionMissing": "The function was not found in the available scripts.", + "sourceUnknownTool": "Unknown tool: {tool}", + "sourceNoMapping": "No function is assigned to the tool {tool}.", + "sourceToolNames": { + "subscription_banner": "Subscription Banner Removal", + "time_sync": "Time Synchronization", + "apt_languages": "APT Language Skip", + "journald": "Journald Optimization", + "logrotate": "Logrotate Optimization", + "system_limits": "System Limits Increase", + "memory_settings": "Memory Settings Optimization", + "zram_swap": "ZRAM Swap Profile", + "kernel_panic": "Kernel Panic Configuration", + "apt_ipv4": "APT IPv4 Force", + "kexec": "kexec for quick reboots", + "rpc": "RPC / rpcbind Disable", + "motd": "Custom MOTD Banner", + "system_utils": "System Utilities", + "network_optimization": "Network Optimizations", + "bashrc_custom": "Bashrc Customization", + "figurine": "Figurine", + "fastfetch": "Fastfetch", + "log2ram": "Log2ram (SSD Protection)", + "zfs_autotrim": "ZFS Autotrim", + "amd_fixes": "AMD CPU (Ryzen/EPYC) fixes", + "persistent_network": "Setting persistent network interfaces", + "vfio_iommu": "VFIO/IOMMU Passthrough", + "lvm_repair": "LVM PV Headers Repair", + "repo_cleanup": "Repository Cleanup", + "proxmox_repos": "Proxmox APT Repositories", + "entropy": "Entropy Generation (haveged)" + }, "legacy": "legacy", "updateToolTitle": "Update {name} to v{version}", "availableUpdates": "Available updates", @@ -4383,6 +4595,124 @@ "unrecoverable": "Without the key, encrypted backups cannot be restored.", "usesSharedKeyfileAt": "Uses shared keyfile at" }, + "apiErrors": { + "requestFailed": "The request failed.", + "absolutePath": "path must be absolute", + "pathConfigured": "this path is already configured", + "pathRequired": "path is required", + "pathQuery": "path query parameter is required", + "pathNotFound": "path not found", + "invalidJobId": "invalid job id", + "jobNotFound": "job not found", + "runnerMissing": "runner script not installed", + "noRestore": "no restore state to dismiss", + "invalidFile": "invalid file name", + "notFound": "not found", + "logOutside": "log path outside allowed directory", + "targetsList": "targets must be a list", + "emptyExpression": "empty expression", + "invalidId": "invalid id (use letters, digits, _ or -)", + "backend": "backend must be pbs, local or borg", + "remoteBackend": "backend must be pbs or borg", + "remoteBackendQuoted": "backend must be 'pbs' or 'borg'", + "profileMode": "profile_mode must be default or custom", + "borgAttached": "borg cannot be attached (PVE vzdump only writes to pbs/local storages)", + "borgAttachedLong": "borg is not a valid backend for attached jobs (PVE vzdump only writes to pbs/local storages)", + "parentRequired": "pve_parent_job_id and pve_storage are required for attached", + "absolutePaths": "paths must be a list of absolute paths", + "customPath": "custom profile needs at least one path", + "defaultPaths": "could not resolve default profile paths", + "retentionObject": "retention must be an object", + "pbsRepository": "pbs_repository is required", + "pbsEncryption": "pbs_encrypt_mode must be 'none', 'new' or 'existing'", + "pbsKeyFailed": "failed to create PBS encryption keyfile", + "pbsClientMissing": "failed to create PBS encryption keyfile (is proxmox-backup-client installed?)", + "borgRepository": "borg_repo is required", + "borgEncryption": "borg_encrypt_mode must be one of: none, repokey, keyfile, authenticated", + "encryption": "encrypt_mode must be one of: none, repokey, keyfile, authenticated", + "borgPassphrase": "borg_passphrase is required when encryption is enabled (save it on the destination or pass one in the request)", + "passphrase": "passphrase is required when encryption is enabled", + "password": "password is required", + "deviceConfirmation": "confirm_device must match device exactly (typo / safety check)", + "invalidDevice": "invalid device path", + "absoluteMountpoint": "absolute mountpoint required", + "archiveLayout": "archive layout not recognized — no rootfs/ found", + "archiveMissing": "archive not found", + "archiveNotFile": "archive path is not a regular file", + "invalidName": "invalid name", + "invalidStaging": "invalid staging_path", + "jobRename": "job name cannot be changed (delete + recreate to rename)", + "absoluteKey": "key_path must be absolute", + "mode": "mode must be \"local\" or \"ssh\"", + "nameRequired": "name is required (letters, digits, _ or -)", + "noLog": "no log available for this job yet", + "noPbsConfig": "no manual PBS configs file", + "outputMissing": "output file missing", + "parserJson": "parser output was not valid JSON", + "restoreJson": "run_restore output was not valid JSON", + "repoRequired": "repo is required", + "repoSnapshot": "repo_name and snapshot are required", + "borgRepoSnapshot": "repo_name and snapshot are required for borg", + "pbsRepoSnapshot": "repo_name and snapshot are required for pbs", + "repoName": "repo_name is required", + "restoreMissing": "restore tooling not installed on this host", + "serverDatastore": "server and datastore are required", + "snapshotRequired": "snapshot is required", + "source": "source must be pbs, borg, or local", + "sshPort": "ssh_port must be an integer between 1 and 65535", + "sshRequired": "ssh_user, ssh_host and ssh_remote_path are required for ssh mode", + "repositoryPath": "target has no repository path", + "taskExpired": "task not found or expired", + "invalidExpression": "invalid expression", + "noReport": "no report emitted", + "parseManifestFailed": "parse_manifest exited non-zero", + "jobExists": "job already exists: {value}", + "pathMissing": "path does not exist on this host: {value}", + "deviceMissing": "device does not exist: {value}", + "mountpoint": "not a mountpoint: {value}", + "localArchiveMissing": "local archive not found: {value}", + "borgDestination": "Borg destination '{value}' not found", + "pbsDestination": "PBS destination '{value}' not found", + "pbsPassword": "no password available for PBS repo '{value}'", + "borgRepoMissing": "Borg repo \"{value}\" not configured", + "pbsRepoMissing": "PBS repo \"{value}\" not configured", + "borgTargetMissing": "Borg target not found: {value}", + "pbsTargetMissing": "PBS repo not found: {value}", + "pveJobMissing": "PVE vzdump job not found: {value}", + "statePersist": "cannot persist state: {value}", + "sshDirectory": "cannot prepare ssh dir: {value}", + "logRead": "cannot read log: {value}", + "envUpdate": "could not update .env: {value}", + "pbsConfigWrite": "failed to persist PBS config: {value}", + "persist": "failed to persist: {value}", + "archiveRemove": "failed to remove archive: {value}", + "start": "failed to start: {value}", + "borgTargetsUpdate": "failed to update borg-targets.txt: {value}", + "pbsTargetsUpdate": "failed to update pbs-manual-configs.txt: {value}", + "unitsUpdate": "failed to update systemd units: {value}", + "borgTargetsWrite": "failed to write borg-targets.txt: {value}", + "jobWrite": "failed to write job files: {value}", + "localTargetWrite": "failed to write local-target.conf: {value}", + "unitsWrite": "failed to write systemd units: {value}", + "format": "format failed: {value}", + "calendar": "invalid on_calendar: {value}", + "mount": "mount failed: {value}", + "parserInvocation": "parser invocation failed: {value}", + "preflightInvocation": "preflight invocation failed: {value}", + "publicKeyMissing": "public key not found after generation: {value}", + "retentionInteger": "retention.{value} must be an integer", + "retentionNegative": "retention.{value} must be non-negative", + "keygen": "ssh-keygen failed: {value}", + "systemctl": "systemctl failed: {value}", + "unmount": "umount failed: {value}", + "taskIncomplete": "task is in state \"{value}\", not completed", + "unknownKind": "unknown kind: {value}", + "unknownMode": "unknown mode \"{value}\"", + "defaultRemove": "{value} is the built-in default and cannot be removed", + "defaultAdd": "{value} is the built-in default; no need to add it", + "keyImport": "No PBS keyfile is installed at {value}. Import the keyfile first.", + "storageMismatch": "PVE job storage mismatch (job uses {value}, payload says {other})" + }, "errors": { "backendNoStagingPath": "Backend did not return a staging path.", "deleteFailed": "Delete failed: {error}", @@ -5463,6 +5793,7 @@ "websocketError": "WebSocket error occurred", "connectionClosed": "Connection closed", "completedSuccessfully": "Script completed successfully", + "cancelled": "Operation cancelled.", "completedWithError": "Script finished with error code {code}", "yes": "Yes", "yourInput": "Your input:", @@ -6684,7 +7015,18 @@ "addSelected": "Add selected", "pbsWebInterface": "PBS web interface", "changeAddress": "Change address", - "cancel": "Cancel" + "cancel": "Cancel", + "errors": { + "addressRequired": "Enter the address of the Monitor.", + "invalidAddress": "The address must start with http:// or https:// and name a host.", + "addressCredentials": "The address must not contain a user or password.", + "invalidPort": "The port of the address is not valid.", + "invalidRequest": "The request is not valid. Reload the page and try again.", + "limit": "At most {count} nodes can be added.", + "duplicate": "This address is already in the list.", + "notFound": "The node was not found. Reload the list and try again.", + "detectedRemove": "Only nodes added by hand can be removed. Detected nodes can be hidden." + } }, "apiErrors": { "http": "API request failed: {status} {statusText}", diff --git a/AppImage/messages/es/common.json b/AppImage/messages/es/common.json index 451ee66b..9b39f32d 100644 --- a/AppImage/messages/es/common.json +++ b/AppImage/messages/es/common.json @@ -14,7 +14,7 @@ "signInWith": "Iniciar sesión con", "methodPassword": "Usuario y contraseña", "methodToken": "Token API", - "username": "Usuario (usuario@realm)", + "username": "Usuario", "password": "Contraseña", "passwordHelp": "La contraseña se usa una sola vez para crear un token API de solo lectura (rol Audit) para este Monitor. Solo se guarda ese token, nunca la contraseña. Activa antes la autenticación del Monitor.", "cancel": "Cancelar", @@ -27,10 +27,10 @@ "editConnection": "Conexión que deseas editar", "add": "Añadir una conexión", "name": "Nombre", - "url": "URL HTTPS (incluye :8007 para el puerto nativo de PBS)", - "token_id": "ID del token API (usuario@realm!token)", - "token_secret": "Secreto del token API (vacío para conservar el guardado)", - "fingerprint": "Huella SHA256 del certificado (opcional)", + "url": "Dirección HTTPS", + "token_id": "ID del token API", + "token_secret": "Secreto del token API", + "fingerprint": "Huella SHA256 (opcional)", "tlsHelp": "Deja la huella vacía para verificar la CA y el nombre del servidor. Si el certificado es autofirmado, copia su huella SHA256 desde la consola de PBS u otro canal fiable. Se verifica antes de enviar las credenciales.", "saved": "Conexión PBS verificada y guardada.", "saveFailed": "No se pudo guardar la conexión PBS.", @@ -72,7 +72,85 @@ "estimatedFull": "Lleno previsto", "estimatedFullUnknown": "Aún no hay datos suficientes", "duration": "Duración", - "noJobs": "No hay programaciones de sincronización, verificación ni prune." + "noJobs": "No hay programaciones de sincronización, verificación ni prune.", + "errors": { + "configRead": "No se pudieron leer las conexiones PBS guardadas. Revisa el archivo de configuración y los permisos.", + "invalidConfig": "La configuración de la conexión PBS no es válida. Revisa el formulario y vuelve a intentarlo.", + "invalidField": "Un campo de la conexión no es válido o es demasiado largo.", + "invalidUrl": "Usa una dirección HTTPS de PBS sin credenciales incrustadas, parámetros de consulta ni fragmento.", + "nameRequired": "Introduce un nombre de servidor de 128 caracteres como máximo.", + "tokenIdFormat": "Introduce el ID del token API de PBS con el formato usuario@realm!token.", + "tokenSecret": "Introduce un secreto de token API válido, sin espacios ni caracteres de control.", + "invalidTokenId": "El ID del token API solo puede contener caracteres ASCII.", + "invalidFingerprint": "Introduce la huella SHA256 del certificado: 64 caracteres hexadecimales, opcionalmente separados por dos puntos.", + "fingerprintMismatch": "El certificado de PBS no coincide con la huella. No se ha enviado ninguna credencial.", + "tokenRejected": "PBS ha rechazado el token API o sus permisos. Revisa las ACL del usuario y del token.", + "invalidResponse": "PBS ha devuelto una respuesta inesperada. No se siguen las redirecciones.", + "invalidJson": "PBS ha devuelto un documento JSON no válido.", + "connectFailed": "No se pudo conectar con PBS mediante HTTPS verificado. Revisa la dirección, el certificado y el servicio.", + "invalidId": "El ID de la conexión PBS no es válido. Recarga la lista de conexiones.", + "invalidDatastores": "PBS ha devuelto una lista de datastores no válida.", + "connectionLimit": "Se pueden configurar como máximo {count} conexiones PBS.", + "username": "Introduce el usuario de PBS con el formato usuario@realm, por ejemplo root@pam.", + "password": "Introduce la contraseña del usuario de PBS.", + "loginRejected": "PBS ha rechazado el usuario o la contraseña.", + "invalidLogin": "PBS ha devuelto una respuesta de inicio de sesión no válida.", + "tokenCreateDenied": "Este usuario de PBS no puede crear tokens API.", + "invalidToken": "PBS ha devuelto un token API no válido.", + "auditRoleDenied": "Este usuario de PBS no puede conceder el rol Audit. Inicia sesión como root@pam u otro administrador.", + "notFound": "No se encontró la conexión PBS. Recarga la lista de conexiones.", + "readFailed": "No se pudieron leer los datos de PBS. Revisa su servicio y los permisos.", + "invalidList": "PBS ha devuelto una lista de datos no válida.", + "localUnavailable": "PBS no está disponible en este host.", + "authRequired": "Activa la autenticación local en Monitor antes de gestionar conexiones PBS remotas.", + "datastoreOffline": "El datastore está desconectado, en modo de mantenimiento o su dispositivo no está montado.", + "datastoreUnavailable": "El sistema de archivos del datastore no está disponible." + }, + "taskTypes": { + "backup": "Backup", + "restore": "Restauración", + "verify": "Verificación", + "verifyGroup": "Verificación de grupo de backups", + "verifySnapshot": "Verificación de snapshot", + "prune": "Prune", + "garbageCollection": "Recolección de basura", + "sync": "Sincronización", + "updateCheck": "Comprobación de actualizaciones", + "terminal": "Terminal", + "createDatastore": "Creación de datastore", + "other": "Otra tarea ({type})" + }, + "states": { + "ok": "OK", + "unknown": "Desconocido", + "warnings": "Advertencias: {count}", + "warning": "Advertencia", + "error": "Error" + }, + "serviceStates": { + "active": "Activo", + "inactive": "Inactivo", + "failed": "Fallido", + "activating": "Iniciando", + "deactivating": "Deteniendo", + "unknown": "Desconocido" + }, + "durationUnits": { + "seconds": "{count} s", + "minutes": "{count} min", + "hours": "{count} h", + "days": "{count} d" + }, + "urlHelp": "Incluye :8007 para el puerto predeterminado de PBS, por ejemplo https://pbs.example:8007.", + "usernameHelp": "Usa usuario@realm, por ejemplo root@pam.", + "tokenIdHelp": "Usa usuario@realm!token, por ejemplo monitor@pbs!proxmenux.", + "tokenSecretHelp": "Introduce el secreto de este token API.", + "tokenSecretKeepHelp": "Déjalo vacío para conservar el secreto del token guardado.", + "removeFailed": "No se pudo eliminar la conexión PBS.", + "savedRefreshFailed": "La conexión PBS se ha guardado, pero no se pudo actualizar la lista de conexiones. Recarga la página antes de hacer otro cambio.", + "removedRefreshFailed": "La conexión PBS se ha eliminado, pero no se pudo actualizar la lista de conexiones. Recarga la página.", + "technicalDetails": "Detalles técnicos", + "datastoreType": "Datastore" }, "_meta": "Community translation target. Copy keys from ../en/common.json and translate the values.", "app": { @@ -1306,7 +1384,9 @@ "update": "Actualizar", "modify": "Modificar", "recover": "Recuperar", + "registerRestored": "Registrar de nuevo", "terminalTitleUpdate": "Actualizar aplicación OCI", + "terminalTitleRecoverPrevious": "Recuperar la instalación OCI anterior", "terminalTitleModify": "Modificar aplicación OCI", "terminalTitleRecover": "Recuperar aplicación OCI restaurada", "terminalDescription": "Se ejecuta el mismo proceso que en el menú de ProxMenux: OCI manager Apps → Gestionar aplicaciones OCI instaladas.", @@ -1835,7 +1915,128 @@ "ociNewImage": "Nueva imagen", "ociImageCurrent": "Versión", "refreshData": "Actualizar datos", - "refreshingData": "Actualizando…" + "refreshingData": "Actualizando…", + "confirmRemove": "¿Eliminar el registro de esta aplicación de la pestaña App? Esto no desinstala la aplicación.", + "packageExample": "por ejemplo, {package}", + "packageHelpBefore": "Se rellena automáticamente a partir del nombre. Compruébalo con", + "packageHelpAfter": "dentro del CT.", + "binaryHelpBefore": "Ruta absoluta. Búscala con", + "binaryHelpOr": "o", + "errors": { + "ociBusy": "hay una operación OCI en curso en este contenedor", + "dpkgMissing": "{package} no está instalado mediante dpkg", + "dpkgFailed": "dpkg-query falló", + "dpkgNoVersion": "ninguna versión coincide en la salida de dpkg", + "apkFailed": "apk info falló", + "apkNoVersion": "ninguna versión coincide en la salida de apk", + "fileRead": "no se pudo leer {path}", + "fileNoMatch": "file_regex no coincide con {path}", + "binaryFailed": "falló la invocación del binario", + "binaryNoVersion": "ninguna versión coincide en la salida del binario", + "pythonFailed": "python -c importlib.metadata falló", + "pythonNoVersion": "ninguna versión coincide en la salida de la distribución de Python", + "dockerImageResolve": "no se pudo resolver la imagen instalada del contenedor", + "dockerInspectFailed": "docker inspect falló", + "dockerLabelMissing": "el contenedor no tiene la etiqueta {label}", + "dockerLabelMutable": "la etiqueta de docker indica {tag} (tag mutable, no una versión)", + "dockerLabelNoVersion": "ninguna versión coincide en la salida de la etiqueta de docker", + "dockerExecFailed": "docker exec falló", + "dockerExecNoVersion": "ninguna versión coincide en la salida de docker exec", + "commandEmpty": "command_argv está vacío", + "commandFailed": "el comando falló", + "commandNoVersion": "ninguna versión coincide en la salida del comando", + "unsupportedMethod": "método no compatible: {method}", + "unknownUpstream": "upstream_type desconocido: {type}", + "githubNotFound": "{repo}: no encontrado", + "githubRejected": "github rechazó la solicitud (403)", + "githubError": "error de github {code}", + "noRelease": "no hay tag ni nombre de release en la respuesta", + "tagNoMatch": "tag_regex no coincide con '{tag}'", + "httpError": "error http {code}", + "invalidJson": "respuesta JSON no válida: {detail}", + "jsonPathUnresolved": "json_path '{path}' no se pudo resolver", + "jsonEmpty": "valor vacío en json_path", + "dockerNoTags": "ningún tag coincide (docker_hub)", + "dockerMovingOnly": "tag_regex solo coincide con tags móviles; usa el seguimiento por digest de la imagen Docker", + "dockerHubError": "error de docker hub {code}", + "dockerHubJson": "JSON de docker hub no válido: {detail}", + "dockerHubEmpty": "docker hub no devolvió ningún tag", + "payload": "el payload debe ser un objeto JSON", + "name": "name es obligatorio y debe tener 1-64 caracteres de letras/dígitos/espacios/._+-()/", + "method": "installed_via debe ser uno de: {values} o vacío", + "package": "package es obligatorio (letras/dígitos/._+@:/ hasta 127 caracteres)", + "filePath": "file_path es obligatorio y debe ser una ruta absoluta", + "fileRegex": "file_regex es obligatorio", + "fileRegexInvalid": "file_regex no es una regex válida: {detail}", + "binaryPath": "binary_path es obligatorio y debe ser una ruta absoluta", + "pythonPath": "python_path es obligatorio y debe ser una ruta absoluta", + "distribution": "distribution es obligatorio (nombre PEP 503)", + "container": "container_name es obligatorio (reglas de nombres de docker)", + "label": "label es obligatorio (reglas de nombres de etiquetas OCI)", + "dockerBinary": "binary_path es obligatorio (ruta absoluta o comando simple)", + "manualVersion": "installed_version es obligatorio para el método manual", + "versionLength": "installed_version supera {max} caracteres", + "versionControl": "installed_version contiene un carácter de control no permitido", + "installedRegexInvalid": "installed_regex no es una regex válida: {detail}", + "upstreamType": "upstream_type debe ser uno de: {values}", + "tagRegexInvalid": "tag_regex no es una regex válida: {detail}", + "repoRequired": "repo es obligatorio para upstream_type=github", + "repoFormat": "repo debe tener el formato 'owner/name'", + "githubSource": "github_source debe ser uno de: {values}", + "upstreamUrlRequired": "upstream_url es obligatorio para upstream_type=http_json", + "upstreamUrl": "upstream_url debe ser una URL http(s)", + "upstreamUrlLength": "upstream_url supera {max} caracteres", + "jsonPathRequired": "upstream_json_path es obligatorio para upstream_type=http_json", + "jsonPathLength": "upstream_json_path supera {max} caracteres", + "jsonPathCharacters": "upstream_json_path usa caracteres no permitidos", + "dockerImageRequired": "docker_image es obligatorio para upstream_type=docker_hub", + "dockerImageLength": "docker_image supera {max} caracteres", + "dockerImageFormat": "docker_image debe seguir el formato de nombres de Docker Hub (owner/name o name)", + "healthPath": "health_path debe ser una ruta URL válida (máx. 255 caracteres)", + "logoUrl": "logo_url debe ser una URL http(s) o el icono local en caché de esta VM", + "discoveryId": "discovery_id no válido", + "helperSlug": "helper_slug debe ser un slug en minúsculas (letras/dígitos/._-)", + "updateVia": "update_via solo acepta 'docker'", + "dockerDetector": "update_via=docker requiere un detector docker_label o docker_exec", + "dockerConflict": "update_via=docker no se puede combinar con {field}", + "updateCommandType": "update_command debe ser una cadena", + "updateCommandLength": "update_command supera {max} caracteres", + "updateCommandNull": "update_command contiene un byte nulo", + "updateMethod": "update_method debe ser none, helper o custom", + "updateCommandRequired": "update_command es obligatorio para update_method=custom", + "updateCommandOnlyCustom": "update_command solo se permite con update_method=custom", + "helperRequired": "se requiere un helper_slug compatible para update_method=helper", + "dockerUpdater": "las aplicaciones delegadas en Docker se actualizan mediante su imagen, no con un actualizador de aplicación aparte", + "commandRequired": "command_argv es obligatorio (lista no vacía)", + "commandList": "command_argv debe ser una lista no vacía de cadenas", + "commandCount": "command_argv admite como máximo {max} entradas", + "commandEntry": "command_argv[{index}] debe ser una cadena no vacía", + "commandEntryLength": "command_argv[{index}] supera {max} caracteres", + "commandEntryControl": "command_argv[{index}] contiene un carácter de control no permitido", + "binaryArgsList": "binary_args debe ser una lista de cadenas", + "binaryArgsCount": "binary_args admite como máximo {max} entradas", + "binaryArgEntry": "binary_args[{index}] debe ser una cadena no vacía", + "binaryArgLength": "binary_args[{index}] supera {max} caracteres", + "binaryArgControl": "binary_args[{index}] contiene un carácter de control no permitido", + "portsList": "ports debe ser una lista de {port, description, scheme}", + "portObject": "ports[{index}] debe ser un objeto", + "portRequired": "ports[{index}].port es obligatorio", + "portInteger": "ports[{index}].port debe ser un número entero", + "portRange": "ports[{index}].port debe estar en el rango 1-65535", + "portDuplicate": "el puerto {port} aparece más de una vez en esta aplicación", + "portDescription": "ports[{index}].description tiene caracteres no válidos", + "portScheme": "ports[{index}].scheme debe ser 'http' o 'https'", + "portPath": "ports[{index}].web_path debe ser una ruta URL válida (máx. 255 caracteres)", + "portLogo": "ports[{index}].logo_url debe ser una URL http(s) (máx. 512 caracteres)", + "portCategory": "ports[{index}].category tiene caracteres no válidos o es demasiado largo", + "portCustomUrl": "ports[{index}].custom_url debe ser una URL http(s) (máx. 512 caracteres)", + "tagRegexLength": "tag_regex supera 512 caracteres", + "persistPermission": "no se pudo guardar el sidecar (¿permisos?)", + "persist": "no se pudo guardar el sidecar", + "noApps": "no hay aplicaciones registradas para este vmid", + "appMissing": "no se encontró app_id '{appId}'", + "appNotFound": "aplicación no encontrada" + } }, "statusFilter": { "ariaLabel": "Filtrar máquinas virtuales y contenedores", @@ -2369,6 +2570,42 @@ "updateManyDescription": "Volver a ejecutar {count} funciones posteriores a la instalación en secuencia.", "legacySourceTitle": "Optimización heredada: haz clic para ver la fuente", "sourceTitle": "Haz clic para ver el código fuente", + "sourceDialogTitle": "Código fuente: {name}", + "sourceLoading": "Cargando el código fuente…", + "sourceUnavailable": "El código fuente no está disponible.", + "sourceLoadFailed": "No se pudo cargar el código fuente. Vuelve a intentarlo.", + "sourceFunctionMissing": "No se encontró la función en los scripts disponibles.", + "sourceUnknownTool": "Herramienta desconocida: {tool}", + "sourceNoMapping": "No hay ninguna función asignada a la herramienta {tool}.", + "sourceToolNames": { + "subscription_banner": "Eliminación del banner de suscripción", + "time_sync": "Sincronización horaria", + "apt_languages": "Omitir idiomas de APT", + "journald": "Optimización de Journald", + "logrotate": "Optimización de Logrotate", + "system_limits": "Aumento de los límites del sistema", + "memory_settings": "Optimización de la configuración de memoria", + "zram_swap": "Perfil de swap con ZRAM", + "kernel_panic": "Configuración de kernel panic", + "apt_ipv4": "Forzar IPv4 en APT", + "kexec": "kexec para reinicios rápidos", + "rpc": "Desactivar RPC / rpcbind", + "motd": "Banner MOTD personalizado", + "system_utils": "Utilidades del sistema", + "network_optimization": "Optimizaciones de red", + "bashrc_custom": "Personalización de Bashrc", + "figurine": "Figurine", + "fastfetch": "Fastfetch", + "log2ram": "Log2ram (protección de SSD)", + "zfs_autotrim": "ZFS Autotrim", + "amd_fixes": "Correcciones para CPU AMD (Ryzen/EPYC)", + "persistent_network": "Configurar interfaces de red persistentes", + "vfio_iommu": "Passthrough VFIO/IOMMU", + "lvm_repair": "Reparación de cabeceras PV de LVM", + "repo_cleanup": "Limpieza de repositorios", + "proxmox_repos": "Repositorios APT de Proxmox", + "entropy": "Generación de entropía (haveged)" + }, "legacy": "legado", "updateToolTitle": "Actualizar {name} a v{version}", "availableUpdates": "Actualizaciones disponibles", @@ -4895,6 +5132,124 @@ "effect": "Se aplica a los próximos backups que hereden la política de este almacenamiento. Guardar no elimina los backups existentes, y los protegidos siguen protegidos.", "cancel": "Cancelar", "save": "Guardar retención" + }, + "apiErrors": { + "requestFailed": "La solicitud ha fallado.", + "absolutePath": "la ruta debe ser absoluta", + "pathConfigured": "esta ruta ya está configurada", + "pathRequired": "la ruta es obligatoria", + "pathQuery": "el parámetro de consulta path es obligatorio", + "pathNotFound": "ruta no encontrada", + "invalidJobId": "id de tarea no válido", + "jobNotFound": "tarea no encontrada", + "runnerMissing": "el script de ejecución no está instalado", + "noRestore": "no hay ningún estado de restauración que descartar", + "invalidFile": "nombre de archivo no válido", + "notFound": "no encontrado", + "logOutside": "la ruta del log está fuera del directorio permitido", + "targetsList": "targets debe ser una lista", + "emptyExpression": "expresión vacía", + "invalidId": "id no válido (usa letras, dígitos, _ o -)", + "backend": "backend debe ser pbs, local o borg", + "remoteBackend": "backend debe ser pbs o borg", + "remoteBackendQuoted": "backend debe ser 'pbs' o 'borg'", + "profileMode": "profile_mode debe ser default o custom", + "borgAttached": "borg no se puede vincular (vzdump de PVE solo escribe en almacenamientos pbs/local)", + "borgAttachedLong": "borg no es un backend válido para tareas vinculadas (vzdump de PVE solo escribe en almacenamientos pbs/local)", + "parentRequired": "pve_parent_job_id y pve_storage son obligatorios para attached", + "absolutePaths": "paths debe ser una lista de rutas absolutas", + "customPath": "el perfil personalizado necesita al menos una ruta", + "defaultPaths": "no se pudieron resolver las rutas del perfil predeterminado", + "retentionObject": "retention debe ser un objeto", + "pbsRepository": "pbs_repository es obligatorio", + "pbsEncryption": "pbs_encrypt_mode debe ser 'none', 'new' o 'existing'", + "pbsKeyFailed": "no se pudo crear el archivo de claves de cifrado de PBS", + "pbsClientMissing": "no se pudo crear el archivo de claves de cifrado de PBS (¿está instalado proxmox-backup-client?)", + "borgRepository": "borg_repo es obligatorio", + "borgEncryption": "borg_encrypt_mode debe ser uno de: none, repokey, keyfile, authenticated", + "encryption": "encrypt_mode debe ser uno de: none, repokey, keyfile, authenticated", + "borgPassphrase": "borg_passphrase es obligatorio cuando el cifrado está activado (guárdala en el destino o indica una en la solicitud)", + "passphrase": "la frase de contraseña es obligatoria cuando el cifrado está activado", + "password": "la contraseña es obligatoria", + "deviceConfirmation": "confirm_device debe coincidir exactamente con device (comprobación de errores tipográficos / seguridad)", + "invalidDevice": "ruta de dispositivo no válida", + "absoluteMountpoint": "se requiere un punto de montaje absoluto", + "archiveLayout": "estructura del archivo no reconocida: no se encontró rootfs/", + "archiveMissing": "archivo no encontrado", + "archiveNotFile": "la ruta del archivo no es un archivo regular", + "invalidName": "nombre no válido", + "invalidStaging": "staging_path no válido", + "jobRename": "no se puede cambiar el nombre de la tarea (elimínala y vuelve a crearla para renombrarla)", + "absoluteKey": "key_path debe ser absoluta", + "mode": "mode debe ser \"local\" o \"ssh\"", + "nameRequired": "el nombre es obligatorio (letras, dígitos, _ o -)", + "noLog": "aún no hay ningún log disponible para esta tarea", + "noPbsConfig": "no hay archivo de configuraciones manuales de PBS", + "outputMissing": "falta el archivo de salida", + "parserJson": "la salida del analizador no era un JSON válido", + "restoreJson": "la salida de run_restore no era un JSON válido", + "repoRequired": "repo es obligatorio", + "repoSnapshot": "repo_name y snapshot son obligatorios", + "borgRepoSnapshot": "repo_name y snapshot son obligatorios para borg", + "pbsRepoSnapshot": "repo_name y snapshot son obligatorios para pbs", + "repoName": "repo_name es obligatorio", + "restoreMissing": "las herramientas de restauración no están instaladas en este host", + "serverDatastore": "el servidor y el datastore son obligatorios", + "snapshotRequired": "el snapshot es obligatorio", + "source": "source debe ser pbs, borg o local", + "sshPort": "ssh_port debe ser un número entero entre 1 y 65535", + "sshRequired": "ssh_user, ssh_host y ssh_remote_path son obligatorios en el modo ssh", + "repositoryPath": "el destino no tiene ruta de repositorio", + "taskExpired": "tarea no encontrada o caducada", + "invalidExpression": "expresión no válida", + "noReport": "no se ha emitido ningún informe", + "parseManifestFailed": "parse_manifest terminó con un código distinto de cero", + "jobExists": "la tarea ya existe: {value}", + "pathMissing": "la ruta no existe en este host: {value}", + "deviceMissing": "el dispositivo no existe: {value}", + "mountpoint": "no es un punto de montaje: {value}", + "localArchiveMissing": "archivo local no encontrado: {value}", + "borgDestination": "no se encontró el destino Borg '{value}'", + "pbsDestination": "no se encontró el destino PBS '{value}'", + "pbsPassword": "no hay contraseña disponible para el repo PBS '{value}'", + "borgRepoMissing": "el repo Borg \"{value}\" no está configurado", + "pbsRepoMissing": "el repo PBS \"{value}\" no está configurado", + "borgTargetMissing": "destino Borg no encontrado: {value}", + "pbsTargetMissing": "repo PBS no encontrado: {value}", + "pveJobMissing": "tarea vzdump de PVE no encontrada: {value}", + "statePersist": "no se puede guardar el estado: {value}", + "sshDirectory": "no se puede preparar el directorio ssh: {value}", + "logRead": "no se puede leer el log: {value}", + "envUpdate": "no se pudo actualizar .env: {value}", + "pbsConfigWrite": "no se pudo guardar la configuración de PBS: {value}", + "persist": "no se pudo guardar: {value}", + "archiveRemove": "no se pudo eliminar el archivo: {value}", + "start": "no se pudo iniciar: {value}", + "borgTargetsUpdate": "no se pudo actualizar borg-targets.txt: {value}", + "pbsTargetsUpdate": "no se pudo actualizar pbs-manual-configs.txt: {value}", + "unitsUpdate": "no se pudieron actualizar las unidades de systemd: {value}", + "borgTargetsWrite": "no se pudo escribir borg-targets.txt: {value}", + "jobWrite": "no se pudieron escribir los archivos de la tarea: {value}", + "localTargetWrite": "no se pudo escribir local-target.conf: {value}", + "unitsWrite": "no se pudieron escribir las unidades de systemd: {value}", + "format": "falló el formateo: {value}", + "calendar": "on_calendar no válido: {value}", + "mount": "falló el montaje: {value}", + "parserInvocation": "falló la invocación del analizador: {value}", + "preflightInvocation": "falló la invocación de la verificación previa: {value}", + "publicKeyMissing": "no se encontró la clave pública tras generarla: {value}", + "retentionInteger": "retention.{value} debe ser un número entero", + "retentionNegative": "retention.{value} no puede ser negativo", + "keygen": "ssh-keygen falló: {value}", + "systemctl": "systemctl falló: {value}", + "unmount": "umount falló: {value}", + "taskIncomplete": "la tarea está en estado \"{value}\", no completada", + "unknownKind": "tipo desconocido: {value}", + "unknownMode": "modo desconocido \"{value}\"", + "defaultRemove": "{value} es el valor predeterminado integrado y no se puede eliminar", + "defaultAdd": "{value} es el valor predeterminado integrado; no hace falta añadirlo", + "keyImport": "No hay ningún archivo de claves de PBS instalado en {value}. Importa primero el archivo de claves.", + "storageMismatch": "el almacenamiento de la tarea de PVE no coincide (la tarea usa {value}, el payload indica {other})" } }, "healthStatus": { @@ -5396,6 +5751,7 @@ "websocketError": "Ocurrió un error en WebSocket", "connectionClosed": "Conexión cerrada", "completedSuccessfully": "Guión completado con éxito", + "cancelled": "Operación cancelada.", "completedWithError": "Script terminado con el código de error {code}", "yes": "Sí", "yourInput": "Su entrada:", @@ -7408,6 +7764,17 @@ "addSelected": "Añadir seleccionados", "pbsWebInterface": "Interfaz web de PBS", "changeAddress": "Cambiar dirección", - "cancel": "Cancelar" + "cancel": "Cancelar", + "errors": { + "addressRequired": "Introduce la dirección del Monitor.", + "invalidAddress": "La dirección debe empezar por http:// o https:// e indicar un host.", + "addressCredentials": "La dirección no debe contener un usuario ni una contraseña.", + "invalidPort": "El puerto de la dirección no es válido.", + "invalidRequest": "La solicitud no es válida. Recarga la página y vuelve a intentarlo.", + "limit": "Se pueden añadir como máximo {count} nodos.", + "duplicate": "Esta dirección ya está en la lista.", + "notFound": "No se encontró el nodo. Recarga la lista y vuelve a intentarlo.", + "detectedRemove": "Solo se pueden eliminar los nodos añadidos a mano. Los nodos detectados se pueden ocultar." + } } } diff --git a/AppImage/messages/fr/common.json b/AppImage/messages/fr/common.json index eaa33dab..a19b65c1 100644 --- a/AppImage/messages/fr/common.json +++ b/AppImage/messages/fr/common.json @@ -1231,7 +1231,9 @@ "update": "Mettre à jour", "modify": "Modifier", "recover": "Récupérer", + "registerRestored": "Enregistrer à nouveau", "terminalTitleUpdate": "Mettre à jour l'application OCI", + "terminalTitleRecoverPrevious": "Récupérer l'installation OCI précédente", "terminalTitleModify": "Modifier l'application OCI", "terminalTitleRecover": "Récupérer l'application OCI restaurée", "terminalDescription": "Le même processus que dans le menu ProxMenux s'exécute : OCI manager Apps → Gérer les applications OCI installées.", @@ -1760,7 +1762,128 @@ "dockerEvidenceImage": "Image", "dockerEvidencePort": "Port TCP publié", "dockerEvidenceProject": "Projet Compose", - "dockerEndpointReview": "Conteneur avec des ports TCP publiés. Confirmez le nom et l'adresse web avant d'enregistrer. L'enregistrement ne configure pas les mises à jour." + "dockerEndpointReview": "Conteneur avec des ports TCP publiés. Confirmez le nom et l'adresse web avant d'enregistrer. L'enregistrement ne configure pas les mises à jour.", + "confirmRemove": "Supprimer l'enregistrement de cette application de l'onglet App ? Cela ne désinstalle pas l'application.", + "packageExample": "par ex. {package}", + "packageHelpBefore": "Rempli automatiquement à partir du nom. Vérifiez avec", + "packageHelpAfter": "dans le CT.", + "binaryHelpBefore": "Chemin absolu. Trouvez-le avec", + "binaryHelpOr": "ou", + "errors": { + "ociBusy": "une opération OCI est en cours sur ce conteneur", + "dpkgMissing": "{package} n'est pas installé via dpkg", + "dpkgFailed": "échec de dpkg-query", + "dpkgNoVersion": "aucune version trouvée dans la sortie de dpkg", + "apkFailed": "échec de apk info", + "apkNoVersion": "aucune version trouvée dans la sortie de apk", + "fileRead": "impossible de lire {path}", + "fileNoMatch": "file_regex ne correspond pas à {path}", + "binaryFailed": "échec de l'appel du binaire", + "binaryNoVersion": "aucune version trouvée dans la sortie du binaire", + "pythonFailed": "échec de python -c importlib.metadata", + "pythonNoVersion": "aucune version trouvée dans la sortie de la distribution Python", + "dockerImageResolve": "impossible de déterminer l'image installée du conteneur", + "dockerInspectFailed": "échec de docker inspect", + "dockerLabelMissing": "le conteneur n'a pas d'étiquette {label}", + "dockerLabelMutable": "l'étiquette docker indique {tag} (tag mobile, pas une version)", + "dockerLabelNoVersion": "aucune version trouvée dans la sortie de l'étiquette docker", + "dockerExecFailed": "échec de docker exec", + "dockerExecNoVersion": "aucune version trouvée dans la sortie de docker exec", + "commandEmpty": "command_argv est vide", + "commandFailed": "échec de la commande", + "commandNoVersion": "aucune version trouvée dans la sortie de la commande", + "unsupportedMethod": "méthode non prise en charge : {method}", + "unknownUpstream": "upstream_type inconnu : {type}", + "githubNotFound": "{repo} : introuvable", + "githubRejected": "github a refusé la requête (403)", + "githubError": "erreur github {code}", + "noRelease": "aucun tag ni nom de release dans la réponse", + "tagNoMatch": "tag_regex ne correspond pas à '{tag}'", + "httpError": "erreur http {code}", + "invalidJson": "réponse JSON non valide : {detail}", + "jsonPathUnresolved": "json_path '{path}' n'a pas pu être résolu", + "jsonEmpty": "valeur vide à json_path", + "dockerNoTags": "aucun tag ne correspond (docker_hub)", + "dockerMovingOnly": "tag_regex ne correspond qu'à des tags mobiles ; utilisez le suivi par digest de l'image Docker", + "dockerHubError": "erreur docker hub {code}", + "dockerHubJson": "JSON docker hub non valide : {detail}", + "dockerHubEmpty": "aucun tag renvoyé par docker hub", + "payload": "la charge utile doit être un objet JSON", + "name": "name est obligatoire et doit comporter de 1 à 64 caractères parmi lettres/chiffres/espaces/._+-()/", + "method": "installed_via doit être l'une des valeurs suivantes : {values} ou vide", + "package": "package est obligatoire (lettres/chiffres/._+@:/, 127 caractères max.)", + "filePath": "file_path est obligatoire et doit être un chemin absolu", + "fileRegex": "file_regex est obligatoire", + "fileRegexInvalid": "file_regex n'est pas une regex valide : {detail}", + "binaryPath": "binary_path est obligatoire et doit être un chemin absolu", + "pythonPath": "python_path est obligatoire et doit être un chemin absolu", + "distribution": "distribution est obligatoire (nom PEP 503)", + "container": "container_name est obligatoire (règles de nommage docker)", + "label": "label est obligatoire (règles de nommage des étiquettes OCI)", + "dockerBinary": "binary_path est obligatoire (chemin absolu ou commande seule)", + "manualVersion": "installed_version est obligatoire pour la méthode manuelle", + "versionLength": "installed_version dépasse {max} caractères", + "versionControl": "installed_version contient un caractère de contrôle interdit", + "installedRegexInvalid": "installed_regex n'est pas une regex valide : {detail}", + "upstreamType": "upstream_type doit être l'une des valeurs suivantes : {values}", + "tagRegexInvalid": "tag_regex n'est pas une regex valide : {detail}", + "repoRequired": "repo est obligatoire pour upstream_type=github", + "repoFormat": "repo doit être au format 'owner/name'", + "githubSource": "github_source doit être l'une des valeurs suivantes : {values}", + "upstreamUrlRequired": "upstream_url est obligatoire pour upstream_type=http_json", + "upstreamUrl": "upstream_url doit être une URL http(s)", + "upstreamUrlLength": "upstream_url dépasse {max} caractères", + "jsonPathRequired": "upstream_json_path est obligatoire pour upstream_type=http_json", + "jsonPathLength": "upstream_json_path dépasse {max} caractères", + "jsonPathCharacters": "upstream_json_path utilise des caractères interdits", + "dockerImageRequired": "docker_image est obligatoire pour upstream_type=docker_hub", + "dockerImageLength": "docker_image dépasse {max} caractères", + "dockerImageFormat": "docker_image doit respecter le nommage Docker Hub (owner/name ou name)", + "healthPath": "health_path doit être un chemin d'URL valide (255 caractères max.)", + "logoUrl": "logo_url doit être une URL http(s) ou l'icône locale en cache de cette VM", + "discoveryId": "discovery_id non valide", + "helperSlug": "helper_slug doit être un slug en minuscules (lettres/chiffres/._-)", + "updateVia": "update_via n'accepte que 'docker'", + "dockerDetector": "update_via=docker nécessite un détecteur docker_label ou docker_exec", + "dockerConflict": "update_via=docker ne peut pas être combiné avec {field}", + "updateCommandType": "update_command doit être une chaîne", + "updateCommandLength": "update_command dépasse {max} caractères", + "updateCommandNull": "update_command contient un octet nul", + "updateMethod": "update_method doit être none, helper ou custom", + "updateCommandRequired": "update_command est obligatoire pour update_method=custom", + "updateCommandOnlyCustom": "update_command n'est autorisé que pour update_method=custom", + "helperRequired": "un helper_slug pris en charge est obligatoire pour update_method=helper", + "dockerUpdater": "Les applications déléguées à Docker se mettent à jour via leur image, pas via un outil de mise à jour d'application distinct", + "commandRequired": "command_argv est obligatoire (liste non vide)", + "commandList": "command_argv doit être une liste non vide de chaînes", + "commandCount": "command_argv accepte au maximum {max} entrées", + "commandEntry": "command_argv[{index}] doit être une chaîne non vide", + "commandEntryLength": "command_argv[{index}] dépasse {max} caractères", + "commandEntryControl": "command_argv[{index}] contient un caractère de contrôle interdit", + "binaryArgsList": "binary_args doit être une liste de chaînes", + "binaryArgsCount": "binary_args accepte au maximum {max} entrées", + "binaryArgEntry": "binary_args[{index}] doit être une chaîne non vide", + "binaryArgLength": "binary_args[{index}] dépasse {max} caractères", + "binaryArgControl": "binary_args[{index}] contient un caractère de contrôle interdit", + "portsList": "ports doit être une liste de {port, description, scheme}", + "portObject": "ports[{index}] doit être un objet", + "portRequired": "ports[{index}].port est obligatoire", + "portInteger": "ports[{index}].port doit être un entier", + "portRange": "ports[{index}].port doit être compris entre 1 et 65535", + "portDuplicate": "le port {port} apparaît plusieurs fois pour cette application", + "portDescription": "ports[{index}].description contient des caractères non valides", + "portScheme": "ports[{index}].scheme doit être 'http' ou 'https'", + "portPath": "ports[{index}].web_path doit être un chemin d'URL valide (255 caractères max.)", + "portLogo": "ports[{index}].logo_url doit être une URL http(s) (512 caractères max.)", + "portCategory": "ports[{index}].category contient des caractères non valides ou est trop long", + "portCustomUrl": "ports[{index}].custom_url doit être une URL http(s) (512 caractères max.)", + "tagRegexLength": "tag_regex dépasse 512 caractères", + "persistPermission": "impossible d'enregistrer le fichier sidecar (problème de permissions ?)", + "persist": "impossible d'enregistrer le fichier sidecar", + "noApps": "aucune application enregistrée pour ce vmid", + "appMissing": "app_id '{appId}' introuvable", + "appNotFound": "application introuvable" + } }, "statusFilter": { "ariaLabel": "Filtrer les machines virtuelles et les conteneurs", @@ -2294,6 +2417,42 @@ "updateManyDescription": "Réexécution des fonctions de post-installation {count} dans l'ordre.", "legacySourceTitle": "Optimisation héritée – cliquez pour afficher la source", "sourceTitle": "Cliquez pour voir le code source", + "sourceDialogTitle": "Code source : {name}", + "sourceLoading": "Chargement du code source…", + "sourceUnavailable": "Le code source n'est pas disponible.", + "sourceLoadFailed": "Impossible de charger le code source. Réessayez.", + "sourceFunctionMissing": "La fonction est introuvable dans les scripts disponibles.", + "sourceUnknownTool": "Outil inconnu : {tool}", + "sourceNoMapping": "Aucune fonction n'est associée à l'outil {tool}.", + "sourceToolNames": { + "subscription_banner": "Suppression de la bannière d'abonnement", + "time_sync": "Synchronisation de l'heure", + "apt_languages": "Ignorer les langues APT", + "journald": "Optimisation de journald", + "logrotate": "Optimisation de logrotate", + "system_limits": "Augmentation des limites du système", + "memory_settings": "Optimisation des paramètres de mémoire", + "zram_swap": "Profil d'échange ZRAM", + "kernel_panic": "Configuration de la panique du noyau", + "apt_ipv4": "Forcer IPv4 pour APT", + "kexec": "kexec pour des redémarrages rapides", + "rpc": "Désactivation de RPC / rpcbind", + "motd": "Bannière MOTD personnalisée", + "system_utils": "Utilitaires système", + "network_optimization": "Optimisations du réseau", + "bashrc_custom": "Personnalisation de Bashrc", + "figurine": "Figurine", + "fastfetch": "Fastfetch", + "log2ram": "Log2ram (protection SSD)", + "zfs_autotrim": "Autotrim ZFS", + "amd_fixes": "Correctifs CPU AMD (Ryzen/EPYC)", + "persistent_network": "Configuration d'interfaces réseau persistantes", + "vfio_iommu": "Passthrough VFIO/IOMMU", + "lvm_repair": "Réparation des en-têtes PV LVM", + "repo_cleanup": "Nettoyage des référentiels", + "proxmox_repos": "Référentiels APT Proxmox", + "entropy": "Génération d'entropie (haveged)" + }, "legacy": "héritage", "updateToolTitle": "Mettez à jour {name} vers v{version}", "availableUpdates": "Mises à jour disponibles", @@ -4820,6 +4979,124 @@ "cancel": "Annuler", "save": "Enregistrer la rétention", "useDefault": "Utiliser la valeur par défaut de Proxmox (aucune politique sur ce stockage)" + }, + "apiErrors": { + "requestFailed": "La requête a échoué.", + "absolutePath": "le chemin doit être absolu", + "pathConfigured": "ce chemin est déjà configuré", + "pathRequired": "le chemin est obligatoire", + "pathQuery": "le paramètre de requête path est obligatoire", + "pathNotFound": "chemin introuvable", + "invalidJobId": "ID de tâche non valide", + "jobNotFound": "tâche introuvable", + "runnerMissing": "script d'exécution non installé", + "noRestore": "aucun état de restauration à ignorer", + "invalidFile": "nom de fichier non valide", + "notFound": "introuvable", + "logOutside": "chemin du journal hors du répertoire autorisé", + "targetsList": "targets doit être une liste", + "emptyExpression": "expression vide", + "invalidId": "ID non valide (utilisez des lettres, des chiffres, _ ou -)", + "backend": "le backend doit être pbs, local ou borg", + "remoteBackend": "le backend doit être pbs ou borg", + "remoteBackendQuoted": "le backend doit être 'pbs' ou 'borg'", + "profileMode": "profile_mode doit être default ou custom", + "borgAttached": "borg ne peut pas être rattaché (vzdump de PVE n'écrit que sur des stockages pbs/local)", + "borgAttachedLong": "borg n'est pas un backend valide pour les tâches rattachées (vzdump de PVE n'écrit que sur des stockages pbs/local)", + "parentRequired": "pve_parent_job_id et pve_storage sont obligatoires pour une tâche rattachée", + "absolutePaths": "paths doit être une liste de chemins absolus", + "customPath": "le profil personnalisé nécessite au moins un chemin", + "defaultPaths": "impossible de déterminer les chemins du profil par défaut", + "retentionObject": "retention doit être un objet", + "pbsRepository": "pbs_repository est obligatoire", + "pbsEncryption": "pbs_encrypt_mode doit être 'none', 'new' ou 'existing'", + "pbsKeyFailed": "échec de la création du fichier de clé de chiffrement PBS", + "pbsClientMissing": "échec de la création du fichier de clé de chiffrement PBS (proxmox-backup-client est-il installé ?)", + "borgRepository": "borg_repo est obligatoire", + "borgEncryption": "borg_encrypt_mode doit être l'une des valeurs suivantes : none, repokey, keyfile, authenticated", + "encryption": "encrypt_mode doit être l'une des valeurs suivantes : none, repokey, keyfile, authenticated", + "borgPassphrase": "borg_passphrase est obligatoire lorsque le chiffrement est activé (enregistrez-la sur la destination ou transmettez-en une dans la requête)", + "passphrase": "la phrase secrète est obligatoire lorsque le chiffrement est activé", + "password": "le mot de passe est obligatoire", + "deviceConfirmation": "confirm_device doit correspondre exactement au périphérique (contrôle de frappe / sécurité)", + "invalidDevice": "chemin de périphérique non valide", + "absoluteMountpoint": "point de montage absolu requis", + "archiveLayout": "structure d'archive non reconnue — aucun rootfs/ trouvé", + "archiveMissing": "archive introuvable", + "archiveNotFile": "le chemin de l'archive n'est pas un fichier ordinaire", + "invalidName": "nom non valide", + "invalidStaging": "staging_path non valide", + "jobRename": "le nom de la tâche ne peut pas être modifié (supprimez-la puis recréez-la pour la renommer)", + "absoluteKey": "key_path doit être absolu", + "mode": "mode doit être \"local\" ou \"ssh\"", + "nameRequired": "le nom est obligatoire (lettres, chiffres, _ ou -)", + "noLog": "aucun journal disponible pour cette tâche pour le moment", + "noPbsConfig": "aucun fichier de configurations PBS manuelles", + "outputMissing": "fichier de sortie manquant", + "parserJson": "la sortie de l'analyseur n'était pas un JSON valide", + "restoreJson": "la sortie de run_restore n'était pas un JSON valide", + "repoRequired": "repo est obligatoire", + "repoSnapshot": "repo_name et snapshot sont obligatoires", + "borgRepoSnapshot": "repo_name et snapshot sont obligatoires pour borg", + "pbsRepoSnapshot": "repo_name et snapshot sont obligatoires pour pbs", + "repoName": "repo_name est obligatoire", + "restoreMissing": "outils de restauration non installés sur cet hôte", + "serverDatastore": "server et datastore sont obligatoires", + "snapshotRequired": "snapshot est obligatoire", + "source": "source doit être pbs, borg ou local", + "sshPort": "ssh_port doit être un entier compris entre 1 et 65535", + "sshRequired": "ssh_user, ssh_host et ssh_remote_path sont obligatoires pour le mode ssh", + "repositoryPath": "la cible n'a pas de chemin de référentiel", + "taskExpired": "tâche introuvable ou expirée", + "invalidExpression": "expression non valide", + "noReport": "aucun rapport émis", + "parseManifestFailed": "parse_manifest s'est terminé avec un code non nul", + "jobExists": "la tâche existe déjà : {value}", + "pathMissing": "le chemin n'existe pas sur cet hôte : {value}", + "deviceMissing": "le périphérique n'existe pas : {value}", + "mountpoint": "pas un point de montage : {value}", + "localArchiveMissing": "archive locale introuvable : {value}", + "borgDestination": "Destination Borg '{value}' introuvable", + "pbsDestination": "Destination PBS '{value}' introuvable", + "pbsPassword": "aucun mot de passe disponible pour le référentiel PBS '{value}'", + "borgRepoMissing": "Référentiel Borg \"{value}\" non configuré", + "pbsRepoMissing": "Référentiel PBS \"{value}\" non configuré", + "borgTargetMissing": "Cible Borg introuvable : {value}", + "pbsTargetMissing": "Référentiel PBS introuvable : {value}", + "pveJobMissing": "Tâche vzdump PVE introuvable : {value}", + "statePersist": "impossible d'enregistrer l'état : {value}", + "sshDirectory": "impossible de préparer le répertoire ssh : {value}", + "logRead": "impossible de lire le journal : {value}", + "envUpdate": "impossible de mettre à jour .env : {value}", + "pbsConfigWrite": "échec de l'enregistrement de la configuration PBS : {value}", + "persist": "échec de l'enregistrement : {value}", + "archiveRemove": "échec de la suppression de l'archive : {value}", + "start": "échec du démarrage : {value}", + "borgTargetsUpdate": "échec de la mise à jour de borg-targets.txt : {value}", + "pbsTargetsUpdate": "échec de la mise à jour de pbs-manual-configs.txt : {value}", + "unitsUpdate": "échec de la mise à jour des unités systemd : {value}", + "borgTargetsWrite": "échec de l'écriture de borg-targets.txt : {value}", + "jobWrite": "échec de l'écriture des fichiers de la tâche : {value}", + "localTargetWrite": "échec de l'écriture de local-target.conf : {value}", + "unitsWrite": "échec de l'écriture des unités systemd : {value}", + "format": "échec du formatage : {value}", + "calendar": "on_calendar non valide : {value}", + "mount": "échec du montage : {value}", + "parserInvocation": "échec de l'appel de l'analyseur : {value}", + "preflightInvocation": "échec de l'appel de la vérification préalable : {value}", + "publicKeyMissing": "clé publique introuvable après la génération : {value}", + "retentionInteger": "retention.{value} doit être un entier", + "retentionNegative": "retention.{value} doit être positif ou nul", + "keygen": "échec de ssh-keygen : {value}", + "systemctl": "échec de systemctl : {value}", + "unmount": "échec de umount : {value}", + "taskIncomplete": "la tâche est dans l'état \"{value}\", et non terminée", + "unknownKind": "type inconnu : {value}", + "unknownMode": "mode inconnu \"{value}\"", + "defaultRemove": "{value} est la valeur par défaut intégrée et ne peut pas être supprimé", + "defaultAdd": "{value} est la valeur par défaut intégrée ; inutile de l'ajouter", + "keyImport": "Aucun fichier de clé PBS n'est installé dans {value}. Importez d'abord le fichier de clé.", + "storageMismatch": "Incohérence du stockage de la tâche PVE (la tâche utilise {value}, la requête indique {other})" } }, "healthStatus": { @@ -5320,6 +5597,7 @@ "websocketError": "Une erreur WebSocket s'est produite", "connectionClosed": "Connexion fermée", "completedSuccessfully": "Script terminé avec succès", + "cancelled": "Opération annulée.", "completedWithError": "Script terminé avec le code d'erreur {code}", "yes": "Oui", "yourInput": "Votre contribution :", @@ -7311,7 +7589,7 @@ "signInWith": "Se connecter avec", "methodPassword": "Utilisateur et mot de passe", "methodToken": "Jeton API", - "username": "Utilisateur (utilisateur@realm)", + "username": "Utilisateur", "password": "Mot de passe", "passwordHelp": "Le mot de passe n'est utilisé qu'une fois pour créer un jeton API en lecture seule (rôle Audit) pour ce Monitor. Seul ce jeton est enregistré, jamais le mot de passe. Activez d'abord l'authentification du Monitor.", "cancel": "Annuler", @@ -7324,10 +7602,10 @@ "editConnection": "Connexion à modifier", "add": "Ajouter une connexion", "name": "Nom", - "url": "URL HTTPS (inclure :8007 pour le port natif de PBS)", - "token_id": "Identifiant du jeton API (user@realm!token)", - "token_secret": "Secret du jeton API (laisser vide pour conserver le secret enregistré)", - "fingerprint": "Empreinte SHA256 du certificat (facultative)", + "url": "Adresse HTTPS", + "token_id": "ID du jeton API", + "token_secret": "Secret du jeton API", + "fingerprint": "Empreinte SHA256 (facultative)", "tlsHelp": "Laissez l'empreinte vide pour la vérification habituelle de l'autorité de certification et du nom d'hôte. Pour un certificat autosigné, copiez son empreinte SHA256 depuis la console PBS ou un autre canal de confiance. L'empreinte est vérifiée avant l'envoi des identifiants.", "saved": "Connexion PBS vérifiée et enregistrée.", "saveFailed": "Impossible d'enregistrer la connexion PBS.", @@ -7369,7 +7647,85 @@ "estimatedFull": "Estimé complet", "estimatedFullUnknown": "Pas encore assez de données", "duration": "Durée", - "noJobs": "Aucune planification de synchronisation, de vérification ou d'élagage n'est configurée." + "noJobs": "Aucune planification de synchronisation, de vérification ou d'élagage n'est configurée.", + "errors": { + "configRead": "Impossible de lire les connexions PBS enregistrées. Vérifiez le fichier de configuration et les permissions.", + "invalidConfig": "Les paramètres de connexion PBS ne sont pas valides. Vérifiez le formulaire et réessayez.", + "invalidField": "Un champ de la connexion n'est pas valide ou est trop long.", + "invalidUrl": "Utilisez une adresse PBS HTTPS sans identifiants intégrés, paramètres de requête ni fragment.", + "nameRequired": "Saisissez un nom de serveur de 128 caractères au maximum.", + "tokenIdFormat": "Saisissez l'ID du jeton API PBS au format user@realm!token.", + "tokenSecret": "Saisissez un secret de jeton API valide, sans espaces ni caractères de contrôle.", + "invalidTokenId": "L'ID du jeton API ne doit contenir que des caractères ASCII.", + "invalidFingerprint": "Saisissez l'empreinte SHA256 du certificat : 64 caractères hexadécimaux, éventuellement séparés par des deux-points.", + "fingerprintMismatch": "Le certificat PBS ne correspond pas à l'empreinte. Aucun identifiant n'a été envoyé.", + "tokenRejected": "PBS a refusé le jeton API ou ses permissions. Vérifiez les ACL de l'utilisateur et du jeton.", + "invalidResponse": "PBS a renvoyé une réponse inattendue. Les redirections ne sont pas suivies.", + "invalidJson": "PBS a renvoyé un document JSON non valide.", + "connectFailed": "Impossible de se connecter à PBS en HTTPS vérifié. Vérifiez l'adresse, le certificat et le service.", + "invalidId": "L'ID de la connexion PBS n'est pas valide. Rechargez la liste des connexions.", + "invalidDatastores": "PBS a renvoyé une liste de magasins de données non valide.", + "connectionLimit": "Vous pouvez configurer au maximum {count} connexions PBS.", + "username": "Saisissez l'utilisateur PBS au format user@realm, par exemple root@pam.", + "password": "Saisissez le mot de passe de l'utilisateur PBS.", + "loginRejected": "PBS a refusé le nom d'utilisateur ou le mot de passe.", + "invalidLogin": "PBS a renvoyé une réponse de connexion non valide.", + "tokenCreateDenied": "Cet utilisateur PBS ne peut pas créer de jetons API.", + "invalidToken": "PBS a renvoyé un jeton API non valide.", + "auditRoleDenied": "Cet utilisateur PBS ne peut pas attribuer le rôle Audit. Connectez-vous en tant que root@pam ou avec un autre administrateur.", + "notFound": "La connexion PBS est introuvable. Rechargez la liste des connexions.", + "readFailed": "Impossible de lire les données PBS. Vérifiez son service et les permissions.", + "invalidList": "PBS a renvoyé une liste de données non valide.", + "localUnavailable": "PBS n'est pas disponible sur cet hôte.", + "authRequired": "Activez l'authentification locale dans Monitor avant de gérer des connexions PBS distantes.", + "datastoreOffline": "Le magasin de données est hors ligne, en mode maintenance, ou son périphérique de stockage n'est pas monté.", + "datastoreUnavailable": "Le système de fichiers du magasin de données n'est pas disponible." + }, + "taskTypes": { + "backup": "Sauvegarde", + "restore": "Restauration", + "verify": "Vérification", + "verifyGroup": "Vérification du groupe de sauvegardes", + "verifySnapshot": "Vérification de l'instantané", + "prune": "Purge", + "garbageCollection": "Ramasse-miettes", + "sync": "Synchronisation", + "updateCheck": "Recherche de mises à jour", + "terminal": "Terminal", + "createDatastore": "Créer un magasin de données", + "other": "Autre tâche ({type})" + }, + "states": { + "ok": "OK", + "unknown": "Inconnu", + "warnings": "Avertissements : {count}", + "warning": "Avertissement", + "error": "Erreur" + }, + "serviceStates": { + "active": "Actif", + "inactive": "Inactif", + "failed": "Échoué", + "activating": "Démarrage", + "deactivating": "Arrêt", + "unknown": "Inconnu" + }, + "durationUnits": { + "seconds": "{count} s", + "minutes": "{count} min", + "hours": "{count} h", + "days": "{count} j" + }, + "urlHelp": "Incluez :8007 pour le port PBS par défaut, par exemple https://pbs.example:8007.", + "usernameHelp": "Utilisez user@realm, par exemple root@pam.", + "tokenIdHelp": "Utilisez user@realm!token, par exemple monitor@pbs!proxmenux.", + "tokenSecretHelp": "Saisissez le secret de ce jeton API.", + "tokenSecretKeepHelp": "Laissez vide pour conserver le secret du jeton enregistré.", + "removeFailed": "Impossible de supprimer la connexion PBS.", + "savedRefreshFailed": "La connexion PBS a été enregistrée, mais la liste des connexions n'a pas pu être actualisée. Rechargez la page avant de tenter une autre modification.", + "removedRefreshFailed": "La connexion PBS a été supprimée, mais la liste des connexions n'a pas pu être actualisée. Rechargez la page.", + "technicalDetails": "Détails techniques", + "datastoreType": "Magasin de données" }, "monitorLinks": { "groups": { @@ -7408,6 +7764,17 @@ "addSelected": "Ajouter la sélection", "pbsWebInterface": "Interface web de PBS", "changeAddress": "Modifier l'adresse", - "cancel": "Annuler" + "cancel": "Annuler", + "errors": { + "addressRequired": "Saisissez l'adresse du Monitor.", + "invalidAddress": "L'adresse doit commencer par http:// ou https:// et indiquer un hôte.", + "addressCredentials": "L'adresse ne doit contenir ni utilisateur ni mot de passe.", + "invalidPort": "Le port de l'adresse n'est pas valide.", + "invalidRequest": "La requête n'est pas valide. Rechargez la page et réessayez.", + "limit": "Vous pouvez ajouter au maximum {count} nœuds.", + "duplicate": "Cette adresse figure déjà dans la liste.", + "notFound": "Le nœud est introuvable. Rechargez la liste et réessayez.", + "detectedRemove": "Seuls les nœuds ajoutés manuellement peuvent être supprimés. Les nœuds détectés peuvent être masqués." + } } } diff --git a/AppImage/messages/it/common.json b/AppImage/messages/it/common.json index ff4ab2dc..f09d96e1 100644 --- a/AppImage/messages/it/common.json +++ b/AppImage/messages/it/common.json @@ -1231,7 +1231,9 @@ "update": "Aggiorna", "modify": "Modifica", "recover": "Recupera", + "registerRestored": "Registra di nuovo", "terminalTitleUpdate": "Aggiorna applicazione OCI", + "terminalTitleRecoverPrevious": "Ripristina l'installazione OCI precedente", "terminalTitleModify": "Modifica applicazione OCI", "terminalTitleRecover": "Recupera applicazione OCI ripristinata", "terminalDescription": "Lo stesso percorso di OCI manager Apps → Gestisci le applicazioni OCI installate.", @@ -1760,7 +1762,128 @@ "dockerEvidenceImage": "Immagine", "dockerEvidencePort": "Porta TCP pubblicata", "dockerEvidenceProject": "Progetto Compose", - "dockerEndpointReview": "Container con porte TCP pubblicate. Conferma il nome e l'indirizzo web prima di salvare. La registrazione non configura gli aggiornamenti." + "dockerEndpointReview": "Container con porte TCP pubblicate. Conferma il nome e l'indirizzo web prima di salvare. La registrazione non configura gli aggiornamenti.", + "confirmRemove": "Rimuovere il record di questa applicazione dalla scheda App? L'applicazione non viene disinstallata.", + "packageExample": "es. {package}", + "packageHelpBefore": "Compilato automaticamente dal nome. Verifica con", + "packageHelpAfter": "all'interno del CT.", + "binaryHelpBefore": "Percorso assoluto. Trovalo con", + "binaryHelpOr": "o", + "errors": { + "ociBusy": "è in corso un'operazione OCI su questo container", + "dpkgMissing": "{package} non è installato tramite dpkg", + "dpkgFailed": "dpkg-query non riuscito", + "dpkgNoVersion": "nessuna versione trovata nell'output di dpkg", + "apkFailed": "apk info non riuscito", + "apkNoVersion": "nessuna versione trovata nell'output di apk", + "fileRead": "impossibile leggere {path}", + "fileNoMatch": "file_regex non corrisponde a {path}", + "binaryFailed": "invocazione del binario non riuscita", + "binaryNoVersion": "nessuna versione trovata nell'output del binario", + "pythonFailed": "python -c importlib.metadata non riuscito", + "pythonNoVersion": "nessuna versione trovata nell'output della distribuzione Python", + "dockerImageResolve": "impossibile risolvere l'immagine installata del container", + "dockerInspectFailed": "docker inspect non riuscito", + "dockerLabelMissing": "il container non ha l'etichetta {label}", + "dockerLabelMutable": "l'etichetta Docker riporta {tag} (tag mobile, non una versione)", + "dockerLabelNoVersion": "nessuna versione trovata nell'output dell'etichetta Docker", + "dockerExecFailed": "docker exec non riuscito", + "dockerExecNoVersion": "nessuna versione trovata nell'output di docker exec", + "commandEmpty": "command_argv è vuoto", + "commandFailed": "comando non riuscito", + "commandNoVersion": "nessuna versione trovata nell'output del comando", + "unsupportedMethod": "metodo non supportato: {method}", + "unknownUpstream": "upstream_type sconosciuto: {type}", + "githubNotFound": "{repo}: non trovato", + "githubRejected": "GitHub ha rifiutato la richiesta (403)", + "githubError": "errore GitHub {code}", + "noRelease": "nessun nome di tag / release nella risposta", + "tagNoMatch": "tag_regex non corrisponde a '{tag}'", + "httpError": "errore HTTP {code}", + "invalidJson": "risposta JSON non valida: {detail}", + "jsonPathUnresolved": "json_path '{path}' non è stato risolto", + "jsonEmpty": "valore vuoto in json_path", + "dockerNoTags": "nessun tag corrispondente (docker_hub)", + "dockerMovingOnly": "tag_regex corrisponde solo a tag mobili; usa il monitoraggio tramite digest dell'immagine Docker", + "dockerHubError": "errore Docker Hub {code}", + "dockerHubJson": "JSON di Docker Hub non valido: {detail}", + "dockerHubEmpty": "nessun tag restituito da Docker Hub", + "payload": "il payload deve essere un oggetto JSON", + "name": "il nome è obbligatorio e deve contenere da 1 a 64 caratteri tra lettere/cifre/spazi/._+-()/", + "method": "installed_via deve essere uno tra: {values} oppure vuoto", + "package": "il pacchetto è obbligatorio (lettere/cifre/._+@:/ fino a 127 caratteri)", + "filePath": "file_path è obbligatorio e deve essere un percorso assoluto", + "fileRegex": "file_regex è obbligatorio", + "fileRegexInvalid": "file_regex non è una regex valida: {detail}", + "binaryPath": "binary_path è obbligatorio e deve essere un percorso assoluto", + "pythonPath": "python_path è obbligatorio e deve essere un percorso assoluto", + "distribution": "la distribuzione è obbligatoria (nome PEP 503)", + "container": "container_name è obbligatorio (regole di denominazione Docker)", + "label": "l'etichetta è obbligatoria (regole di denominazione delle etichette OCI)", + "dockerBinary": "binary_path è obbligatorio (percorso assoluto o comando semplice)", + "manualVersion": "installed_version è obbligatorio per il metodo manuale", + "versionLength": "installed_version supera {max} caratteri", + "versionControl": "installed_version contiene un carattere di controllo non consentito", + "installedRegexInvalid": "installed_regex non è una regex valida: {detail}", + "upstreamType": "upstream_type deve essere uno tra: {values}", + "tagRegexInvalid": "tag_regex non è una regex valida: {detail}", + "repoRequired": "repo è obbligatorio per upstream_type=github", + "repoFormat": "repo deve essere nel formato 'owner/name'", + "githubSource": "github_source deve essere uno tra: {values}", + "upstreamUrlRequired": "upstream_url è obbligatorio per upstream_type=http_json", + "upstreamUrl": "upstream_url deve essere un URL http(s)", + "upstreamUrlLength": "upstream_url supera {max} caratteri", + "jsonPathRequired": "upstream_json_path è obbligatorio per upstream_type=http_json", + "jsonPathLength": "upstream_json_path supera {max} caratteri", + "jsonPathCharacters": "upstream_json_path usa caratteri non consentiti", + "dockerImageRequired": "docker_image è obbligatorio per upstream_type=docker_hub", + "dockerImageLength": "docker_image supera {max} caratteri", + "dockerImageFormat": "docker_image deve rispettare la denominazione di Docker Hub (owner/name o name)", + "healthPath": "health_path deve essere un percorso URL valido (max 255 caratteri)", + "logoUrl": "logo_url deve essere un URL http(s) o l'icona locale in cache di questa VM", + "discoveryId": "discovery_id non valido", + "helperSlug": "helper_slug deve essere uno slug in minuscolo (lettere/cifre/._-)", + "updateVia": "update_via accetta solo 'docker'", + "dockerDetector": "update_via=docker richiede un rilevatore docker_label o docker_exec", + "dockerConflict": "update_via=docker non può essere combinato con {field}", + "updateCommandType": "update_command deve essere una stringa", + "updateCommandLength": "update_command supera {max} caratteri", + "updateCommandNull": "update_command contiene un byte nullo", + "updateMethod": "update_method deve essere none, helper o custom", + "updateCommandRequired": "update_command è obbligatorio per update_method=custom", + "updateCommandOnlyCustom": "update_command è consentito solo per update_method=custom", + "helperRequired": "per update_method=helper è obbligatorio un helper_slug supportato", + "dockerUpdater": "Le app delegate a Docker si aggiornano tramite la loro immagine, non con un programma di aggiornamento separato", + "commandRequired": "command_argv è obbligatorio (elenco non vuoto)", + "commandList": "command_argv deve essere un elenco non vuoto di stringhe", + "commandCount": "command_argv accetta al massimo {max} voci", + "commandEntry": "command_argv[{index}] deve essere una stringa non vuota", + "commandEntryLength": "command_argv[{index}] supera {max} caratteri", + "commandEntryControl": "command_argv[{index}] contiene un carattere di controllo non consentito", + "binaryArgsList": "binary_args deve essere un elenco di stringhe", + "binaryArgsCount": "binary_args accetta al massimo {max} voci", + "binaryArgEntry": "binary_args[{index}] deve essere una stringa non vuota", + "binaryArgLength": "binary_args[{index}] supera {max} caratteri", + "binaryArgControl": "binary_args[{index}] contiene un carattere di controllo non consentito", + "portsList": "ports deve essere un elenco di {port, description, scheme}", + "portObject": "ports[{index}] deve essere un oggetto", + "portRequired": "ports[{index}].port è obbligatorio", + "portInteger": "ports[{index}].port deve essere un numero intero", + "portRange": "ports[{index}].port deve essere compreso tra 1 e 65535", + "portDuplicate": "la porta {port} compare più di una volta per questa app", + "portDescription": "ports[{index}].description contiene caratteri non validi", + "portScheme": "ports[{index}].scheme deve essere 'http' o 'https'", + "portPath": "ports[{index}].web_path deve essere un percorso URL valido (max 255 caratteri)", + "portLogo": "ports[{index}].logo_url deve essere un URL http(s) (max 512 caratteri)", + "portCategory": "ports[{index}].category contiene caratteri non validi o è troppo lungo", + "portCustomUrl": "ports[{index}].custom_url deve essere un URL http(s) (max 512 caratteri)", + "tagRegexLength": "tag_regex supera 512 caratteri", + "persistPermission": "impossibile salvare il file sidecar (permessi?)", + "persist": "impossibile salvare il file sidecar", + "noApps": "nessuna app registrata per questo vmid", + "appMissing": "app_id '{appId}' non trovato", + "appNotFound": "app non trovata" + } }, "statusFilter": { "ariaLabel": "Filtra macchine virtuali e container", @@ -2294,6 +2417,42 @@ "updateManyDescription": "Riesecuzione di {count} funzioni di post-installazione in sequenza.", "legacySourceTitle": "Ottimizzazione legacy: fai clic per visualizzare il sorgente", "sourceTitle": "Fai clic per vedere il codice sorgente", + "sourceDialogTitle": "Codice sorgente: {name}", + "sourceLoading": "Caricamento del codice sorgente…", + "sourceUnavailable": "Il codice sorgente non è disponibile.", + "sourceLoadFailed": "Impossibile caricare il codice sorgente. Riprova.", + "sourceFunctionMissing": "La funzione non è stata trovata negli script disponibili.", + "sourceUnknownTool": "Strumento sconosciuto: {tool}", + "sourceNoMapping": "Nessuna funzione è assegnata allo strumento {tool}.", + "sourceToolNames": { + "subscription_banner": "Rimozione del banner di abbonamento", + "time_sync": "Sincronizzazione dell'ora", + "apt_languages": "Salto delle lingue APT", + "journald": "Ottimizzazione di Journald", + "logrotate": "Ottimizzazione di Logrotate", + "system_limits": "Aumento dei limiti di sistema", + "memory_settings": "Ottimizzazione delle impostazioni di memoria", + "zram_swap": "Profilo di scambio ZRAM", + "kernel_panic": "Configurazione del kernel panic", + "apt_ipv4": "Forzatura IPv4 per APT", + "kexec": "kexec per riavvii rapidi", + "rpc": "Disattivazione di RPC / rpcbind", + "motd": "Banner MOTD personalizzato", + "system_utils": "Utilità di sistema", + "network_optimization": "Ottimizzazioni di rete", + "bashrc_custom": "Personalizzazione di Bashrc", + "figurine": "Figurine", + "fastfetch": "Fastfetch", + "log2ram": "Log2ram (protezione SSD)", + "zfs_autotrim": "ZFS Autotrim", + "amd_fixes": "Correzioni CPU AMD (Ryzen/EPYC)", + "persistent_network": "Configurazione di interfacce di rete persistenti", + "vfio_iommu": "Passthrough VFIO/IOMMU", + "lvm_repair": "Riparazione delle intestazioni PV LVM", + "repo_cleanup": "Pulizia dei repository", + "proxmox_repos": "Repository APT di Proxmox", + "entropy": "Generazione di entropia (haveged)" + }, "legacy": "legacy", "updateToolTitle": "Aggiorna {name} a v{version}", "availableUpdates": "Aggiornamenti disponibili", @@ -4820,6 +4979,124 @@ "cancel": "Annulla", "save": "Salva conservazione", "useDefault": "Usa l'impostazione predefinita di Proxmox (nessuna policy su questo storage)" + }, + "apiErrors": { + "requestFailed": "La richiesta non è riuscita.", + "absolutePath": "il percorso deve essere assoluto", + "pathConfigured": "questo percorso è già configurato", + "pathRequired": "il percorso è obbligatorio", + "pathQuery": "il parametro di query path è obbligatorio", + "pathNotFound": "percorso non trovato", + "invalidJobId": "ID del job non valido", + "jobNotFound": "job non trovato", + "runnerMissing": "script di esecuzione non installato", + "noRestore": "nessuno stato di ripristino da chiudere", + "invalidFile": "nome file non valido", + "notFound": "non trovato", + "logOutside": "percorso del log al di fuori della directory consentita", + "targetsList": "targets deve essere un elenco", + "emptyExpression": "espressione vuota", + "invalidId": "ID non valido (usa lettere, cifre, _ o -)", + "backend": "il backend deve essere pbs, local o borg", + "remoteBackend": "il backend deve essere pbs o borg", + "remoteBackendQuoted": "il backend deve essere 'pbs' o 'borg'", + "profileMode": "profile_mode deve essere default o custom", + "borgAttached": "borg non può essere collegato (vzdump di PVE scrive solo su storage pbs/local)", + "borgAttachedLong": "borg non è un backend valido per i job collegati (vzdump di PVE scrive solo su storage pbs/local)", + "parentRequired": "pve_parent_job_id e pve_storage sono obbligatori per attached", + "absolutePaths": "paths deve essere un elenco di percorsi assoluti", + "customPath": "il profilo personalizzato richiede almeno un percorso", + "defaultPaths": "impossibile determinare i percorsi del profilo predefinito", + "retentionObject": "retention deve essere un oggetto", + "pbsRepository": "pbs_repository è obbligatorio", + "pbsEncryption": "pbs_encrypt_mode deve essere 'none', 'new' o 'existing'", + "pbsKeyFailed": "impossibile creare il file di chiavi di crittografia PBS", + "pbsClientMissing": "impossibile creare il file di chiavi di crittografia PBS (proxmox-backup-client è installato?)", + "borgRepository": "borg_repo è obbligatorio", + "borgEncryption": "borg_encrypt_mode deve essere uno tra: none, repokey, keyfile, authenticated", + "encryption": "encrypt_mode deve essere uno tra: none, repokey, keyfile, authenticated", + "borgPassphrase": "borg_passphrase è obbligatoria quando la crittografia è abilitata (salvala nella destinazione o passane una nella richiesta)", + "passphrase": "la passphrase è obbligatoria quando la crittografia è abilitata", + "password": "la password è obbligatoria", + "deviceConfirmation": "confirm_device deve corrispondere esattamente a device (controllo di sicurezza / refusi)", + "invalidDevice": "percorso del dispositivo non valido", + "absoluteMountpoint": "è richiesto un punto di montaggio assoluto", + "archiveLayout": "struttura dell'archivio non riconosciuta: nessuna rootfs/ trovata", + "archiveMissing": "archivio non trovato", + "archiveNotFile": "il percorso dell'archivio non è un file regolare", + "invalidName": "nome non valido", + "invalidStaging": "staging_path non valido", + "jobRename": "il nome del job non può essere modificato (elimina e ricrea per rinominarlo)", + "absoluteKey": "key_path deve essere assoluto", + "mode": "mode deve essere \"local\" o \"ssh\"", + "nameRequired": "il nome è obbligatorio (lettere, cifre, _ o -)", + "noLog": "ancora nessun log disponibile per questo job", + "noPbsConfig": "nessun file di configurazioni PBS manuali", + "outputMissing": "file di output mancante", + "parserJson": "l'output del parser non era un JSON valido", + "restoreJson": "l'output di run_restore non era un JSON valido", + "repoRequired": "repo è obbligatorio", + "repoSnapshot": "repo_name e snapshot sono obbligatori", + "borgRepoSnapshot": "repo_name e snapshot sono obbligatori per borg", + "pbsRepoSnapshot": "repo_name e snapshot sono obbligatori per pbs", + "repoName": "repo_name è obbligatorio", + "restoreMissing": "strumenti di ripristino non installati su questo host", + "serverDatastore": "server e datastore sono obbligatori", + "snapshotRequired": "lo snapshot è obbligatorio", + "source": "source deve essere pbs, borg o local", + "sshPort": "ssh_port deve essere un numero intero tra 1 e 65535", + "sshRequired": "ssh_user, ssh_host e ssh_remote_path sono obbligatori per la modalità ssh", + "repositoryPath": "la destinazione non ha un percorso di repository", + "taskExpired": "attività non trovata o scaduta", + "invalidExpression": "espressione non valida", + "noReport": "nessun report generato", + "parseManifestFailed": "parse_manifest è terminato con un codice diverso da zero", + "jobExists": "il job esiste già: {value}", + "pathMissing": "il percorso non esiste su questo host: {value}", + "deviceMissing": "il dispositivo non esiste: {value}", + "mountpoint": "non è un punto di montaggio: {value}", + "localArchiveMissing": "archivio locale non trovato: {value}", + "borgDestination": "Destinazione Borg '{value}' non trovata", + "pbsDestination": "Destinazione PBS '{value}' non trovata", + "pbsPassword": "nessuna password disponibile per il repository PBS '{value}'", + "borgRepoMissing": "Repository Borg \"{value}\" non configurato", + "pbsRepoMissing": "Repository PBS \"{value}\" non configurato", + "borgTargetMissing": "Destinazione Borg non trovata: {value}", + "pbsTargetMissing": "Repository PBS non trovato: {value}", + "pveJobMissing": "Job vzdump di PVE non trovato: {value}", + "statePersist": "impossibile salvare lo stato: {value}", + "sshDirectory": "impossibile preparare la directory ssh: {value}", + "logRead": "impossibile leggere il log: {value}", + "envUpdate": "impossibile aggiornare .env: {value}", + "pbsConfigWrite": "impossibile salvare la configurazione PBS: {value}", + "persist": "impossibile salvare: {value}", + "archiveRemove": "impossibile rimuovere l'archivio: {value}", + "start": "impossibile avviare: {value}", + "borgTargetsUpdate": "impossibile aggiornare borg-targets.txt: {value}", + "pbsTargetsUpdate": "impossibile aggiornare pbs-manual-configs.txt: {value}", + "unitsUpdate": "impossibile aggiornare le unità systemd: {value}", + "borgTargetsWrite": "impossibile scrivere borg-targets.txt: {value}", + "jobWrite": "impossibile scrivere i file del job: {value}", + "localTargetWrite": "impossibile scrivere local-target.conf: {value}", + "unitsWrite": "impossibile scrivere le unità systemd: {value}", + "format": "formattazione non riuscita: {value}", + "calendar": "on_calendar non valido: {value}", + "mount": "montaggio non riuscito: {value}", + "parserInvocation": "invocazione del parser non riuscita: {value}", + "preflightInvocation": "invocazione della verifica preliminare non riuscita: {value}", + "publicKeyMissing": "chiave pubblica non trovata dopo la generazione: {value}", + "retentionInteger": "retention.{value} deve essere un numero intero", + "retentionNegative": "retention.{value} non deve essere negativo", + "keygen": "ssh-keygen non riuscito: {value}", + "systemctl": "systemctl non riuscito: {value}", + "unmount": "umount non riuscito: {value}", + "taskIncomplete": "l'attività è nello stato \"{value}\", non completata", + "unknownKind": "tipo sconosciuto: {value}", + "unknownMode": "modalità sconosciuta \"{value}\"", + "defaultRemove": "{value} è il valore predefinito integrato e non può essere rimosso", + "defaultAdd": "{value} è il valore predefinito integrato; non è necessario aggiungerlo", + "keyImport": "Nessun file di chiavi PBS è installato in {value}. Importa prima il file di chiavi.", + "storageMismatch": "Lo storage del job PVE non corrisponde (il job usa {value}, il payload indica {other})" } }, "healthStatus": { @@ -5320,6 +5597,7 @@ "websocketError": "Errore WebSocket", "connectionClosed": "Connessione chiusa", "completedSuccessfully": "Script completato con successo", + "cancelled": "Operazione annullata.", "completedWithError": "Script terminato con codice di errore {code}", "yes": "Sì", "yourInput": "Input:", @@ -7311,7 +7589,7 @@ "signInWith": "Accedi con", "methodPassword": "Utente e password", "methodToken": "Token API", - "username": "Utente (utente@realm)", + "username": "Utente", "password": "Password", "passwordHelp": "La password viene usata una sola volta per creare un token API di sola lettura (ruolo Audit) per questo Monitor. Viene salvato solo quel token, mai la password. Attiva prima l'autenticazione del Monitor.", "cancel": "Annulla", @@ -7324,10 +7602,10 @@ "editConnection": "Connessione da modificare", "add": "Aggiungi una nuova connessione", "name": "Nome", - "url": "URL HTTPS (includere :8007 per la porta nativa di PBS)", - "token_id": "ID del token API (user@realm!token)", - "token_secret": "Segreto del token API (lasciare vuoto per mantenere quello salvato)", - "fingerprint": "Impronta SHA256 del certificato (facoltativa)", + "url": "Indirizzo HTTPS", + "token_id": "ID del token API", + "token_secret": "Segreto del token API", + "fingerprint": "Impronta SHA256 (facoltativa)", "tlsHelp": "Lascia vuota l'impronta per la normale verifica dell'autorità di certificazione e del nome host. Per un certificato autofirmato, copia la sua impronta SHA256 dalla console PBS o da un altro canale attendibile. L'impronta viene verificata prima dell'invio delle credenziali.", "saved": "Connessione PBS verificata e salvata.", "saveFailed": "Impossibile salvare la connessione PBS.", @@ -7369,7 +7647,85 @@ "estimatedFull": "Pieno stimato", "estimatedFullUnknown": "dati non ancora sufficienti", "duration": "Durata", - "noJobs": "non è configurata alcuna pianificazione di sincronizzazione, verifica o eliminazione." + "noJobs": "non è configurata alcuna pianificazione di sincronizzazione, verifica o eliminazione.", + "errors": { + "configRead": "Impossibile leggere le connessioni PBS salvate. Controlla il file di configurazione e i permessi.", + "invalidConfig": "Le impostazioni della connessione PBS non sono valide. Controlla il modulo e riprova.", + "invalidField": "Un campo della connessione non è valido o è troppo lungo.", + "invalidUrl": "Usa un indirizzo PBS HTTPS senza credenziali incorporate, parametri di query o frammento.", + "nameRequired": "Inserisci un nome del server di massimo 128 caratteri.", + "tokenIdFormat": "Inserisci l'ID del token API PBS nel formato user@realm!token.", + "tokenSecret": "Inserisci un segreto del token API valido, senza spazi né caratteri di controllo.", + "invalidTokenId": "L'ID del token API deve contenere solo caratteri ASCII.", + "invalidFingerprint": "Inserisci l'impronta SHA256 del certificato: 64 caratteri esadecimali, facoltativamente separati da due punti.", + "fingerprintMismatch": "Il certificato PBS non corrisponde all'impronta. Non sono state inviate credenziali.", + "tokenRejected": "PBS ha rifiutato il token API o i suoi permessi. Controlla le ACL sia dell'utente sia del token.", + "invalidResponse": "PBS ha restituito una risposta inattesa. I reindirizzamenti non vengono seguiti.", + "invalidJson": "PBS ha restituito un documento JSON non valido.", + "connectFailed": "Impossibile connettersi a PBS tramite HTTPS verificato. Controlla l'indirizzo, il certificato e il servizio.", + "invalidId": "L'ID della connessione PBS non è valido. Ricarica l'elenco delle connessioni.", + "invalidDatastores": "PBS ha restituito un elenco di datastore non valido.", + "connectionLimit": "Si possono configurare al massimo {count} connessioni PBS.", + "username": "Inserisci l'utente PBS nel formato user@realm, ad esempio root@pam.", + "password": "Inserisci la password dell'utente PBS.", + "loginRejected": "PBS ha rifiutato il nome utente o la password.", + "invalidLogin": "PBS ha restituito una risposta di accesso non valida.", + "tokenCreateDenied": "Questo utente PBS non può creare token API.", + "invalidToken": "PBS ha restituito un token API non valido.", + "auditRoleDenied": "Questo utente PBS non può assegnare il ruolo Audit. Accedi come root@pam o con un altro amministratore.", + "notFound": "Connessione PBS non trovata. Ricarica l'elenco delle connessioni.", + "readFailed": "Impossibile leggere i dati PBS. Controlla il servizio e i permessi.", + "invalidList": "PBS ha restituito un elenco di dati non valido.", + "localUnavailable": "PBS non è disponibile su questo host.", + "authRequired": "Abilita l'autenticazione locale in Monitor prima di gestire le connessioni PBS remote.", + "datastoreOffline": "Il datastore è offline, in modalità manutenzione oppure il dispositivo su cui si basa non è montato.", + "datastoreUnavailable": "Il filesystem del datastore non è disponibile." + }, + "taskTypes": { + "backup": "Backup", + "restore": "Ripristino", + "verify": "Verifica", + "verifyGroup": "Verifica del gruppo di backup", + "verifySnapshot": "Verifica dello snapshot", + "prune": "Pulizia", + "garbageCollection": "Garbage collection", + "sync": "Sincronizzazione", + "updateCheck": "Controllo aggiornamenti", + "terminal": "Terminale", + "createDatastore": "Creazione datastore", + "other": "Altra attività ({type})" + }, + "states": { + "ok": "OK", + "unknown": "Sconosciuto", + "warnings": "Avvisi: {count}", + "warning": "Avviso", + "error": "Errore" + }, + "serviceStates": { + "active": "Attivo", + "inactive": "Inattivo", + "failed": "Non riuscito", + "activating": "Avvio in corso", + "deactivating": "Arresto in corso", + "unknown": "Sconosciuto" + }, + "durationUnits": { + "seconds": "{count} s", + "minutes": "{count} min", + "hours": "{count} h", + "days": "{count} g" + }, + "urlHelp": "Includi :8007 per la porta predefinita di PBS, ad esempio https://pbs.example:8007.", + "usernameHelp": "Usa utente@realm, ad esempio root@pam.", + "tokenIdHelp": "Usa utente@realm!token, ad esempio monitor@pbs!proxmenux.", + "tokenSecretHelp": "Inserisci il segreto di questo token API.", + "tokenSecretKeepHelp": "Lascia vuoto per mantenere il segreto del token salvato.", + "removeFailed": "Impossibile rimuovere la connessione PBS.", + "savedRefreshFailed": "La connessione PBS è stata salvata, ma non è stato possibile aggiornare l'elenco delle connessioni. Ricarica la pagina prima di fare un'altra modifica.", + "removedRefreshFailed": "La connessione PBS è stata rimossa, ma non è stato possibile aggiornare l'elenco delle connessioni. Ricarica la pagina.", + "technicalDetails": "Dettagli tecnici", + "datastoreType": "Datastore" }, "monitorLinks": { "groups": { @@ -7408,6 +7764,17 @@ "addSelected": "Aggiungi selezionati", "pbsWebInterface": "Interfaccia web di PBS", "changeAddress": "Cambia indirizzo", - "cancel": "Annulla" + "cancel": "Annulla", + "errors": { + "addressRequired": "Inserisci l'indirizzo del Monitor.", + "invalidAddress": "L'indirizzo deve iniziare con http:// o https:// e indicare un host.", + "addressCredentials": "L'indirizzo non deve contenere un utente o una password.", + "invalidPort": "La porta dell'indirizzo non è valida.", + "invalidRequest": "La richiesta non è valida. Ricarica la pagina e riprova.", + "limit": "Si possono aggiungere al massimo {count} nodi.", + "duplicate": "Questo indirizzo è già nell'elenco.", + "notFound": "Nodo non trovato. Ricarica l'elenco e riprova.", + "detectedRemove": "Si possono rimuovere solo i nodi aggiunti manualmente. I nodi rilevati possono essere nascosti." + } } } diff --git a/AppImage/messages/pt/common.json b/AppImage/messages/pt/common.json index e7154223..150b118a 100644 --- a/AppImage/messages/pt/common.json +++ b/AppImage/messages/pt/common.json @@ -1231,7 +1231,9 @@ "update": "Atualizar", "modify": "Modificar", "recover": "Recuperar", + "registerRestored": "Registar novamente", "terminalTitleUpdate": "Atualizar aplicação OCI", + "terminalTitleRecoverPrevious": "Recuperar a instalação OCI anterior", "terminalTitleModify": "Modificar aplicação OCI", "terminalTitleRecover": "Recuperar aplicação OCI restaurada", "terminalDescription": "É executado o mesmo processo que no menu do ProxMenux: OCI manager Apps → Gerir aplicações OCI instaladas.", @@ -1760,7 +1762,128 @@ "dockerEvidenceImage": "Imagem", "dockerEvidencePort": "Porta TCP publicada", "dockerEvidenceProject": "Projeto Compose", - "dockerEndpointReview": "Contentor com portas TCP publicadas. Confirme o nome e o endereço web antes de guardar. O registo não configura atualizações." + "dockerEndpointReview": "Contentor com portas TCP publicadas. Confirme o nome e o endereço web antes de guardar. O registo não configura atualizações.", + "confirmRemove": "Eliminar o registo desta aplicação do separador App? A aplicação não é desinstalada.", + "packageExample": "p. ex. {package}", + "packageHelpBefore": "Preenchido automaticamente a partir do Nome. Verifique com", + "packageHelpAfter": "dentro do CT.", + "binaryHelpBefore": "Caminho absoluto. Encontre-o com", + "binaryHelpOr": "ou", + "errors": { + "ociBusy": "está em curso uma operação OCI neste contentor", + "dpkgMissing": "{package} não está instalado através do dpkg", + "dpkgFailed": "dpkg-query falhou", + "dpkgNoVersion": "nenhuma versão encontrada na saída do dpkg", + "apkFailed": "apk info falhou", + "apkNoVersion": "nenhuma versão encontrada na saída do apk", + "fileRead": "não foi possível ler {path}", + "fileNoMatch": "file_regex não encontrou correspondência em {path}", + "binaryFailed": "a invocação do binário falhou", + "binaryNoVersion": "nenhuma versão encontrada na saída do binário", + "pythonFailed": "python -c importlib.metadata falhou", + "pythonNoVersion": "nenhuma versão encontrada na saída da distribuição Python", + "dockerImageResolve": "não foi possível resolver a imagem instalada do contentor", + "dockerInspectFailed": "docker inspect falhou", + "dockerLabelMissing": "o contentor não tem a etiqueta {label}", + "dockerLabelMutable": "a etiqueta do docker indica {tag} (tag mutável, não é uma versão)", + "dockerLabelNoVersion": "nenhuma versão encontrada na saída da etiqueta do docker", + "dockerExecFailed": "docker exec falhou", + "dockerExecNoVersion": "nenhuma versão encontrada na saída do docker exec", + "commandEmpty": "command_argv está vazio", + "commandFailed": "o comando falhou", + "commandNoVersion": "nenhuma versão encontrada na saída do comando", + "unsupportedMethod": "método não suportado: {method}", + "unknownUpstream": "upstream_type desconhecido: {type}", + "githubNotFound": "{repo}: não encontrado", + "githubRejected": "o github rejeitou o pedido (403)", + "githubError": "erro do github {code}", + "noRelease": "nenhuma tag / nome de release na resposta", + "tagNoMatch": "tag_regex não encontrou correspondência em '{tag}'", + "httpError": "erro http {code}", + "invalidJson": "resposta JSON inválida: {detail}", + "jsonPathUnresolved": "json_path '{path}' não foi resolvido", + "jsonEmpty": "valor vazio em json_path", + "dockerNoTags": "nenhuma tag encontrada (docker_hub)", + "dockerMovingOnly": "tag_regex só encontrou tags móveis; utilize o seguimento do digest da imagem Docker", + "dockerHubError": "erro do docker hub {code}", + "dockerHubJson": "JSON do docker hub inválido: {detail}", + "dockerHubEmpty": "o docker hub não devolveu nenhuma tag", + "payload": "o payload deve ser um objeto JSON", + "name": "name é obrigatório e deve ter 1-64 caracteres entre letras/dígitos/espaços/._+-()/", + "method": "installed_via deve ser um de: {values} ou vazio", + "package": "package é obrigatório (letras/dígitos/._+@:/ até 127 caracteres)", + "filePath": "file_path é obrigatório e deve ser um caminho absoluto", + "fileRegex": "file_regex é obrigatório", + "fileRegexInvalid": "file_regex não é uma regex válida: {detail}", + "binaryPath": "binary_path é obrigatório e deve ser um caminho absoluto", + "pythonPath": "python_path é obrigatório e deve ser um caminho absoluto", + "distribution": "distribution é obrigatório (nome PEP 503)", + "container": "container_name é obrigatório (regras de nomes do docker)", + "label": "label é obrigatório (regras de nomes de etiquetas OCI)", + "dockerBinary": "binary_path é obrigatório (caminho absoluto ou comando simples)", + "manualVersion": "installed_version é obrigatório para o método manual", + "versionLength": "installed_version excede {max} caracteres", + "versionControl": "installed_version contém um carácter de controlo proibido", + "installedRegexInvalid": "installed_regex não é uma regex válida: {detail}", + "upstreamType": "upstream_type deve ser um de: {values}", + "tagRegexInvalid": "tag_regex não é uma regex válida: {detail}", + "repoRequired": "repo é obrigatório para upstream_type=github", + "repoFormat": "repo deve ter o formato 'owner/name'", + "githubSource": "github_source deve ser um de: {values}", + "upstreamUrlRequired": "upstream_url é obrigatório para upstream_type=http_json", + "upstreamUrl": "upstream_url deve ser um URL http(s)", + "upstreamUrlLength": "upstream_url excede {max} caracteres", + "jsonPathRequired": "upstream_json_path é obrigatório para upstream_type=http_json", + "jsonPathLength": "upstream_json_path excede {max} caracteres", + "jsonPathCharacters": "upstream_json_path utiliza caracteres proibidos", + "dockerImageRequired": "docker_image é obrigatório para upstream_type=docker_hub", + "dockerImageLength": "docker_image excede {max} caracteres", + "dockerImageFormat": "docker_image deve seguir os nomes do Docker Hub (owner/name ou name)", + "healthPath": "health_path deve ser um caminho de URL válido (máx. 255 caracteres)", + "logoUrl": "logo_url deve ser um URL http(s) ou o ícone local em cache desta VM", + "discoveryId": "discovery_id inválido", + "helperSlug": "helper_slug deve ser um slug em minúsculas (letras/dígitos/._-)", + "updateVia": "update_via só aceita 'docker'", + "dockerDetector": "update_via=docker requer um detetor docker_label ou docker_exec", + "dockerConflict": "update_via=docker não pode ser combinado com {field}", + "updateCommandType": "update_command deve ser uma cadeia de texto", + "updateCommandLength": "update_command excede {max} caracteres", + "updateCommandNull": "update_command contém um byte nulo", + "updateMethod": "update_method deve ser none, helper ou custom", + "updateCommandRequired": "update_command é obrigatório para update_method=custom", + "updateCommandOnlyCustom": "update_command só é permitido para update_method=custom", + "helperRequired": "é necessário um helper_slug suportado para update_method=helper", + "dockerUpdater": "As aplicações delegadas no Docker atualizam-se através da sua imagem, não com um atualizador de aplicação separado", + "commandRequired": "command_argv é obrigatório (lista não vazia)", + "commandList": "command_argv deve ser uma lista não vazia de cadeias de texto", + "commandCount": "command_argv aceita no máximo {max} entradas", + "commandEntry": "command_argv[{index}] deve ser uma cadeia de texto não vazia", + "commandEntryLength": "command_argv[{index}] excede {max} caracteres", + "commandEntryControl": "command_argv[{index}] contém um carácter de controlo proibido", + "binaryArgsList": "binary_args deve ser uma lista de cadeias de texto", + "binaryArgsCount": "binary_args aceita no máximo {max} entradas", + "binaryArgEntry": "binary_args[{index}] deve ser uma cadeia de texto não vazia", + "binaryArgLength": "binary_args[{index}] excede {max} caracteres", + "binaryArgControl": "binary_args[{index}] contém um carácter de controlo proibido", + "portsList": "ports deve ser uma lista de {port, description, scheme}", + "portObject": "ports[{index}] deve ser um objeto", + "portRequired": "ports[{index}].port é obrigatório", + "portInteger": "ports[{index}].port deve ser um número inteiro", + "portRange": "ports[{index}].port deve estar entre 1 e 65535", + "portDuplicate": "a porta {port} aparece mais de uma vez para esta aplicação", + "portDescription": "ports[{index}].description tem caracteres inválidos", + "portScheme": "ports[{index}].scheme deve ser 'http' ou 'https'", + "portPath": "ports[{index}].web_path deve ser um caminho de URL válido (máx. 255 caracteres)", + "portLogo": "ports[{index}].logo_url deve ser um URL http(s) (máx. 512 caracteres)", + "portCategory": "ports[{index}].category tem caracteres inválidos ou é demasiado longo", + "portCustomUrl": "ports[{index}].custom_url deve ser um URL http(s) (máx. 512 caracteres)", + "tagRegexLength": "tag_regex excede 512 caracteres", + "persistPermission": "não foi possível guardar o sidecar (permissões?)", + "persist": "não foi possível guardar o sidecar", + "noApps": "nenhuma aplicação registada para este vmid", + "appMissing": "app_id '{appId}' não encontrado", + "appNotFound": "aplicação não encontrada" + } }, "statusFilter": { "ariaLabel": "Filtrar máquinas virtuais e contêineres", @@ -2294,6 +2417,42 @@ "updateManyDescription": "Executando novamente as funções pós-instalação {count} em sequência.", "legacySourceTitle": "Otimização legada – clique para ver a fonte", "sourceTitle": "Clique para visualizar o código fonte", + "sourceDialogTitle": "Código-fonte: {name}", + "sourceLoading": "A carregar o código-fonte…", + "sourceUnavailable": "O código-fonte não está disponível.", + "sourceLoadFailed": "Não foi possível carregar o código-fonte. Tente novamente.", + "sourceFunctionMissing": "A função não foi encontrada nos scripts disponíveis.", + "sourceUnknownTool": "Ferramenta desconhecida: {tool}", + "sourceNoMapping": "Nenhuma função está atribuída à ferramenta {tool}.", + "sourceToolNames": { + "subscription_banner": "Remoção do banner de subscrição", + "time_sync": "Sincronização da hora", + "apt_languages": "Omitir idiomas do APT", + "journald": "Otimização do journald", + "logrotate": "Otimização do logrotate", + "system_limits": "Aumento dos limites do sistema", + "memory_settings": "Otimização das definições de memória", + "zram_swap": "Perfil de swap ZRAM", + "kernel_panic": "Configuração de kernel panic", + "apt_ipv4": "Forçar IPv4 no APT", + "kexec": "kexec para reinícios rápidos", + "rpc": "Desativar RPC / rpcbind", + "motd": "Banner MOTD personalizado", + "system_utils": "Utilitários do sistema", + "network_optimization": "Otimizações de rede", + "bashrc_custom": "Personalização do bashrc", + "figurine": "Figurine", + "fastfetch": "Fastfetch", + "log2ram": "Log2ram (proteção do SSD)", + "zfs_autotrim": "ZFS Autotrim", + "amd_fixes": "Correções para CPU AMD (Ryzen/EPYC)", + "persistent_network": "Definir interfaces de rede persistentes", + "vfio_iommu": "Passthrough VFIO/IOMMU", + "lvm_repair": "Reparação de cabeçalhos LVM PV", + "repo_cleanup": "Limpeza de repositórios", + "proxmox_repos": "Repositórios APT do Proxmox", + "entropy": "Geração de entropia (haveged)" + }, "legacy": "legado", "updateToolTitle": "Atualizar {name} para v{version}", "availableUpdates": "Atualizações disponíveis", @@ -4820,6 +4979,124 @@ "cancel": "Cancelar", "save": "Guardar retenção", "useDefault": "Use o padrão Proxmox (nenhuma política neste armazenamento)" + }, + "apiErrors": { + "requestFailed": "O pedido falhou.", + "absolutePath": "o caminho deve ser absoluto", + "pathConfigured": "este caminho já está configurado", + "pathRequired": "o caminho é obrigatório", + "pathQuery": "o parâmetro de consulta path é obrigatório", + "pathNotFound": "caminho não encontrado", + "invalidJobId": "ID de trabalho inválido", + "jobNotFound": "trabalho não encontrado", + "runnerMissing": "o script de execução não está instalado", + "noRestore": "nenhum estado de restauro para descartar", + "invalidFile": "nome de ficheiro inválido", + "notFound": "não encontrado", + "logOutside": "caminho do registo fora do diretório permitido", + "targetsList": "targets deve ser uma lista", + "emptyExpression": "expressão vazia", + "invalidId": "ID inválido (utilize letras, dígitos, _ ou -)", + "backend": "o backend deve ser pbs, local ou borg", + "remoteBackend": "o backend deve ser pbs ou borg", + "remoteBackendQuoted": "o backend deve ser 'pbs' ou 'borg'", + "profileMode": "profile_mode deve ser default ou custom", + "borgAttached": "o borg não pode ser anexado (o vzdump do PVE só escreve em armazenamentos pbs/local)", + "borgAttachedLong": "o borg não é um backend válido para trabalhos anexados (o vzdump do PVE só escreve em armazenamentos pbs/local)", + "parentRequired": "pve_parent_job_id e pve_storage são obrigatórios para attached", + "absolutePaths": "paths deve ser uma lista de caminhos absolutos", + "customPath": "o perfil personalizado precisa de pelo menos um caminho", + "defaultPaths": "não foi possível resolver os caminhos do perfil predefinido", + "retentionObject": "retention deve ser um objeto", + "pbsRepository": "pbs_repository é obrigatório", + "pbsEncryption": "pbs_encrypt_mode deve ser 'none', 'new' ou 'existing'", + "pbsKeyFailed": "falha ao criar o ficheiro de chave de encriptação do PBS", + "pbsClientMissing": "falha ao criar o ficheiro de chave de encriptação do PBS (o proxmox-backup-client está instalado?)", + "borgRepository": "borg_repo é obrigatório", + "borgEncryption": "borg_encrypt_mode deve ser um de: none, repokey, keyfile, authenticated", + "encryption": "encrypt_mode deve ser um de: none, repokey, keyfile, authenticated", + "borgPassphrase": "borg_passphrase é obrigatório quando a encriptação está ativada (guarde-o no destino ou indique um no pedido)", + "passphrase": "a frase-passe é obrigatória quando a encriptação está ativada", + "password": "a palavra-passe é obrigatória", + "deviceConfirmation": "confirm_device deve corresponder exatamente ao dispositivo (verificação de gralhas / segurança)", + "invalidDevice": "caminho de dispositivo inválido", + "absoluteMountpoint": "é necessário um ponto de montagem absoluto", + "archiveLayout": "estrutura do arquivo não reconhecida — não foi encontrado rootfs/", + "archiveMissing": "arquivo não encontrado", + "archiveNotFile": "o caminho do arquivo não é um ficheiro normal", + "invalidName": "nome inválido", + "invalidStaging": "staging_path inválido", + "jobRename": "o nome do trabalho não pode ser alterado (elimine e volte a criar para mudar o nome)", + "absoluteKey": "key_path deve ser absoluto", + "mode": "mode deve ser \"local\" ou \"ssh\"", + "nameRequired": "o nome é obrigatório (letras, dígitos, _ ou -)", + "noLog": "ainda não há registo disponível para este trabalho", + "noPbsConfig": "não existe ficheiro de configurações PBS manuais", + "outputMissing": "ficheiro de saída em falta", + "parserJson": "a saída do parser não era JSON válido", + "restoreJson": "a saída de run_restore não era JSON válido", + "repoRequired": "repo é obrigatório", + "repoSnapshot": "repo_name e snapshot são obrigatórios", + "borgRepoSnapshot": "repo_name e snapshot são obrigatórios para borg", + "pbsRepoSnapshot": "repo_name e snapshot são obrigatórios para pbs", + "repoName": "repo_name é obrigatório", + "restoreMissing": "as ferramentas de restauro não estão instaladas neste host", + "serverDatastore": "server e datastore são obrigatórios", + "snapshotRequired": "snapshot é obrigatório", + "source": "source deve ser pbs, borg ou local", + "sshPort": "ssh_port deve ser um número inteiro entre 1 e 65535", + "sshRequired": "ssh_user, ssh_host e ssh_remote_path são obrigatórios para o modo ssh", + "repositoryPath": "o destino não tem caminho de repositório", + "taskExpired": "tarefa não encontrada ou expirada", + "invalidExpression": "expressão inválida", + "noReport": "nenhum relatório emitido", + "parseManifestFailed": "parse_manifest terminou com um código diferente de zero", + "jobExists": "o trabalho já existe: {value}", + "pathMissing": "o caminho não existe neste host: {value}", + "deviceMissing": "o dispositivo não existe: {value}", + "mountpoint": "não é um ponto de montagem: {value}", + "localArchiveMissing": "arquivo local não encontrado: {value}", + "borgDestination": "Destino Borg '{value}' não encontrado", + "pbsDestination": "Destino PBS '{value}' não encontrado", + "pbsPassword": "nenhuma palavra-passe disponível para o repositório PBS '{value}'", + "borgRepoMissing": "Repositório Borg \"{value}\" não configurado", + "pbsRepoMissing": "Repositório PBS \"{value}\" não configurado", + "borgTargetMissing": "Destino Borg não encontrado: {value}", + "pbsTargetMissing": "Repositório PBS não encontrado: {value}", + "pveJobMissing": "Trabalho vzdump do PVE não encontrado: {value}", + "statePersist": "não é possível guardar o estado: {value}", + "sshDirectory": "não é possível preparar o diretório ssh: {value}", + "logRead": "não é possível ler o registo: {value}", + "envUpdate": "não foi possível atualizar o .env: {value}", + "pbsConfigWrite": "falha ao guardar a configuração PBS: {value}", + "persist": "falha ao guardar: {value}", + "archiveRemove": "falha ao eliminar o arquivo: {value}", + "start": "falha ao iniciar: {value}", + "borgTargetsUpdate": "falha ao atualizar borg-targets.txt: {value}", + "pbsTargetsUpdate": "falha ao atualizar pbs-manual-configs.txt: {value}", + "unitsUpdate": "falha ao atualizar as unidades systemd: {value}", + "borgTargetsWrite": "falha ao escrever borg-targets.txt: {value}", + "jobWrite": "falha ao escrever os ficheiros do trabalho: {value}", + "localTargetWrite": "falha ao escrever local-target.conf: {value}", + "unitsWrite": "falha ao escrever as unidades systemd: {value}", + "format": "a formatação falhou: {value}", + "calendar": "on_calendar inválido: {value}", + "mount": "a montagem falhou: {value}", + "parserInvocation": "a invocação do parser falhou: {value}", + "preflightInvocation": "a invocação da verificação prévia falhou: {value}", + "publicKeyMissing": "chave pública não encontrada após a geração: {value}", + "retentionInteger": "retention.{value} deve ser um número inteiro", + "retentionNegative": "retention.{value} não pode ser negativo", + "keygen": "ssh-keygen falhou: {value}", + "systemctl": "systemctl falhou: {value}", + "unmount": "umount falhou: {value}", + "taskIncomplete": "a tarefa está no estado \"{value}\", não concluída", + "unknownKind": "tipo desconhecido: {value}", + "unknownMode": "modo desconhecido \"{value}\"", + "defaultRemove": "{value} é a predefinição integrada e não pode ser eliminado", + "defaultAdd": "{value} é a predefinição integrada; não é necessário adicioná-lo", + "keyImport": "Não existe nenhum ficheiro de chave PBS instalado em {value}. Importe primeiro o ficheiro de chave.", + "storageMismatch": "O armazenamento do trabalho do PVE não corresponde (o trabalho utiliza {value}, o payload indica {other})" } }, "healthStatus": { @@ -5320,6 +5597,7 @@ "websocketError": "Ocorreu um erro de WebSocket", "connectionClosed": "Conexão fechada", "completedSuccessfully": "Script concluído com sucesso", + "cancelled": "Operação cancelada.", "completedWithError": "Script concluído com código de erro {code}", "yes": "Sim", "yourInput": "Sua entrada:", @@ -7311,7 +7589,7 @@ "signInWith": "Iniciar sessão com", "methodPassword": "Utilizador e palavra-passe", "methodToken": "Token API", - "username": "Utilizador (utilizador@realm)", + "username": "Utilizador", "password": "Palavra-passe", "passwordHelp": "A palavra-passe é usada uma única vez para criar um token API só de leitura (função Audit) para este Monitor. Só esse token é guardado, nunca a palavra-passe. Ative primeiro a autenticação do Monitor.", "cancel": "Cancelar", @@ -7324,10 +7602,10 @@ "editConnection": "Ligação a editar", "add": "Adicionar uma nova ligação", "name": "Nome", - "url": "URL HTTPS (inclua :8007 para a porta nativa do PBS)", - "token_id": "ID do token API (user@realm!token)", - "token_secret": "Segredo do token API (deixe vazio para manter o segredo guardado)", - "fingerprint": "Impressão digital SHA256 do certificado (opcional)", + "url": "Endereço HTTPS", + "token_id": "ID do token API", + "token_secret": "Segredo do token API", + "fingerprint": "Impressão digital SHA256 (opcional)", "tlsHelp": "Deixe a impressão digital vazia para a verificação normal da autoridade de certificação e do nome de anfitrião. Para um certificado autoassinado, copie a sua impressão digital SHA256 da consola PBS ou de outro canal de confiança. A impressão digital é verificada antes do envio de credenciais.", "saved": "Ligação PBS verificada e guardada.", "saveFailed": "Não foi possível guardar a ligação PBS.", @@ -7369,7 +7647,85 @@ "estimatedFull": "estimativa completa", "estimatedFullUnknown": "Not enough data yet", "duration": "Duração", - "noJobs": "nenhuma programação de sincronização, verificação ou remoção está configurada." + "noJobs": "nenhuma programação de sincronização, verificação ou remoção está configurada.", + "errors": { + "configRead": "Não foi possível ler as ligações PBS guardadas. Verifique o ficheiro de configuração e as permissões.", + "invalidConfig": "As definições da ligação PBS não são válidas. Verifique o formulário e tente novamente.", + "invalidField": "Um campo da ligação não é válido ou é demasiado longo.", + "invalidUrl": "Utilize um endereço PBS HTTPS sem credenciais incorporadas, parâmetros de consulta nem fragmento.", + "nameRequired": "Introduza um nome de servidor com 128 caracteres no máximo.", + "tokenIdFormat": "Introduza o ID do token API do PBS no formato utilizador@realm!token.", + "tokenSecret": "Introduza um segredo de token API válido, sem espaços nem caracteres de controlo.", + "invalidTokenId": "O ID do token API só pode conter caracteres ASCII.", + "invalidFingerprint": "Introduza a impressão digital SHA256 do certificado: 64 caracteres hexadecimais, opcionalmente separados por dois pontos.", + "fingerprintMismatch": "O certificado do PBS não corresponde à impressão digital. Não foram enviadas credenciais.", + "tokenRejected": "O PBS rejeitou o token API ou as suas permissões. Verifique as ACL do utilizador e do token.", + "invalidResponse": "O PBS devolveu uma resposta inesperada. Os redirecionamentos não são seguidos.", + "invalidJson": "O PBS devolveu um documento JSON inválido.", + "connectFailed": "Não foi possível ligar ao PBS através de HTTPS verificado. Verifique o endereço, o certificado e o serviço.", + "invalidId": "O ID da ligação PBS não é válido. Recarregue a lista de ligações.", + "invalidDatastores": "O PBS devolveu uma lista de armazenamentos de dados inválida.", + "connectionLimit": "Podem ser configuradas no máximo {count} ligações PBS.", + "username": "Introduza o utilizador do PBS no formato utilizador@realm, por exemplo root@pam.", + "password": "Introduza a palavra-passe do utilizador do PBS.", + "loginRejected": "O PBS rejeitou o nome de utilizador ou a palavra-passe.", + "invalidLogin": "O PBS devolveu uma resposta de início de sessão inválida.", + "tokenCreateDenied": "Este utilizador do PBS não pode criar tokens API.", + "invalidToken": "O PBS devolveu um token API inválido.", + "auditRoleDenied": "Este utilizador do PBS não pode conceder a função Audit. Inicie sessão como root@pam ou outro administrador.", + "notFound": "A ligação PBS não foi encontrada. Recarregue a lista de ligações.", + "readFailed": "Não foi possível ler os dados do PBS. Verifique o seu serviço e as permissões.", + "invalidList": "O PBS devolveu uma lista de dados inválida.", + "localUnavailable": "O PBS não está disponível neste host.", + "authRequired": "Ative a autenticação local no Monitor antes de gerir ligações PBS remotas.", + "datastoreOffline": "O armazenamento de dados está offline, em modo de manutenção ou o seu dispositivo de suporte não está montado.", + "datastoreUnavailable": "O sistema de ficheiros do armazenamento de dados não está disponível." + }, + "taskTypes": { + "backup": "Backup", + "restore": "Restauro", + "verify": "Verificação", + "verifyGroup": "Verificação do grupo de backups", + "verifySnapshot": "Verificação do snapshot", + "prune": "Limpeza (prune)", + "garbageCollection": "Recolha de lixo", + "sync": "Sincronização", + "updateCheck": "Procurar atualizações", + "terminal": "Terminal", + "createDatastore": "Criar armazenamento de dados", + "other": "Outra tarefa ({type})" + }, + "states": { + "ok": "OK", + "unknown": "Desconhecido", + "warnings": "Avisos: {count}", + "warning": "Aviso", + "error": "Erro" + }, + "serviceStates": { + "active": "Ativo", + "inactive": "Inativo", + "failed": "Com falha", + "activating": "A iniciar", + "deactivating": "A parar", + "unknown": "Desconhecido" + }, + "durationUnits": { + "seconds": "{count} s", + "minutes": "{count} min", + "hours": "{count} h", + "days": "{count} d" + }, + "urlHelp": "Inclua :8007 para a porta predefinida do PBS, por exemplo https://pbs.example:8007.", + "usernameHelp": "Utilize utilizador@realm, por exemplo root@pam.", + "tokenIdHelp": "Utilize utilizador@realm!token, por exemplo monitor@pbs!proxmenux.", + "tokenSecretHelp": "Introduza o segredo deste token API.", + "tokenSecretKeepHelp": "Deixe vazio para manter o segredo do token guardado.", + "removeFailed": "Não foi possível eliminar a ligação PBS.", + "savedRefreshFailed": "A ligação PBS foi guardada, mas não foi possível atualizar a lista de ligações. Recarregue a página antes de tentar outra alteração.", + "removedRefreshFailed": "A ligação PBS foi eliminada, mas não foi possível atualizar a lista de ligações. Recarregue a página.", + "technicalDetails": "Detalhes técnicos", + "datastoreType": "Armazenamento de dados" }, "monitorLinks": { "groups": { @@ -7408,6 +7764,17 @@ "addSelected": "Adicionar selecionados", "pbsWebInterface": "Interface web do PBS", "changeAddress": "Alterar endereço", - "cancel": "Cancelar" + "cancel": "Cancelar", + "errors": { + "addressRequired": "Introduza o endereço do Monitor.", + "invalidAddress": "O endereço deve começar por http:// ou https:// e indicar um host.", + "addressCredentials": "O endereço não pode conter um utilizador nem uma palavra-passe.", + "invalidPort": "A porta do endereço não é válida.", + "invalidRequest": "O pedido não é válido. Recarregue a página e tente novamente.", + "limit": "Podem ser adicionados no máximo {count} nós.", + "duplicate": "Este endereço já está na lista.", + "notFound": "O nó não foi encontrado. Recarregue a lista e tente novamente.", + "detectedRemove": "Só podem ser eliminados os nós adicionados manualmente. Os nós detetados podem ser ocultados." + } } } diff --git a/AppImage/messages/sk/common.json b/AppImage/messages/sk/common.json index f1479b4b..265187fa 100644 --- a/AppImage/messages/sk/common.json +++ b/AppImage/messages/sk/common.json @@ -8,7 +8,7 @@ "notAvailable": "Nedostupné", "serverOffline": "Server je offline", "supportProject": "Podporte projekt alebo prispejte vlastnými úpravami", - "descriptionPbs": "Proxmox Backup Server Dashboard" + "descriptionPbs": "Prehľad systému Proxmox Backup Server" }, "common": { "notAvailable": "Nedostupné", @@ -1032,7 +1032,7 @@ "pciPassthrough": "PCI Passthrough", "usbDevices": "USB zariadenia", "serialPorts": "Sériové porty", - "bridge": "Sieťový bridge", + "bridge": "Sieťový most (bridge)", "enabled": "Zapnuté", "disabled": "Vypnuté", "on": "zapnuté", @@ -1248,13 +1248,15 @@ "stackNote": "Súčasť aplikácie s viacerými kontajnermi (hlavný CT {primary}, {count} kontajnerov): aktualizácia sa týka všetkých.", "memberNote": "Tento kontajner patrí do aplikácie s viacerými kontajnermi, ktorej hlavný CT je {primary}, a neaktualizuje sa samostatne. Aktualizácia sa vykonáva z hlavného CT, ktorý aktualizuje všetkých {count} kontajnerov naraz.", "openPrimary": "Otvoriť hlavný CT", - "pendingNote": "Operácia na tomto kontajneri bola prerušená; tlačidlo Obnoviť spustí obnovenie.", + "pendingNote": "Operácia na tomto kontajneri zostala nedokončená. Tlačidlo Obnoviť otvorí možnosti obnovenia.", "update": "Aktualizovať", "modify": "Upraviť", "recover": "Obnoviť", + "registerRestored": "Znova zaregistrovať", "terminalTitleUpdate": "Aktualizovať OCI aplikáciu", + "terminalTitleRecoverPrevious": "Obnoviť predchádzajúcu OCI inštaláciu", "terminalTitleModify": "Upraviť OCI aplikáciu", - "terminalTitleRecover": "Obnoviť obnovenú OCI aplikáciu", + "terminalTitleRecover": "Zaregistrovať OCI aplikácie obnovené zo zálohy", "terminalDescription": "Použije sa rovnaký postup ako v ponuke Správca OCI aplikácií → Spravovať nainštalované OCI aplikácie.", "keepBackup": "Ponechať zálohu vytvorenú pred aktualizáciou", "noKeepBackup": "Záloha vytvorená pred aktualizáciou sa neponecháva", @@ -1485,7 +1487,7 @@ "ociTitle": "Kontajner z OCI obrazu", "ociBody": "Tento kontajner bol vytvorený z OCI (Docker) obrazu mimo Správcu OCI aplikácií. Aktualizuje sa nahradením obrazu, čo ProxMenux pri tomto kontajneri nespravuje.", "ociRestoredTitle": "Obnovená OCI aplikácia", - "ociRestoredBody": "Tento kontajner bol obnovený zo zálohy a tento hostiteľ nemá záznam o jeho aplikácii, preto ho zatiaľ nemožno aktualizovať odtiaľto. Obnoviť ho znova zaregistruje na tomto hostiteľovi, rovnako ako OCI manager Apps → Spravovať nainštalované OCI aplikácie.", + "ociRestoredBody": "Tento kontajner bol obnovený zo zálohy, ale tento server nemá záznam o jeho OCI aplikácii, preto ju tu zatiaľ nemožno aktualizovať. Možnosť Znova zaregistrovať otvorí registráciu obnovených OCI aplikácií na tomto uzle, rovnako ako ponuka Správca OCI aplikácií → Spravovať nainštalované OCI aplikácie.", "dockerImagesTitle": "Docker obrazy", "dockerAppTitle": "Docker", "dockerImagesSubheading": "Obrazy", @@ -1545,7 +1547,128 @@ "loadFailed": "Konfiguráciu hromadnej aktualizácie sa nepodarilo načítať." }, "appEditor": { - "methodOciImage": "OCI obraz (nainštalovaný ProxMenux)", + "confirmRemove": "Odobrať záznam aplikácie zo záložky Aplikácie? Samotná aplikácia zostane nainštalovaná.", + "packageExample": "napr. {package}", + "packageHelpBefore": "Doplní sa podľa názvu. Over ho príkazom", + "packageHelpAfter": "v kontajneri.", + "binaryHelpBefore": "Úplná cesta k programu. Nájdeš ju príkazom", + "binaryHelpOr": "alebo", + "errors": { + "ociBusy": "V tomto kontajneri práve prebieha operácia OCI.", + "dpkgMissing": "Balík {package} nie je nainštalovaný cez dpkg.", + "dpkgFailed": "Príkaz dpkg-query zlyhal.", + "dpkgNoVersion": "Vo výstupe dpkg sa nenašla verzia zodpovedajúca regulárnemu výrazu.", + "apkFailed": "Príkaz apk info zlyhal.", + "apkNoVersion": "Vo výstupe apk sa nenašla verzia zodpovedajúca regulárnemu výrazu.", + "fileRead": "Súbor {path} sa nepodarilo prečítať.", + "fileNoMatch": "Regulárny výraz file_regex nenašiel zhodu v súbore {path}.", + "binaryFailed": "Program sa nepodarilo spustiť.", + "binaryNoVersion": "Vo výstupe programu sa nenašla verzia zodpovedajúca regulárnemu výrazu.", + "pythonFailed": "Zisťovanie verzie cez python -c importlib.metadata zlyhalo.", + "pythonNoVersion": "Vo výstupe balíka Pythonu sa nenašla verzia zodpovedajúca regulárnemu výrazu.", + "dockerImageResolve": "Nainštalovaný obraz kontajnera sa nepodarilo určiť.", + "dockerInspectFailed": "Príkaz docker inspect zlyhal.", + "dockerLabelMissing": "Kontajner nemá štítok {label}.", + "dockerLabelMutable": "Štítok Dockeru uvádza {tag}. Je to premenlivý tag, ktorý neurčuje konkrétnu verziu.", + "dockerLabelNoVersion": "V štítku Dockeru sa nenašla verzia zodpovedajúca regulárnemu výrazu.", + "dockerExecFailed": "Príkaz docker exec zlyhal.", + "dockerExecNoVersion": "Vo výstupe docker exec sa nenašla verzia zodpovedajúca regulárnemu výrazu.", + "commandEmpty": "Príkaz a argumenty (command_argv) nie sú vyplnené.", + "commandFailed": "Príkaz zlyhal.", + "commandNoVersion": "Vo výstupe príkazu sa nenašla verzia zodpovedajúca regulárnemu výrazu.", + "unsupportedMethod": "Nepodporovaný spôsob zisťovania verzie: {method}", + "unknownUpstream": "Neznámy zdroj dostupnej verzie (upstream_type): {type}", + "githubNotFound": "Repozitár {repo} sa nenašiel.", + "githubRejected": "GitHub odmietol požiadavku (403).", + "githubError": "Chyba GitHubu {code}.", + "noRelease": "Odpoveď neobsahuje tag ani názov vydania.", + "tagNoMatch": "Regulárny výraz tag_regex nenašiel zhodu s hodnotou „{tag}“.", + "httpError": "Chyba HTTP {code}.", + "invalidJson": "Odpoveď neobsahuje platný JSON: {detail}", + "jsonPathUnresolved": "Cesta v JSON „{path}“ sa nenašla.", + "jsonEmpty": "Na zadanej ceste v JSON je prázdna hodnota.", + "dockerNoTags": "Na Docker Hube sa nenašli tagy zodpovedajúce filtru.", + "dockerMovingOnly": "Filtru tag_regex zodpovedajú iba premenlivé tagy. Použi sledovanie obrazov Docker podľa digestu.", + "dockerHubError": "Chyba Docker Hubu {code}.", + "dockerHubJson": "Docker Hub nevrátil platný JSON: {detail}", + "dockerHubEmpty": "Docker Hub nevrátil žiadne tagy.", + "payload": "Údaje musia byť objekt JSON.", + "name": "Zadaj názov s dĺžkou 1 až 64 znakov. Povolené sú písmená, číslice, medzery a ._+-()/.", + "method": "Spôsob zisťovania verzie (installed_via) musí byť jedna z hodnôt: {values}, alebo môže zostať prázdny.", + "package": "Zadaj názov balíka (package), najviac 127 znakov. Povolené sú písmená, číslice a ._+@:/.", + "filePath": "Zadaj úplnú cestu k súboru (file_path), začínajúcu lomkou /.", + "fileRegex": "Zadaj regulárny výraz na získanie verzie zo súboru (file_regex).", + "fileRegexInvalid": "Regulárny výraz pre súbor (file_regex) je neplatný: {detail}", + "binaryPath": "Zadaj úplnú cestu k programu (binary_path), začínajúcu lomkou /.", + "pythonPath": "Zadaj úplnú cestu k interpretu Pythonu (python_path), začínajúcu lomkou /.", + "distribution": "Zadaj názov balíka Pythonu (distribution) podľa PEP 503.", + "container": "Zadaj názov kontajnera (container_name) podľa pravidiel Dockeru.", + "label": "Zadaj názov štítka (label) podľa pravidiel OCI.", + "dockerBinary": "Zadaj cestu k programu alebo samotný názov príkazu (binary_path).", + "manualVersion": "Pri ručnom zadávaní vyplň nainštalovanú verziu (installed_version).", + "versionLength": "Nainštalovaná verzia (installed_version) môže mať najviac {max} znakov.", + "versionControl": "Nainštalovaná verzia (installed_version) obsahuje nepovolený riadiaci znak.", + "installedRegexInvalid": "Regulárny výraz pre nainštalovanú verziu (installed_regex) je neplatný: {detail}", + "upstreamType": "Zdroj dostupnej verzie (upstream_type) musí byť jedna z hodnôt: {values}.", + "tagRegexInvalid": "Regulárny výraz pre tagy (tag_regex) je neplatný: {detail}", + "repoRequired": "Pre zdroj GitHub zadaj repozitár (repo).", + "repoFormat": "Repozitár (repo) musí mať tvar „vlastník/názov“ (owner/name).", + "githubSource": "Zdroj na GitHube (github_source) musí byť jedna z hodnôt: {values}.", + "upstreamUrlRequired": "Pre zdroj HTTP JSON zadaj adresu (upstream_url).", + "upstreamUrl": "Adresa zdroja (upstream_url) musí začínať na http:// alebo https://.", + "upstreamUrlLength": "Adresa zdroja (upstream_url) môže mať najviac {max} znakov.", + "jsonPathRequired": "Pre zdroj HTTP JSON zadaj cestu k verzii v JSON (upstream_json_path).", + "jsonPathLength": "Cesta k verzii v JSON (upstream_json_path) môže mať najviac {max} znakov.", + "jsonPathCharacters": "Cesta k verzii v JSON (upstream_json_path) obsahuje nepovolené znaky.", + "dockerImageRequired": "Pre zdroj Docker Hub zadaj názov obrazu (docker_image).", + "dockerImageLength": "Názov obrazu (docker_image) môže mať najviac {max} znakov.", + "dockerImageFormat": "Názov obrazu (docker_image) musí mať tvar owner/name alebo name podľa pravidiel Docker Hubu.", + "healthPath": "Cesta na kontrolu stavu (health_path) musí byť platná cesta URL s najviac 255 znakmi.", + "logoUrl": "Logo (logo_url) musí byť adresa HTTP/HTTPS alebo lokálna ikona uložená pre tento stroj.", + "discoveryId": "Identifikátor nájdenej aplikácie (discovery_id) je neplatný.", + "helperSlug": "Identifikátor inštalačného skriptu (helper_slug) môže obsahovať malé písmená, číslice a ._-.", + "updateVia": "Pole update_via podporuje iba hodnotu docker.", + "dockerDetector": "Pri update_via=docker vyber detektor docker_label alebo docker_exec.", + "dockerConflict": "Pole {field} nemožno použiť spolu s update_via=docker.", + "updateCommandType": "Aktualizačný príkaz (update_command) musí byť text.", + "updateCommandLength": "Aktualizačný príkaz (update_command) môže mať najviac {max} znakov.", + "updateCommandNull": "Aktualizačný príkaz (update_command) obsahuje nepovolený nulový znak.", + "updateMethod": "Spôsob aktualizácie (update_method) musí byť none, helper alebo custom.", + "updateCommandRequired": "Pre vlastnú aktualizáciu zadaj príkaz (update_command).", + "updateCommandOnlyCustom": "Aktualizačný príkaz (update_command) je povolený iba pri update_method=custom.", + "helperRequired": "Pre update_method=helper vyber podporovaný inštalačný skript (helper_slug).", + "dockerUpdater": "Aplikácia v Dockeri sa aktualizuje spolu s obrazom. Samostatný aktualizátor aplikácie tu nemožno nastaviť.", + "commandRequired": "Zadaj príkaz a jeho argumenty (command_argv) ako neprázdny zoznam.", + "commandList": "Príkaz a argumenty (command_argv) musia byť neprázdny zoznam textových hodnôt.", + "commandCount": "Príkaz a argumenty (command_argv) môžu mať najviac {max} položiek.", + "commandEntry": "Položka command_argv[{index}] musí obsahovať text.", + "commandEntryLength": "Položka command_argv[{index}] môže mať najviac {max} znakov.", + "commandEntryControl": "Položka command_argv[{index}] obsahuje nepovolený riadiaci znak.", + "binaryArgsList": "Argumenty programu (binary_args) musia byť zoznam textových hodnôt.", + "binaryArgsCount": "Argumenty programu (binary_args) môžu mať najviac {max} položiek.", + "binaryArgEntry": "Argument binary_args[{index}] musí obsahovať text.", + "binaryArgLength": "Argument binary_args[{index}] môže mať najviac {max} znakov.", + "binaryArgControl": "Argument binary_args[{index}] obsahuje nepovolený riadiaci znak.", + "portsList": "Webové odkazy (ports) musia byť zoznam položiek s poľami port, description a scheme.", + "portObject": "Webový odkaz ports[{index}] musí byť objekt.", + "portRequired": "Vo webovom odkaze ports[{index}] zadaj port.", + "portInteger": "Port vo webovom odkaze ports[{index}] musí byť celé číslo.", + "portRange": "Port vo webovom odkaze ports[{index}] musí byť od 1 do 65535.", + "portDuplicate": "Port {port} je pri tejto aplikácii uvedený viackrát.", + "portDescription": "Popis webového odkazu ports[{index}] obsahuje nepovolené znaky.", + "portScheme": "Protokol webového odkazu ports[{index}] musí byť http alebo https.", + "portPath": "Cesta webového odkazu ports[{index}].web_path musí byť platná cesta URL s najviac 255 znakmi.", + "portLogo": "Logo webového odkazu ports[{index}].logo_url musí byť adresa HTTP/HTTPS s najviac 512 znakmi.", + "portCategory": "Kategória webového odkazu ports[{index}].category obsahuje nepovolené znaky alebo je príliš dlhá.", + "portCustomUrl": "Vlastná adresa webového odkazu ports[{index}].custom_url musí byť adresa HTTP/HTTPS s najviac 512 znakmi.", + "tagRegexLength": "Regulárny výraz pre tagy (tag_regex) môže mať najviac 512 znakov.", + "persistPermission": "Evidenciu aplikácie sa nepodarilo uložiť. Skontroluj oprávnenia na zápis.", + "persist": "Evidenciu aplikácie sa nepodarilo uložiť.", + "noApps": "Pre tento stroj nie sú evidované žiadne aplikácie.", + "appMissing": "Záznam aplikácie „{appId}“ sa nenašiel.", + "appNotFound": "Záznam aplikácie sa nenašiel." + }, + "methodOciImage": "OCI obraz (nainštaloval ProxMenux)", "ociImageHelp": "Verzia aj dostupné aktualizácie sa určujú podľa obrazu, z ktorého bol tento kontajner vytvorený. Keďže ho nainštaloval ProxMenux, netreba nič nastavovať: nainštalovaný obraz sa porovnáva s obrazom, ktorý je dnes dostupný v jeho registri.", "ociAppVersion": "Aplikácia", "ociImage": "Obraz", @@ -1585,7 +1708,7 @@ "installedRegexPlaceholder": "napr. v?(\\d+\\.\\d+\\.\\d+)", "installedRegexAlt": "install_regex", "regexCaptureGroupLabel": "Regex (so zachytávacou skupinou)", - "regexPlaceholderVersion": "verzia:\\s*(\\d+\\.\\d+\\.\\d+)", + "regexPlaceholderVersion": "version:\\s*(\\d+\\.\\d+\\.\\d+)", "optionalSuffix": "(voliteľné)", "methodNone": "Žiadny (iba odkaz)", "methodDpkg": "balík dpkg (Debian/Ubuntu)", @@ -1606,12 +1729,12 @@ "binaryArgsPlaceholder": "napr. --version (oddelené čiarkou)", "filePathLabel": "Cesta k súboru", "commandLabel": "Príkaz (argv oddelené čiarkou, bez shellu)", - "commandPlaceholder": "myapp, verzia, --json", + "commandPlaceholder": "myapp, version, --json", "commandServerExample": "server, -v", "containerNameLabel": "Názov kontajnera", "containerNamePlaceholder": "napr. ", - "ociLabelKeyLabel": "Kľúč OCI labelu", - "pythonInterpreterLabel": "Cesta k Python interpreteru", + "ociLabelKeyLabel": "Kľúč štítka OCI", + "pythonInterpreterLabel": "Cesta k interpretu Pythonu", "pythonInterpreterPlaceholder": "napr. /opt//venv/bin/python", "pipDistLabel": "Názov distribúcie (pip balík)", "pipDistPlaceholder": "napr. ", @@ -1651,7 +1774,7 @@ "latestFromLabel": "Najnovšia verzia z", "upToDateBadge": "Aktuálne", "updateAvailableBadge": "Dostupná aktualizácia", - "portDescriptionPlaceholder": "Popis (napr. Web UI, go2rtc, admin)", + "portDescriptionPlaceholder": "Popis (napr. webové rozhranie, go2rtc, správa)", "portPortPlaceholder": "port", "portHttp": "http", "portHttps": "https", @@ -1670,7 +1793,7 @@ "detectMethodDockerLabel": "štítok docker", "detectMethodDockerExec": "docker exec", "detectMethodCommand": "príkaz", - "binaryVersionHint": "binárna verzia", + "binaryVersionHint": "program (výstup --version)", "systemctlHint": "systemctl show -p ExecStart", "whichHint": "ktorá ", "apkInfoHint": "\" : \"informácie o apk | grep", @@ -1721,7 +1844,7 @@ "detectorTestTitle": "Výsledok testu detektora", "detectorTestNotSaved": "Iba koncept · neuložené", "detectorTestNoVersion": "Nebola zistená žiadna verzia", - "detectorTestNoUpstream": "Nie je nastavený zdroj upstream", + "detectorTestNoUpstream": "Nie je nastavený zdroj dostupnej verzie", "detectorTestFailed": "Test detektora zlyhal", "deleteFailed": "Odstránenie zlyhalo", "dismissFailed": "Nájdenú aplikáciu sa nepodarilo skryť", @@ -1768,17 +1891,17 @@ "addAnotherApplication": "Registrovať ďalšiu aplikáciu", "doneButton": "Hotovo", "editButton": "Upraviť", - "upstreamErrorTimeout": "Časový limit siete pri kontaktovaní upstream", + "upstreamErrorTimeout": "Zdroj dostupnej verzie neodpovedal včas.", "upstreamErrorNetwork": "Chyba siete: {detail}", "upstreamErrorGithubRateLimit": "Bol dosiahnutý limit požiadaviek GitHubu. V časti Nastavenia → GitHub API nakonfigurujte voliteľný token alebo to skúste znova neskôr.", "upstreamErrorRegistry": "Register obrazu sa nepodarilo kontaktovať. O niekoľko minút sa skontroluje znova.", "upstreamErrorGeneric": "Kontrola proti prúdu zlyhala: {detail}", - "notificationsEnabled": "Upozornenia na upstream aktualizácie sú ZAPNUTÉ – kliknutím ich stlmíte", - "notificationsMuted": "Upstream upozornenia na aktualizácie MUTED – kliknutím aktivujete", - "notifyUpstreamLabel": "Upozorniť ma, keď bude k dispozícii nová upstream verzia", - "notifyUpstreamHelp": "Odošle `app_update_available` do kanálov povolených v Nastaveniach → Upozornenia. Vypnite, ak túto aplikáciu nie je možné aktualizovať na vašom boxe.", + "notificationsEnabled": "Upozornenia na nové verzie sú zapnuté — kliknutím ich stlmíš", + "notificationsMuted": "Upozornenia na nové verzie sú stlmené — kliknutím ich zapneš", + "notifyUpstreamLabel": "Upozorniť ma na novú dostupnú verziu", + "notifyUpstreamHelp": "Odošle upozornenie app_update_available do kanálov zapnutých v Nastaveniach → Upozornenia. Vypni, ak túto aplikáciu na svojom serveri nemôžeš aktualizovať.", "excludeFromBadgeLabel": "Vylúčiť z počítadla aktualizácií LXC", - "excludeFromBadgeHelp": "Nezapočítajte túto aplikáciu do odznaku súhrnných aktualizácií na karte zoznamu LXC.Užitočné, keď ste úmyselne pripnutý ku konkrétnej verzii (požiadavka na sledovanie, zmrazenie kompatibility).Nemá vplyv na vlastný stav karty Aplikácia ani na odchádzajúce upozornenie.", + "excludeFromBadgeHelp": "Nezapočíta túto aplikáciu do počtu aktualizácií v zozname LXC. Hodí sa, ak chceš zámerne zostať pri konkrétnej verzii, napríklad kvôli kompatibilite. Stav na záložke Aplikácie aj upozornenia zostanú nezmenené.", "ociLabelPlaceholder": "org.opencontainers.image.version", "stackMemberTitle": "Časť aplikácie s viacerými kontajnermi", "stackMemberBody": "Tento kontajner podporuje aplikáciu, ktorej hlavný kontajner je {primary}. Zobrazuje sa tam aplikácia, jej webové odkazy a jej verzia." @@ -1872,7 +1995,7 @@ }, "networkInterfaces": { "title": "Vylúčené sieťové rozhrania", - "description": "Vylúčte sieťové rozhrania, napríklad most, bond alebo fyzické sieťové karty, z kontroly stavu a upozornení. Hodí sa to pre rozhrania, ktoré sú zámerne vypnuté alebo sa nepoužívajú.", + "description": "Vylúčte sieťové rozhrania, napríklad sieťové mosty (bridge), bond alebo fyzické sieťové karty, z kontroly stavu a upozornení. Hodí sa to pre rozhrania, ktoré sú zámerne vypnuté alebo sa nepoužívajú.", "emptyTitle": "Nenašli sa žiadne sieťové rozhrania", "interface": "Rozhranie", "down": "VYPNUTÉ", @@ -2295,6 +2418,42 @@ "updateManyDescription": "Počet funkcií, ktoré sa postupne spustia: {count}.", "legacySourceTitle": "Staršia optimalizácia - kliknutím zobrazíte zdroj", "sourceTitle": "Kliknutím zobrazíte zdrojový kód", + "sourceDialogTitle": "Zdrojový kód: {name}", + "sourceLoading": "Načítava sa zdrojový kód…", + "sourceUnavailable": "Zdrojový kód nie je dostupný.", + "sourceLoadFailed": "Zdrojový kód sa nepodarilo načítať. Skús to znova.", + "sourceFunctionMissing": "Funkcia sa nenašla v dostupných skriptoch.", + "sourceUnknownTool": "Neznámy nástroj: {tool}", + "sourceNoMapping": "K nástroju {tool} nie je priradená funkcia.", + "sourceToolNames": { + "subscription_banner": "Odstránenie upozornenia na predplatné", + "time_sync": "Synchronizácia času", + "apt_languages": "Vynechanie jazykových balíkov APT", + "journald": "Optimalizácia journald", + "logrotate": "Optimalizácia logrotate", + "system_limits": "Zvýšenie systémových limitov", + "memory_settings": "Optimalizácia nastavení pamäte", + "zram_swap": "Profil swapu ZRAM", + "kernel_panic": "Nastavenie správania pri páde jadra", + "apt_ipv4": "Vynútenie IPv4 pre APT", + "kexec": "Rýchly reštart cez kexec", + "rpc": "Vypnutie RPC / rpcbind", + "motd": "Vlastná uvítacia správa MOTD", + "system_utils": "Systémové nástroje", + "network_optimization": "Optimalizácia siete", + "bashrc_custom": "Prispôsobenie bashrc", + "figurine": "Figurine", + "fastfetch": "Fastfetch", + "log2ram": "Log2ram (ochrana SSD)", + "zfs_autotrim": "ZFS Autotrim", + "amd_fixes": "Opravy pre procesory AMD (Ryzen/EPYC)", + "persistent_network": "Trvalé názvy sieťových rozhraní", + "vfio_iommu": "Priame priradenie zariadení (VFIO/IOMMU)", + "lvm_repair": "Oprava hlavičiek fyzických zväzkov LVM", + "repo_cleanup": "Vyčistenie repozitárov", + "proxmox_repos": "Repozitáre APT pre Proxmox", + "entropy": "Generovanie entropie (haveged)" + }, "legacy": "staršie", "updateToolTitle": "Aktualizovať {name} na v{version}", "availableUpdates": "Dostupné aktualizácie", @@ -3572,7 +3731,7 @@ }, "loading": { "title": "Načítavam údaje o sieti...", - "description": "Kontrolujem rozhrania, sieťové mosty a premávku" + "description": "Kontrolujem rozhrania, sieťové mosty (bridge) a premávku" }, "errors": { "serverUnavailableTitle": "Server nie je dostupný", @@ -3586,7 +3745,7 @@ }, "sections": { "physicalInterfaces": "Fyzické rozhrania", - "bridgeInterfaces": "Sieťové mosty", + "bridgeInterfaces": "Sieťové mosty (bridge)", "vmLxcInterfaces": "Sieťové rozhrania VM a LXC" }, "summary": { @@ -3606,8 +3765,8 @@ }, "interfaceTypes": { "physical": "Fyzické", - "bridge": "Most", - "bridges": "Mosty", + "bridge": "Sieťový most (bridge)", + "bridges": "Sieťové mosty (bridge)", "bond": "Bond", "vlan": "VLAN", "virtual": "Virtuálne", @@ -3701,7 +3860,7 @@ "inactiveTitle": "Rozhranie je neaktívne", "inactiveDescription": "Toto rozhranie je momentálne vypnuté. Štatistiky sieťovej premávky nie sú dostupné.", "bondConfiguration": "Nastavenie bondu", - "bridgeConfiguration": "Nastavenie mosta" + "bridgeConfiguration": "Nastavenie sieťového mosta (bridge)" }, "flow": { "title": "Tok siete" @@ -4246,7 +4405,7 @@ "unmountTitle": "Odpojiť tento cieľ", "whereIsBorgRepo": "Kde je Borg repozitár?", "backupsKeptMessage": "Existujúce zálohy sa neodstránia.", - "localAttachHelpMessage": "Najprv pripojte jednotky USB.Ak chcete použiť cestu k úložisku PVE + /dump, nechajte pole prázdne (záložný: /var/lib/vz/dump).", + "localAttachHelpMessage": "Najprv pripoj USB disk. Ak pole necháš prázdne, použije sa cesta úložiska PVE doplnená o /dump; náhradná cesta je /var/lib/vz/dump.", "sshAuthorizedKeyHelp": "Pred pridaním do ~/.ssh/authorized_keys pre {user} na vzdialenom hostiteľovi skontrolujte riadok nižšie.", "sshKeyHelpMessage": "Cesta súkromného kľúča na tomto hostiteľovi.Použite {action}, potom skontrolujte a pridajte zobrazený riadok verejného kľúča do ~/.ssh/authorized_keys vzdialeného používateľa.", "sshKeySetupHelp": "Vytvorí kľúč na zadanej lokálnej ceste, ak žiadny neexistuje;inak prečíta svoj verejný kľúč.Na vzdialenom hostiteľovi nie je nainštalovaný žiadny kľúč.", @@ -4290,6 +4449,124 @@ "usesSharedKeyfileAt": "Používa spoločný súbor s kľúčom v", "pbsHelp": "Monitor používa {keyfile} s {option} na šifrované zálohy a obnovy PBS.Súbor kľúča je uložený v režime {mode}.Uschovajte si bezpečnú kópiu mimo tohto hostiteľa." }, + "apiErrors": { + "requestFailed": "Požiadavka zlyhala.", + "absolutePath": "Cesta musí začínať znakom /.", + "pathConfigured": "Táto cesta už je nastavená.", + "pathRequired": "Zadaj cestu.", + "pathQuery": "V požiadavke chýba cesta.", + "pathNotFound": "Cesta sa nenašla.", + "invalidJobId": "Neplatný identifikátor úlohy.", + "jobNotFound": "Úloha sa nenašla.", + "runnerMissing": "Na serveri chýba skript na spustenie zálohy.", + "noRestore": "Nie je tu žiadny záznam obnovy na zatvorenie.", + "invalidFile": "Neplatný názov súboru.", + "notFound": "Požadovaný záznam sa nenašiel.", + "logOutside": "Cesta k záznamu je mimo povoleného priečinka.", + "targetsList": "Ciele musia byť zadané ako zoznam.", + "emptyExpression": "Zadaj časový plán.", + "invalidId": "V identifikátore použi iba písmená, číslice, _ alebo -.", + "backend": "Vyber cieľ PBS, miestny archív alebo Borg.", + "remoteBackend": "Vyber cieľ PBS alebo Borg.", + "remoteBackendQuoted": "Vyber cieľ PBS alebo Borg.", + "profileMode": "Vyber predvolený alebo vlastný profil.", + "borgAttached": "Borg sa nedá pripojiť k úlohe PVE; vzdump zapisuje iba na PBS alebo miestne úložisko.", + "borgAttachedLong": "Borg sa nedá pripojiť k úlohe PVE; vzdump zapisuje iba na PBS alebo miestne úložisko.", + "parentRequired": "Vyber nadradenú úlohu PVE aj jej úložisko.", + "absolutePaths": "Zadaj zoznam ciest, ktoré začínajú znakom /.", + "customPath": "Do vlastného profilu pridaj aspoň jednu cestu.", + "defaultPaths": "Cesty predvoleného profilu sa nepodarilo zistiť.", + "retentionObject": "Pravidlá uchovávania záloh majú neplatný formát.", + "pbsRepository": "Zadaj repozitár PBS.", + "pbsEncryption": "Vyber režim šifrovania PBS: bez šifrovania, nový kľúč alebo existujúci kľúč.", + "pbsKeyFailed": "Súbor so šifrovacím kľúčom PBS sa nepodarilo vytvoriť.", + "pbsClientMissing": "Súbor so šifrovacím kľúčom PBS sa nepodarilo vytvoriť. Skontroluj, či je nainštalovaný proxmox-backup-client.", + "borgRepository": "Zadaj repozitár Borg.", + "borgEncryption": "Vyber podporovaný režim šifrovania Borg: none, repokey, keyfile alebo authenticated.", + "encryption": "Vyber podporovaný režim šifrovania: none, repokey, keyfile alebo authenticated.", + "borgPassphrase": "Šifrovaný repozitár Borg potrebuje heslo. Ulož ho pri cieli alebo ho zadaj v požiadavke.", + "passphrase": "Pri zapnutom šifrovaní zadaj heslo.", + "password": "Zadaj heslo.", + "deviceConfirmation": "Na potvrdenie zadaj presný názov zariadenia.", + "invalidDevice": "Neplatná cesta k zariadeniu.", + "absoluteMountpoint": "Prípojný bod musí byť cesta začínajúca znakom /.", + "archiveLayout": "Archív nemá očakávanú štruktúru: chýba priečinok rootfs/.", + "archiveMissing": "Archív sa nenašiel.", + "archiveNotFile": "Cesta k archívu neoznačuje bežný súbor.", + "invalidName": "Neplatný názov.", + "invalidStaging": "Neplatná cesta k dočasným súborom.", + "jobRename": "Názov existujúcej úlohy sa nedá zmeniť. Ak ju chceš premenovať, odstráň ju a vytvor novú.", + "absoluteKey": "Cesta k súboru s kľúčom musí začínať znakom /.", + "mode": "Vyber miestny cieľ alebo pripojenie cez SSH.", + "nameRequired": "Zadaj názov; použi iba písmená, číslice, _ alebo -.", + "noLog": "Pre túto úlohu zatiaľ nie je dostupný záznam.", + "noPbsConfig": "Súbor s ručne nastavenými cieľmi PBS sa nenašiel.", + "outputMissing": "Chýba výstupný súbor.", + "parserJson": "Výstup spracovania archívu nemá platný formát JSON.", + "restoreJson": "Výstup prípravy obnovy nemá platný formát JSON.", + "repoRequired": "Zadaj repozitár.", + "repoSnapshot": "Vyber repozitár aj zálohu.", + "borgRepoSnapshot": "Pre Borg vyber repozitár aj zálohu.", + "pbsRepoSnapshot": "Pre PBS vyber repozitár aj zálohu.", + "repoName": "Zadaj názov repozitára.", + "restoreMissing": "Na tomto serveri chýbajú nástroje na obnovu.", + "serverDatastore": "Zadaj server aj dátové úložisko.", + "snapshotRequired": "Vyber zálohu.", + "source": "Vyber zdroj PBS, Borg alebo miestny archív.", + "sshPort": "Port SSH musí byť celé číslo od 1 do 65535.", + "sshRequired": "Pre SSH zadaj používateľa, hostiteľa a vzdialenú cestu.", + "repositoryPath": "Cieľ nemá nastavenú cestu k repozitáru.", + "taskExpired": "Úloha sa nenašla alebo už vypršala.", + "invalidExpression": "Neplatný časový plán.", + "noReport": "Kontrola nevrátila žiadnu správu.", + "parseManifestFailed": "Spracovanie manifestu skončilo chybou.", + "jobExists": "Úloha s názvom {value} už existuje.", + "pathMissing": "Na tomto serveri sa nenašla cesta: {value}", + "deviceMissing": "Zariadenie neexistuje: {value}", + "mountpoint": "Táto cesta nie je prípojný bod: {value}", + "localArchiveMissing": "Miestny archív sa nenašiel: {value}", + "borgDestination": "Cieľ Borg „{value}“ sa nenašiel.", + "pbsDestination": "Cieľ PBS „{value}“ sa nenašiel.", + "pbsPassword": "Pre repozitár PBS „{value}“ nie je dostupné heslo.", + "borgRepoMissing": "Repozitár Borg „{value}“ nie je nastavený.", + "pbsRepoMissing": "Repozitár PBS „{value}“ nie je nastavený.", + "borgTargetMissing": "Cieľ Borg sa nenašiel: {value}", + "pbsTargetMissing": "Repozitár PBS sa nenašiel: {value}", + "pveJobMissing": "Úloha zálohovania PVE sa nenašla: {value}", + "statePersist": "Stav sa nepodarilo uložiť: {value}", + "sshDirectory": "Priečinok SSH sa nepodarilo pripraviť: {value}", + "logRead": "Záznam sa nepodarilo prečítať: {value}", + "envUpdate": "Súbor .env sa nepodarilo aktualizovať: {value}", + "pbsConfigWrite": "Nastavenia PBS sa nepodarilo uložiť: {value}", + "persist": "Údaje sa nepodarilo uložiť: {value}", + "archiveRemove": "Archív sa nepodarilo odstrániť: {value}", + "start": "Úlohu sa nepodarilo spustiť: {value}", + "borgTargetsUpdate": "Súbor borg-targets.txt sa nepodarilo aktualizovať: {value}", + "pbsTargetsUpdate": "Súbor pbs-manual-configs.txt sa nepodarilo aktualizovať: {value}", + "unitsUpdate": "Jednotky systemd sa nepodarilo aktualizovať: {value}", + "borgTargetsWrite": "Súbor borg-targets.txt sa nepodarilo uložiť: {value}", + "jobWrite": "Súbory úlohy sa nepodarilo uložiť: {value}", + "localTargetWrite": "Súbor local-target.conf sa nepodarilo uložiť: {value}", + "unitsWrite": "Jednotky systemd sa nepodarilo uložiť: {value}", + "format": "Formátovanie zlyhalo: {value}", + "calendar": "Neplatný časový plán: {value}", + "mount": "Disk sa nepodarilo pripojiť: {value}", + "parserInvocation": "Spracovanie archívu sa nepodarilo spustiť: {value}", + "preflightInvocation": "Kontrolu pred obnovou sa nepodarilo spustiť: {value}", + "publicKeyMissing": "Po vytvorení kľúča sa nenašiel verejný kľúč: {value}", + "retentionInteger": "Pravidlo uchovávania „{value}“ musí byť celé číslo.", + "retentionNegative": "Pravidlo uchovávania „{value}“ nesmie byť záporné.", + "keygen": "Vytvorenie kľúča SSH zlyhalo: {value}", + "systemctl": "Správa služby cez systemctl zlyhala: {value}", + "unmount": "Disk sa nepodarilo odpojiť: {value}", + "taskIncomplete": "Úloha ešte nie je dokončená. Jej stav: {value}", + "unknownKind": "Neznámy typ: {value}", + "unknownMode": "Neznámy režim: {value}", + "defaultRemove": "Cesta {value} je predvolená a nedá sa odstrániť.", + "defaultAdd": "Cesta {value} je predvolená; nemusíš ju pridávať.", + "keyImport": "V {value} nie je uložený súbor s kľúčom PBS. Najprv ho importuj.", + "storageMismatch": "Úložisko sa nezhoduje: úloha PVE používa {value}, požiadavka uvádza {other}." + }, "errors": { "backendNoStagingPath": "Cieľ nevrátil cestu k dočasným súborom.", "deleteFailed": "Mazanie zlyhalo: {error}", @@ -4875,7 +5152,7 @@ "keepAll": "Ponechať všetky zálohy", "description": "Predvolená politika uchovávania záloh uložená v Proxmoxe. Zálohovacie úlohy s vlastnou politikou majú pred týmto predvoleným nastavením prednosť.", "refresh": "Obnoviť", - "saved": "Politika uchovávania záloh úložiska bola uložená. Prerezávanie sa nevykonalo.", + "saved": "Pravidlá uchovávania záloh na úložisku boli uložené. Žiadne zálohy sa teraz neodstránili.", "choosePolicy": "Vyberte Ponechať všetky alebo aspoň jeden počet uchovávaných záloh väčší ako nula.", "saveFailed": "Nepodarilo sa uložiť politiku uchovávania záloh úložiska. Ak sa konfigurácia zmenila, obnovte zoznam.", "loadFailed": "Nepodarilo sa načítať politiku uchovávania záloh úložiska.", @@ -5387,6 +5664,7 @@ "websocketError": "Chyba WebSocket spojenia", "connectionClosed": "Spojenie bolo zatvorené", "completedSuccessfully": "Skript sa úspešne dokončil", + "cancelled": "Operácia bola zrušená.", "completedWithError": "Skript skončil s chybovým kódom {code}", "yes": "Áno", "yourInput": "Tvoj vstup:", @@ -5709,7 +5987,7 @@ "nextStep": { "missing": "Nastavte si držanie na týchto pracovných miestach, alebo na sklade, na ktorý píšu. Proxmox berie nastavenie úlohy ako prvý, potom úložisko je, potom uzol predvolený.", "notDeclared": "Tieto práce uchovávajú všetky kópie, ktoré robia. To je zámerná voľba pre niektoré destinácie, ale potvrďte, že cieľ má priestor na rast.", - "onServer": "Tieto úlohy píšu na záložný server, ktorý ich prerezáva podľa vlastných pravidiel. Z tohto uzla sa nedá čítať to, čo drží, takže skontrolujte, či tam nie je." + "onServer": "Tieto úlohy ukladajú zálohy na zálohovací server. Ten odstraňuje staré zálohy podľa vlastných pravidiel. Z tohto uzla sa nedá zistiť, ktoré zálohy uchováva; skontroluj ich priamo na zálohovacom serveri." }, "explanation": "O tom, koľko výtlačkov sa uchováva a ako dlho sa uchováva. Bez nej sa cieľ naplní, kým neprestane prijímať nové kópie, a záloha, ktorú nemožno napísať, je tá, o ktorej sa dozviete v deň, keď ju potrebujete." }, @@ -6119,11 +6397,11 @@ } }, "bridge_without_ports": { - "title": "Porty bridgeov", - "rationale": "Konfigurácia portov každého bridge. Bridge bez fyzického portu obsluhuje internú alebo smerovanú sieť.", + "title": "Porty sieťových mostov (bridge)", + "rationale": "Konfigurácia portov každého sieťového mosta (bridge). Sieťový most (bridge) bez fyzického portu obsluhuje internú alebo smerovanú sieť.", "summary": { - "allConnected": "Všetkých {total} bridgeov má port", - "isolated": "{count} z {total} bridgeov nemá port", + "allConnected": "Všetkých {total} sieťových mostov (bridge) má port", + "isolated": "{count} z {total} sieťových mostov (bridge) nemá port", "evaluationFailed": "Kontrolu sa nepodarilo vyhodnotiť" } } @@ -6339,13 +6617,13 @@ "network": "Sieť", "adapters": "Adaptéry", "bond": "Bond", - "bridge": "Bridge", - "bridges": "Bridge", + "bridge": "Sieťový most (bridge)", + "bridges": "Sieťové mosty (bridge)", "physicalAdapters": "Fyzické adaptéry", "interface": "Rozhranie", "driver": "Ovládač", "state": "Stav", - "networkDiagramNote": "Cesta od kábla ku každému VM a LXC: fyzický adaptér, bond, ak ich zoskupuje, bridge a pripojené VM a LXC.", + "networkDiagramNote": "Cesta od kábla ku každému VM a LXC: fyzický adaptér, bond, ak ich zoskupuje, sieťový most (bridge) a pripojené VM a LXC.", "storageAndProtection": "Úložisko a ochrana", "storage": "Úložisko", "content": "Obsah", @@ -7367,35 +7645,40 @@ "title": "Proxmox Backup Server", "server": "Server PBS", "chooseServer": "Vybrať server PBS", - "local": "Miestny PBS", + "local": "Lokálny PBS", "thisNode": "PBS na tomto uzle", "updatedAt": "Aktualizované o {time}", "servicesActive": "Služby sú aktívne", - "detectedTitle": "PBS zistené v úložisku Proxmox", - "detectedHelp": "Tieto Proxmox Backup Servery sú nastavené ako úložisko záloh. Pripojte každý z nich API tokenom len na čítanie, aby ste tu videli jeho datastory, úlohy a joby.", + "detectedTitle": "PBS zistené v nastaveniach úložísk Proxmoxu", + "detectedHelp": "Tieto servery Proxmox Backup Server sú nastavené ako úložiská záloh. Pripoj ich pomocou API tokenu iba na čítanie a zobrazia sa tu ich dátové úložiská, úlohy a plány údržby.", "connect": "Pripojiť", "tasksTab": "Úlohy", "signInWith": "Prihlásiť sa pomocou", "methodPassword": "Používateľ a heslo", "methodToken": "API token", - "username": "Používateľ (pouzivatel@realm)", + "username": "Používateľ", "password": "Heslo", - "passwordHelp": "Heslo sa použije iba raz na vytvorenie API tokenu len na čítanie (rola Audit) pre tento Monitor. Uloží sa iba tento token, nikdy nie heslo. Najprv zapnite overovanie v Monitore.", + "passwordHelp": "Heslo sa použije iba raz na vytvorenie API tokenu iba na čítanie s rolou Audit pre tento Monitor. Uloží sa iba token, heslo sa neukladá. Najprv zapni overovanie v Monitore.", "cancel": "Zrušiť", "refresh": "Obnoviť", "manage": "Spravovať pripojenia PBS", "loadFailed": "Nepodarilo sa načítať stav PBS.", "loading": "Načítavajú sa údaje PBS…", - "noServer": "Pridajte pripojenie PBS na zobrazenie dátových úložísk, úloh a plánov.", - "permissionsHelp": "Pred uložením prihlasovacích údajov povoľte overovanie v Monitore. Použite vyhradený API token PBS s rolou Audit na / v ACL používateľa aj tokenu, so zapnutým dedením. Tento panel údaje PBS iba číta.", + "noServer": "Pridaj pripojenie PBS a zobrazia sa jeho dátové úložiská, úlohy a plány údržby.", + "permissionsHelp": "Pred uložením prihlasovacích údajov zapni overovanie v Monitore. Použi vyhradený API token PBS. Používateľ aj token musia mať v zozname prístupových oprávnení (ACL) rolu Audit na ceste / so zapnutým dedením. Tento panel údaje PBS iba číta.", "editConnection": "Pripojenie na úpravu", "add": "Pridať nové pripojenie", "name": "Názov", - "url": "HTTPS URL (pre pôvodný port PBS uveďte :8007)", - "token_id": "ID API tokenu (user@realm!token)", - "token_secret": "Tajný kľúč API tokenu (ponechajte prázdne, ak chcete zachovať uložený kľúč)", - "fingerprint": "Odtlačok SHA256 certifikátu (voliteľný)", - "tlsHelp": "Pre bežné overenie certifikačnej autority a názvu hostiteľa ponechajte odtlačok prázdny. Pri certifikáte s vlastným podpisom skopírujte jeho odtlačok SHA256 z konzoly PBS alebo iného dôveryhodného kanála. Odtlačok sa kontroluje pred odoslaním prihlasovacích údajov.", + "url": "Adresa HTTPS", + "urlHelp": "Štandardný port PBS je 8007, napríklad https://pbs.example:8007.", + "usernameHelp": "Použi meno a overovaciu oblasť oddelené znakom @, napríklad root@pam.", + "tokenIdHelp": "Použi formát meno@oblasť!token, napríklad monitor@pbs!proxmenux.", + "tokenSecretHelp": "Zadaj tajný kľúč k tomuto API tokenu.", + "tokenSecretKeepHelp": "Prázdne pole zachová uložený tajný kľúč tokenu.", + "token_id": "ID API tokenu", + "token_secret": "Tajný kľúč API tokenu", + "fingerprint": "Odtlačok SHA256 (voliteľný)", + "tlsHelp": "Pri bežnom overovaní certifikačnej autority a názvu hostiteľa nechaj odtlačok prázdny. Pri certifikáte s vlastným podpisom skopíruj odtlačok SHA256 z konzoly PBS alebo iného dôveryhodného zdroja. Kontroluje sa ešte pred odoslaním prihlasovacích údajov.", "saved": "Pripojenie PBS bolo overené a uložené.", "saveFailed": "Nepodarilo sa uložiť pripojenie PBS.", "testing": "Overuje sa pripojenie…", @@ -7407,9 +7690,9 @@ "total": "Kapacita súborového systému", "used": "Použité", "free": "Dostupné", - "noDatastores": "Žiadne dostupné dátové úložiská. Skontrolujte konfiguráciu úložísk a oprávnenia používateľa a tokenu.", + "noDatastores": "Nie sú dostupné žiadne dátové úložiská. Skontroluj ich nastavenia a oprávnenia používateľa aj tokenu.", "tasks": "Nedávne úlohy", - "noTasks": "Neboli vrátené žiadne nedávne úlohy.", + "noTasks": "PBS nevrátil žiadne nedávne úlohy.", "task": "Úloha", "started": "Spustené", "status": "Stav", @@ -7419,7 +7702,7 @@ "schedule": "Plán", "sync": "Synchronizácia", "verify": "Overenie", - "prune": "Prerezávanie", + "prune": "Odstraňovanie starých záloh", "overview": "Prehľad", "logs": "Systémové záznamy", "terminal": "Terminál", @@ -7430,52 +7713,111 @@ "memory": "Pamäť", "uptime": "Čas prevádzky", "capacityUnavailable": "Kapacita nie je k dispozícii.", - "datastoresUnavailable": "{count} nie je k dispozícii", + "datastoresUnavailable": "Nedostupné úložiská: {count}", "datastoresOnline": "Všetky dostupné", "moreDatastores": "+{count} ďalších dátových úložísk", - "estimatedFull": "Odhadovaný plný", - "estimatedFullUnknown": "Zatiaľ nie je dostatok údajov", + "estimatedFull": "Odhadované zaplnenie", + "estimatedFullUnknown": "Zatiaľ sa nedá odhadnúť", "duration": "Trvanie", - "noJobs": "Nie sú nakonfigurované žiadne plány synchronizácie, overovania ani odstraňovania." + "noJobs": "Nie sú nastavené žiadne plány synchronizácie, overovania ani odstraňovania starých záloh.", + "removeFailed": "Nepodarilo sa odstrániť pripojenie PBS.", + "savedRefreshFailed": "Pripojenie PBS sa uložilo, ale nepodarilo sa obnoviť zoznam pripojení. Pred ďalšou zmenou obnov stránku.", + "removedRefreshFailed": "Pripojenie PBS sa odstránilo, ale nepodarilo sa obnoviť zoznam pripojení. Obnov stránku.", + "technicalDetails": "Technické podrobnosti", + "datastoreType": "Dátové úložisko", + "errors": { + "configRead": "Nepodarilo sa načítať uložené pripojenia PBS. Skontroluj konfiguračný súbor a oprávnenia.", + "invalidConfig": "Nastavenia pripojenia PBS nie sú platné. Skontroluj formulár a skús to znova.", + "invalidField": "Niektoré pole pripojenia nie je platné alebo je príliš dlhé.", + "invalidUrl": "Použi adresu HTTPS bez vložených prihlasovacích údajov, parametrov za otáznikom a časti za znakom #.", + "nameRequired": "Zadaj názov servera s najviac 128 znakmi.", + "tokenIdFormat": "Zadaj ID API tokenu PBS vo formáte user@realm!token.", + "tokenSecret": "Zadaj platný tajný kľúč API tokenu bez medzier a riadiacich znakov.", + "invalidTokenId": "ID API tokenu môže obsahovať iba znaky ASCII.", + "invalidFingerprint": "Zadaj odtlačok SHA256 certifikátu: 64 šestnástkových znakov, prípadne oddelených dvojbodkami.", + "fingerprintMismatch": "Certifikát PBS sa nezhoduje s odtlačkom. Prihlasovacie údaje sa neodoslali.", + "tokenRejected": "PBS odmietol API token alebo jeho oprávnenia. Skontroluj zoznam prístupových oprávnení (ACL) používateľa aj tokenu.", + "invalidResponse": "PBS vrátil neočakávanú odpoveď. Presmerovania sa nenasledujú.", + "invalidJson": "PBS vrátil neplatný dokument JSON.", + "connectFailed": "Nepodarilo sa pripojiť k PBS cez overené HTTPS. Skontroluj adresu, certifikát a službu.", + "invalidId": "ID pripojenia PBS nie je platné. Obnov zoznam pripojení.", + "invalidDatastores": "PBS vrátil neplatný zoznam dátových úložísk.", + "connectionLimit": "Môžeš nastaviť najviac {count} pripojení PBS.", + "username": "Zadaj používateľa PBS vo formáte user@realm, napríklad root@pam.", + "password": "Zadaj heslo používateľa PBS.", + "loginRejected": "PBS odmietol používateľské meno alebo heslo.", + "invalidLogin": "PBS vrátil neplatnú odpoveď na prihlásenie.", + "tokenCreateDenied": "Tento používateľ PBS nemôže vytvárať API tokeny.", + "invalidToken": "PBS vrátil neplatný API token.", + "auditRoleDenied": "Tento používateľ PBS nemôže prideliť rolu Audit. Prihlás sa ako root@pam alebo iný správca.", + "notFound": "Pripojenie PBS sa nenašlo. Obnov zoznam pripojení.", + "readFailed": "Nepodarilo sa načítať údaje PBS. Skontroluj službu a oprávnenia.", + "invalidList": "PBS vrátil neplatný zoznam údajov.", + "localUnavailable": "PBS na tomto hostiteľovi nie je dostupný.", + "authRequired": "Pred správou vzdialených pripojení PBS zapni lokálne overovanie v Monitore.", + "datastoreOffline": "Dátové úložisko je odpojené, v režime údržby alebo jeho zariadenie nie je pripojené.", + "datastoreUnavailable": "Súborový systém dátového úložiska nie je dostupný." + }, + "taskTypes": { + "backup": "Zálohovanie", "restore": "Obnova", "verify": "Overovanie", + "verifyGroup": "Overovanie skupiny záloh", "verifySnapshot": "Overovanie snímky", + "prune": "Odstraňovanie starých záloh", "garbageCollection": "Čistenie nepoužívaných dát", "sync": "Synchronizácia", + "updateCheck": "Kontrola aktualizácií", "terminal": "Terminál", "createDatastore": "Vytvorenie dátového úložiska", + "other": "Iná úloha ({type})" + }, + "states": { "ok": "V poriadku", "unknown": "Neznámy", "warnings": "Upozornenia: {count}", "warning": "Upozornenie", "error": "Chyba" }, + "serviceStates": { "active": "Aktívna", "inactive": "Neaktívna", "failed": "Zlyhala", "activating": "Spúšťa sa", "deactivating": "Zastavuje sa", "unknown": "Neznámy stav" }, + "durationUnits": { "seconds": "{count} s", "minutes": "{count} min", "hours": "{count} h", "days": "{count} d" } }, "monitorLinks": { "groups": { - "cluster": "Cluster", + "cluster": "Klaster", "standalone": "Samostatné uzly", "pbs": "Proxmox Backup Server" }, "thisNode": "Tento uzol", "checking": "Kontrolujú sa uzly…", "loadFailed": "Nepodarilo sa načítať zoznam uzlov.", - "empty": "Zatiaľ žiadne ďalšie uzly. Pridajte jeden, aby ste odtiaľto otvorili jeho Monitor.", + "empty": "Zatiaľ tu nie sú ďalšie uzly. Pridaj uzol a jeho Monitor otvoríš priamo odtiaľto.", "noResponse": "Žiadna odpoveď", "pbsInterface": "rozhranie PBS", "openNewTab": "Otvoriť na novej karte", "manage": "Pridať alebo spravovať uzly…", "dialogTitle": "Prepojené uzly", - "dialogDescription": "Uzly klastra a nakonfigurované Proxmox Backup Server sa zisťujú automaticky. Každý Monitor má vlastné prihlásenie.", + "dialogDescription": "Uzly klastra a nastavené servery Proxmox Backup Server sa zisťujú automaticky. Do Monitora každého uzla sa prihlasuješ samostatne.", "addTitle": "Pridať uzol", - "name": "Meno", - "address": "Adresa monitora", + "name": "Názov uzla", + "address": "Adresa Monitora", "type": "Typ", "add": "Pridať", "save": "Uložiť", "remove": "Odstrániť", - "visible": "Viditeľné", + "visible": "Zobraziť", "autoAddress": "Automaticky", - "detected": "Zistené", - "added": "Pridané", + "detected": "Zistený", + "added": "Pridaný", "saveFailed": "Nepodarilo sa uložiť zoznam uzlov.", "backTo": "Späť na {name}", - "cameFromTitle": "Pridať uzol monitora?", - "cameFromBody": "Pridajte {name} do prepojených uzlov tohto monitora.", + "cameFromTitle": "Pridať uzol Monitora?", + "cameFromBody": "Pridaj {name} medzi prepojené uzly tohto Monitora.", "notNow": "Teraz nie", "knownTitle": "Pridať prepojené uzly?", - "knownBody": "{name} prepája tieto monitory. Vyberte tie, ktoré chcete pridať do tohto monitora.", + "knownBody": "Uzol {name} má prepojené tieto uzly. Vyber tie, ktoré chceš pridať aj sem.", "addSelected": "Pridať vybrané", "pbsWebInterface": "Webové rozhranie PBS", "changeAddress": "Zmeniť adresu", - "cancel": "Zrušiť" + "cancel": "Zrušiť", + "errors": { + "addressRequired": "Zadaj adresu Monitora.", + "invalidAddress": "Adresa musí začínať na http:// alebo https:// a obsahovať názov hostiteľa alebo IP adresu.", + "addressCredentials": "Adresa nesmie obsahovať používateľské meno ani heslo.", + "invalidPort": "Port v adrese nie je platný. Zadaj číslo od 1 do 65535.", + "invalidRequest": "Požiadavka nie je platná. Obnov stránku a skús to znova.", + "limit": "Môžeš pridať najviac {count} uzlov.", + "duplicate": "Táto adresa už je v zozname.", + "notFound": "Uzol sa nenašiel. Obnov zoznam a skús to znova.", + "detectedRemove": "Odstrániť môžeš iba ručne pridané uzly. Automaticky zistené uzly môžeš skryť." + } }, "apiErrors": { "http": "Požiadavka na API zlyhala: {status} {statusText}", diff --git a/AppImage/messages/sv/common.json b/AppImage/messages/sv/common.json index 942691e7..c0f5d09e 100644 --- a/AppImage/messages/sv/common.json +++ b/AppImage/messages/sv/common.json @@ -1231,7 +1231,9 @@ "update": "Uppdatera", "modify": "Ändra", "recover": "Återställ", + "registerRestored": "Registrera igen", "terminalTitleUpdate": "Uppdatera OCI-applikation", + "terminalTitleRecoverPrevious": "Återställ den tidigare OCI-installationen", "terminalTitleModify": "Ändra OCI-applikation", "terminalTitleRecover": "Återställ återställd OCI-applikation", "terminalDescription": "Samma process körs som i ProxMenux-menyn: OCI manager Apps → Hantera installerade OCI-applikationer.", @@ -1760,7 +1762,128 @@ "dockerEvidenceImage": "Avbild", "dockerEvidencePort": "Publicerad TCP-port", "dockerEvidenceProject": "Compose-projekt", - "dockerEndpointReview": "Container med publicerade TCP-portar. Bekräfta namnet och webbadressen innan du sparar. Registreringen konfigurerar inga uppdateringar." + "dockerEndpointReview": "Container med publicerade TCP-portar. Bekräfta namnet och webbadressen innan du sparar. Registreringen konfigurerar inga uppdateringar.", + "confirmRemove": "Ta bort applikationens post från fliken App? Detta avinstallerar inte applikationen.", + "packageExample": "t.ex. {package}", + "packageHelpBefore": "Fylls i automatiskt från Namn. Kontrollera med", + "packageHelpAfter": "i CT:n.", + "binaryHelpBefore": "Absolut sökväg. Hitta den med", + "binaryHelpOr": "eller", + "errors": { + "ociBusy": "en OCI-åtgärd pågår på den här containern", + "dpkgMissing": "{package} är inte installerat via dpkg", + "dpkgFailed": "dpkg-query misslyckades", + "dpkgNoVersion": "ingen version matchade i utdata från dpkg", + "apkFailed": "apk info misslyckades", + "apkNoVersion": "ingen version matchade i utdata från apk", + "fileRead": "kunde inte läsa {path}", + "fileNoMatch": "file_regex matchade inte {path}", + "binaryFailed": "anropet av binärfilen misslyckades", + "binaryNoVersion": "ingen version matchade i utdata från binärfilen", + "pythonFailed": "python -c importlib.metadata misslyckades", + "pythonNoVersion": "ingen version matchade i utdata från Python-distributionen", + "dockerImageResolve": "kunde inte lösa containerns installerade avbild", + "dockerInspectFailed": "docker inspect misslyckades", + "dockerLabelMissing": "containern saknar etiketten {label}", + "dockerLabelMutable": "docker-etiketten rapporterar {tag} (föränderlig tagg, inte en version)", + "dockerLabelNoVersion": "ingen version matchade i utdata från docker-etiketten", + "dockerExecFailed": "docker exec misslyckades", + "dockerExecNoVersion": "ingen version matchade i utdata från docker exec", + "commandEmpty": "command_argv är tom", + "commandFailed": "kommandot misslyckades", + "commandNoVersion": "ingen version matchade i kommandots utdata", + "unsupportedMethod": "metod som inte stöds: {method}", + "unknownUpstream": "okänd upstream_type: {type}", + "githubNotFound": "{repo}: hittades inte", + "githubRejected": "github avvisade förfrågan (403)", + "githubError": "github-fel {code}", + "noRelease": "inget tagg- eller releasenamn i svaret", + "tagNoMatch": "tag_regex matchade inte '{tag}'", + "httpError": "http-fel {code}", + "invalidJson": "ogiltigt JSON-svar: {detail}", + "jsonPathUnresolved": "json_path '{path}' kunde inte lösas", + "jsonEmpty": "tomt värde vid json_path", + "dockerNoTags": "inga taggar matchade (docker_hub)", + "dockerMovingOnly": "tag_regex matchade bara rörliga taggar; använd spårning av Docker-avbildens digest", + "dockerHubError": "docker hub-fel {code}", + "dockerHubJson": "ogiltig JSON från docker hub: {detail}", + "dockerHubEmpty": "docker hub returnerade inga taggar", + "payload": "payload måste vara ett JSON-objekt", + "name": "name krävs och måste vara 1–64 tecken av bokstäver/siffror/mellanslag/._+-()/", + "method": "installed_via måste vara en av: {values} eller tom", + "package": "package krävs (bokstäver/siffror/._+@:/ upp till 127 tecken)", + "filePath": "file_path krävs och måste vara en absolut sökväg", + "fileRegex": "file_regex krävs", + "fileRegexInvalid": "file_regex är inte ett giltigt reguljärt uttryck: {detail}", + "binaryPath": "binary_path krävs och måste vara en absolut sökväg", + "pythonPath": "python_path krävs och måste vara en absolut sökväg", + "distribution": "distribution krävs (namn enligt PEP 503)", + "container": "container_name krävs (Dockers namngivningsregler)", + "label": "label krävs (namngivningsregler för OCI-etiketter)", + "dockerBinary": "binary_path krävs (absolut sökväg eller enbart kommando)", + "manualVersion": "installed_version krävs för den manuella metoden", + "versionLength": "installed_version överskrider {max} tecken", + "versionControl": "installed_version innehåller ett otillåtet kontrolltecken", + "installedRegexInvalid": "installed_regex är inte ett giltigt reguljärt uttryck: {detail}", + "upstreamType": "upstream_type måste vara en av: {values}", + "tagRegexInvalid": "tag_regex är inte ett giltigt reguljärt uttryck: {detail}", + "repoRequired": "repo krävs för upstream_type=github", + "repoFormat": "repo måste vara 'owner/name'", + "githubSource": "github_source måste vara en av: {values}", + "upstreamUrlRequired": "upstream_url krävs för upstream_type=http_json", + "upstreamUrl": "upstream_url måste vara en http(s)-URL", + "upstreamUrlLength": "upstream_url överskrider {max} tecken", + "jsonPathRequired": "upstream_json_path krävs för upstream_type=http_json", + "jsonPathLength": "upstream_json_path överskrider {max} tecken", + "jsonPathCharacters": "upstream_json_path använder otillåtna tecken", + "dockerImageRequired": "docker_image krävs för upstream_type=docker_hub", + "dockerImageLength": "docker_image överskrider {max} tecken", + "dockerImageFormat": "docker_image måste följa Docker Hubs namngivning (owner/name eller name)", + "healthPath": "health_path måste vara en giltig URL-sökväg (högst 255 tecken)", + "logoUrl": "logo_url måste vara en http(s)-URL eller den här VM:ens lokalt cachade ikon", + "discoveryId": "ogiltigt discovery_id", + "helperSlug": "helper_slug måste vara en slug med gemener (bokstäver/siffror/._-)", + "updateVia": "update_via accepterar bara 'docker'", + "dockerDetector": "update_via=docker kräver en detektor av typen docker_label eller docker_exec", + "dockerConflict": "update_via=docker kan inte kombineras med {field}", + "updateCommandType": "update_command måste vara en sträng", + "updateCommandLength": "update_command överskrider {max} tecken", + "updateCommandNull": "update_command innehåller en null-byte", + "updateMethod": "update_method måste vara none, helper eller custom", + "updateCommandRequired": "update_command krävs för update_method=custom", + "updateCommandOnlyCustom": "update_command tillåts bara för update_method=custom", + "helperRequired": "en helper_slug som stöds krävs för update_method=helper", + "dockerUpdater": "Docker-delegerade appar uppdateras via sin avbild, inte via en separat appuppdaterare", + "commandRequired": "command_argv krävs (lista som inte är tom)", + "commandList": "command_argv måste vara en lista med strängar som inte är tom", + "commandCount": "command_argv accepterar högst {max} poster", + "commandEntry": "command_argv[{index}] måste vara en sträng som inte är tom", + "commandEntryLength": "command_argv[{index}] överskrider {max} tecken", + "commandEntryControl": "command_argv[{index}] innehåller ett otillåtet kontrolltecken", + "binaryArgsList": "binary_args måste vara en lista med strängar", + "binaryArgsCount": "binary_args accepterar högst {max} poster", + "binaryArgEntry": "binary_args[{index}] måste vara en sträng som inte är tom", + "binaryArgLength": "binary_args[{index}] överskrider {max} tecken", + "binaryArgControl": "binary_args[{index}] innehåller ett otillåtet kontrolltecken", + "portsList": "ports måste vara en lista med {port, description, scheme}", + "portObject": "ports[{index}] måste vara ett objekt", + "portRequired": "ports[{index}].port krävs", + "portInteger": "ports[{index}].port måste vara ett heltal", + "portRange": "ports[{index}].port måste vara 1–65535", + "portDuplicate": "porten {port} förekommer mer än en gång för den här appen", + "portDescription": "ports[{index}].description innehåller ogiltiga tecken", + "portScheme": "ports[{index}].scheme måste vara 'http' eller 'https'", + "portPath": "ports[{index}].web_path måste vara en giltig URL-sökväg (högst 255 tecken)", + "portLogo": "ports[{index}].logo_url måste vara en http(s)-URL (högst 512 tecken)", + "portCategory": "ports[{index}].category innehåller ogiltiga tecken eller är för lång", + "portCustomUrl": "ports[{index}].custom_url måste vara en http(s)-URL (högst 512 tecken)", + "tagRegexLength": "tag_regex överskrider 512 tecken", + "persistPermission": "kunde inte spara sidecar-filen (behörighet?)", + "persist": "kunde inte spara sidecar-filen", + "noApps": "inga appar registrerade för detta vmid", + "appMissing": "app_id '{appId}' hittades inte", + "appNotFound": "appen hittades inte" + } }, "statusFilter": { "ariaLabel": "Filtrera virtuella maskiner och containrar", @@ -2294,6 +2417,42 @@ "updateManyDescription": "Kör om {count} efterinstallationsfunktioner i följd.", "legacySourceTitle": "Äldre optimering – klicka för att se källan", "sourceTitle": "Klicka för att se källkoden", + "sourceDialogTitle": "Källkod: {name}", + "sourceLoading": "Läser in källkod…", + "sourceUnavailable": "Källkoden är inte tillgänglig.", + "sourceLoadFailed": "Det gick inte att läsa in källkoden. Försök igen.", + "sourceFunctionMissing": "Funktionen hittades inte i de tillgängliga skripten.", + "sourceUnknownTool": "Okänt verktyg: {tool}", + "sourceNoMapping": "Ingen funktion är kopplad till verktyget {tool}.", + "sourceToolNames": { + "subscription_banner": "Borttagning av prenumerationsbanner", + "time_sync": "Tidssynkronisering", + "apt_languages": "Hoppa över APT-språk", + "journald": "Optimering av journald", + "logrotate": "Optimering av logrotate", + "system_limits": "Höjda systemgränser", + "memory_settings": "Optimering av minnesinställningar", + "zram_swap": "ZRAM-swapprofil", + "kernel_panic": "Konfiguration av kernel panic", + "apt_ipv4": "Tvinga IPv4 för APT", + "kexec": "kexec för snabba omstarter", + "rpc": "Inaktivera RPC / rpcbind", + "motd": "Anpassad MOTD-banner", + "system_utils": "Systemverktyg", + "network_optimization": "Nätverksoptimeringar", + "bashrc_custom": "Anpassning av bashrc", + "figurine": "Figurine", + "fastfetch": "Fastfetch", + "log2ram": "Log2ram (SSD-skydd)", + "zfs_autotrim": "ZFS Autotrim", + "amd_fixes": "Korrigeringar för AMD CPU (Ryzen/EPYC)", + "persistent_network": "Beständiga namn på nätverksgränssnitt", + "vfio_iommu": "VFIO/IOMMU-passthrough", + "lvm_repair": "Reparation av LVM PV-huvuden", + "repo_cleanup": "Rensning av arkiv", + "proxmox_repos": "Proxmox APT-arkiv", + "entropy": "Entropigenerering (haveged)" + }, "legacy": "arv", "updateToolTitle": "Uppdatera {name} till v{version}", "availableUpdates": "Tillgängliga uppdateringar", @@ -4820,6 +4979,124 @@ "cancel": "Avbryt", "save": "Spara bevarandepolicy", "useDefault": "Använd Proxmox-standard (ingen policy för denna lagring)" + }, + "apiErrors": { + "requestFailed": "Förfrågan misslyckades.", + "absolutePath": "sökvägen måste vara absolut", + "pathConfigured": "den här sökvägen är redan konfigurerad", + "pathRequired": "sökväg krävs", + "pathQuery": "frågeparametern path krävs", + "pathNotFound": "sökvägen hittades inte", + "invalidJobId": "ogiltigt jobb-ID", + "jobNotFound": "jobbet hittades inte", + "runnerMissing": "körskriptet är inte installerat", + "noRestore": "inget återställningstillstånd att avfärda", + "invalidFile": "ogiltigt filnamn", + "notFound": "hittades inte", + "logOutside": "loggsökvägen ligger utanför den tillåtna katalogen", + "targetsList": "targets måste vara en lista", + "emptyExpression": "tomt uttryck", + "invalidId": "ogiltigt ID (använd bokstäver, siffror, _ eller -)", + "backend": "backend måste vara pbs, local eller borg", + "remoteBackend": "backend måste vara pbs eller borg", + "remoteBackendQuoted": "backend måste vara 'pbs' eller 'borg'", + "profileMode": "profile_mode måste vara default eller custom", + "borgAttached": "borg kan inte kopplas (PVE vzdump skriver bara till pbs/local-lagringar)", + "borgAttachedLong": "borg är inte en giltig backend för kopplade jobb (PVE vzdump skriver bara till pbs/local-lagringar)", + "parentRequired": "pve_parent_job_id och pve_storage krävs för attached", + "absolutePaths": "paths måste vara en lista med absoluta sökvägar", + "customPath": "en anpassad profil behöver minst en sökväg", + "defaultPaths": "kunde inte lösa standardprofilens sökvägar", + "retentionObject": "retention måste vara ett objekt", + "pbsRepository": "pbs_repository krävs", + "pbsEncryption": "pbs_encrypt_mode måste vara 'none', 'new' eller 'existing'", + "pbsKeyFailed": "det gick inte att skapa PBS-krypteringsnyckelfilen", + "pbsClientMissing": "det gick inte att skapa PBS-krypteringsnyckelfilen (är proxmox-backup-client installerat?)", + "borgRepository": "borg_repo krävs", + "borgEncryption": "borg_encrypt_mode måste vara en av: none, repokey, keyfile, authenticated", + "encryption": "encrypt_mode måste vara en av: none, repokey, keyfile, authenticated", + "borgPassphrase": "borg_passphrase krävs när kryptering är aktiverad (spara den på destinationen eller skicka med en i förfrågan)", + "passphrase": "lösenfras krävs när kryptering är aktiverad", + "password": "lösenord krävs", + "deviceConfirmation": "confirm_device måste exakt matcha device (skydd mot felskrivning)", + "invalidDevice": "ogiltig enhetssökväg", + "absoluteMountpoint": "en absolut monteringspunkt krävs", + "archiveLayout": "arkivets struktur känns inte igen — ingen rootfs/ hittades", + "archiveMissing": "arkivet hittades inte", + "archiveNotFile": "arkivsökvägen är inte en vanlig fil", + "invalidName": "ogiltigt namn", + "invalidStaging": "ogiltig staging_path", + "jobRename": "jobbets namn kan inte ändras (ta bort och skapa på nytt för att byta namn)", + "absoluteKey": "key_path måste vara absolut", + "mode": "mode måste vara \"local\" eller \"ssh\"", + "nameRequired": "namn krävs (bokstäver, siffror, _ eller -)", + "noLog": "ingen logg finns ännu för det här jobbet", + "noPbsConfig": "ingen fil med manuella PBS-konfigurationer", + "outputMissing": "utdatafilen saknas", + "parserJson": "parserns utdata var inte giltig JSON", + "restoreJson": "utdata från run_restore var inte giltig JSON", + "repoRequired": "repo krävs", + "repoSnapshot": "repo_name och snapshot krävs", + "borgRepoSnapshot": "repo_name och snapshot krävs för borg", + "pbsRepoSnapshot": "repo_name och snapshot krävs för pbs", + "repoName": "repo_name krävs", + "restoreMissing": "återställningsverktygen är inte installerade på den här värden", + "serverDatastore": "server och datalager krävs", + "snapshotRequired": "snapshot krävs", + "source": "source måste vara pbs, borg eller local", + "sshPort": "ssh_port måste vara ett heltal mellan 1 och 65535", + "sshRequired": "ssh_user, ssh_host och ssh_remote_path krävs för ssh-läge", + "repositoryPath": "målet saknar arkivsökväg", + "taskExpired": "uppgiften hittades inte eller har gått ut", + "invalidExpression": "ogiltigt uttryck", + "noReport": "ingen rapport skapades", + "parseManifestFailed": "parse_manifest avslutades med en annan kod än noll", + "jobExists": "jobbet finns redan: {value}", + "pathMissing": "sökvägen finns inte på den här värden: {value}", + "deviceMissing": "enheten finns inte: {value}", + "mountpoint": "inte en monteringspunkt: {value}", + "localArchiveMissing": "lokalt arkiv hittades inte: {value}", + "borgDestination": "Borg-destinationen '{value}' hittades inte", + "pbsDestination": "PBS-destinationen '{value}' hittades inte", + "pbsPassword": "inget lösenord tillgängligt för PBS-arkivet '{value}'", + "borgRepoMissing": "Borg-arkivet \"{value}\" är inte konfigurerat", + "pbsRepoMissing": "PBS-arkivet \"{value}\" är inte konfigurerat", + "borgTargetMissing": "Borg-målet hittades inte: {value}", + "pbsTargetMissing": "PBS-arkivet hittades inte: {value}", + "pveJobMissing": "PVE vzdump-jobbet hittades inte: {value}", + "statePersist": "kan inte spara tillståndet: {value}", + "sshDirectory": "kan inte förbereda ssh-katalogen: {value}", + "logRead": "kan inte läsa loggen: {value}", + "envUpdate": "kunde inte uppdatera .env: {value}", + "pbsConfigWrite": "det gick inte att spara PBS-konfigurationen: {value}", + "persist": "det gick inte att spara: {value}", + "archiveRemove": "det gick inte att ta bort arkivet: {value}", + "start": "det gick inte att starta: {value}", + "borgTargetsUpdate": "det gick inte att uppdatera borg-targets.txt: {value}", + "pbsTargetsUpdate": "det gick inte att uppdatera pbs-manual-configs.txt: {value}", + "unitsUpdate": "det gick inte att uppdatera systemd-enheter: {value}", + "borgTargetsWrite": "det gick inte att skriva borg-targets.txt: {value}", + "jobWrite": "det gick inte att skriva jobbfiler: {value}", + "localTargetWrite": "det gick inte att skriva local-target.conf: {value}", + "unitsWrite": "det gick inte att skriva systemd-enheter: {value}", + "format": "formateringen misslyckades: {value}", + "calendar": "ogiltig on_calendar: {value}", + "mount": "monteringen misslyckades: {value}", + "parserInvocation": "anropet av parsern misslyckades: {value}", + "preflightInvocation": "anropet av preflight misslyckades: {value}", + "publicKeyMissing": "den publika nyckeln hittades inte efter generering: {value}", + "retentionInteger": "retention.{value} måste vara ett heltal", + "retentionNegative": "retention.{value} får inte vara negativt", + "keygen": "ssh-keygen misslyckades: {value}", + "systemctl": "systemctl misslyckades: {value}", + "unmount": "umount misslyckades: {value}", + "taskIncomplete": "uppgiften har tillståndet \"{value}\", inte slutförd", + "unknownKind": "okänd typ: {value}", + "unknownMode": "okänt läge \"{value}\"", + "defaultRemove": "{value} är den inbyggda standarden och kan inte tas bort", + "defaultAdd": "{value} är den inbyggda standarden; den behöver inte läggas till", + "keyImport": "Ingen PBS-nyckelfil är installerad i {value}. Importera nyckelfilen först.", + "storageMismatch": "lagringen för PVE-jobbet stämmer inte (jobbet använder {value}, payload anger {other})" } }, "healthStatus": { @@ -5320,6 +5597,7 @@ "websocketError": "WebSocket-fel uppstod", "connectionClosed": "Anslutning stängd", "completedSuccessfully": "Skriptet har slutförts", + "cancelled": "Åtgärden avbröts.", "completedWithError": "Skriptet avslutat med felkoden {code}", "yes": "Ja", "yourInput": "Din inmatning:", @@ -7311,7 +7589,7 @@ "signInWith": "Logga in med", "methodPassword": "Användare och lösenord", "methodToken": "API-token", - "username": "Användare (användare@realm)", + "username": "Användare", "password": "Lösenord", "passwordHelp": "Lösenordet används en gång för att skapa en skrivskyddad API-token (rollen Audit) för den här Monitorn. Bara den token sparas, aldrig lösenordet. Aktivera först autentiseringen i Monitor.", "cancel": "Avbryt", @@ -7324,10 +7602,10 @@ "editConnection": "Anslutning att redigera", "add": "Lägg till en ny anslutning", "name": "Namn", - "url": "HTTPS-URL (ta med :8007 för PBS ordinarie port)", - "token_id": "API-token-ID (user@realm!token)", - "token_secret": "API-tokenhemlighet (lämna tomt för att behålla den sparade hemligheten)", - "fingerprint": "Certifikatets SHA256-fingeravtryck (valfritt)", + "url": "HTTPS-adress", + "token_id": "API-token-ID", + "token_secret": "API-tokenhemlighet", + "fingerprint": "SHA256-fingeravtryck (valfritt)", "tlsHelp": "Lämna fingeravtrycket tomt för vanlig kontroll av certifikatutfärdare och värdnamn. För ett självsignerat certifikat kopierar du dess SHA256-fingeravtryck från PBS-konsolen eller en annan betrodd kanal. Fingeravtrycket kontrolleras innan inloggningsuppgifter skickas.", "saved": "PBS-anslutningen har verifierats och sparats.", "saveFailed": "Det gick inte att spara PBS-anslutningen.", @@ -7369,7 +7647,85 @@ "estimatedFull": "Beräknad full", "estimatedFullUnknown": "Inte tillräckligt med data ännu", "duration": "Varaktighet", - "noJobs": "Inga synkroniserings-, verifierings- eller beskärningsscheman är konfigurerade." + "noJobs": "Inga synkroniserings-, verifierings- eller beskärningsscheman är konfigurerade.", + "errors": { + "configRead": "Det gick inte att läsa de sparade PBS-anslutningarna. Kontrollera konfigurationsfilen och behörigheterna.", + "invalidConfig": "Inställningarna för PBS-anslutningen är inte giltiga. Kontrollera formuläret och försök igen.", + "invalidField": "Ett anslutningsfält är ogiltigt eller för långt.", + "invalidUrl": "Använd en HTTPS-adress till PBS utan inbäddade inloggningsuppgifter, frågeparametrar eller fragment.", + "nameRequired": "Ange ett servernamn på högst 128 tecken.", + "tokenIdFormat": "Ange ID för PBS API-token i formatet user@realm!token.", + "tokenSecret": "Ange en giltig API-tokenhemlighet utan mellanslag eller kontrolltecken.", + "invalidTokenId": "API-token-ID får bara innehålla ASCII-tecken.", + "invalidFingerprint": "Ange certifikatets SHA256-fingeravtryck: 64 hexadecimala tecken, eventuellt avgränsade med kolon.", + "fingerprintMismatch": "PBS-certifikatet matchar inte fingeravtrycket. Inga inloggningsuppgifter skickades.", + "tokenRejected": "PBS avvisade API-token eller dess behörigheter. Kontrollera ACL:erna för både användaren och token.", + "invalidResponse": "PBS returnerade ett oväntat svar. Omdirigeringar följs inte.", + "invalidJson": "PBS returnerade ett ogiltigt JSON-dokument.", + "connectFailed": "Det gick inte att ansluta till PBS via verifierad HTTPS. Kontrollera adressen, certifikatet och tjänsten.", + "invalidId": "ID:t för PBS-anslutningen är inte giltigt. Läs in anslutningslistan igen.", + "invalidDatastores": "PBS returnerade en ogiltig lista över datalager.", + "connectionLimit": "Högst {count} PBS-anslutningar kan konfigureras.", + "username": "Ange PBS-användaren i formatet user@realm, till exempel root@pam.", + "password": "Ange PBS-användarens lösenord.", + "loginRejected": "PBS avvisade användarnamnet eller lösenordet.", + "invalidLogin": "PBS returnerade ett ogiltigt inloggningssvar.", + "tokenCreateDenied": "Den här PBS-användaren kan inte skapa API-tokens.", + "invalidToken": "PBS returnerade en ogiltig API-token.", + "auditRoleDenied": "Den här PBS-användaren kan inte tilldela rollen Audit. Logga in som root@pam eller en annan administratör.", + "notFound": "PBS-anslutningen hittades inte. Läs in anslutningslistan igen.", + "readFailed": "Det gick inte att läsa PBS-data. Kontrollera tjänsten och behörigheterna.", + "invalidList": "PBS returnerade en ogiltig datalista.", + "localUnavailable": "PBS är inte tillgänglig på den här värden.", + "authRequired": "Aktivera lokal autentisering i Monitor innan du hanterar fjärranslutningar till PBS.", + "datastoreOffline": "Datalagret är offline, i underhållsläge eller så är dess underliggande enhet inte monterad.", + "datastoreUnavailable": "Datalagrets filsystem är inte tillgängligt." + }, + "taskTypes": { + "backup": "Säkerhetskopiering", + "restore": "Återställning", + "verify": "Verifiering", + "verifyGroup": "Verifiering av säkerhetskopiegrupp", + "verifySnapshot": "Verifiering av ögonblicksbild", + "prune": "Gallring", + "garbageCollection": "Skräpinsamling", + "sync": "Synkronisering", + "updateCheck": "Sök efter uppdateringar", + "terminal": "Terminal", + "createDatastore": "Skapa datalager", + "other": "Annan uppgift ({type})" + }, + "states": { + "ok": "OK", + "unknown": "Okänd", + "warnings": "Varningar: {count}", + "warning": "Varning", + "error": "Fel" + }, + "serviceStates": { + "active": "Aktiv", + "inactive": "Inaktiv", + "failed": "Misslyckad", + "activating": "Startar", + "deactivating": "Stoppar", + "unknown": "Okänd" + }, + "durationUnits": { + "seconds": "{count} s", + "minutes": "{count} min", + "hours": "{count} h", + "days": "{count} d" + }, + "urlHelp": "Ta med :8007 för PBS standardport, till exempel https://pbs.example:8007.", + "usernameHelp": "Använd user@realm, till exempel root@pam.", + "tokenIdHelp": "Använd user@realm!token, till exempel monitor@pbs!proxmenux.", + "tokenSecretHelp": "Ange hemligheten för den här API-token.", + "tokenSecretKeepHelp": "Lämna tomt för att behålla den sparade tokenhemligheten.", + "removeFailed": "Det gick inte att ta bort PBS-anslutningen.", + "savedRefreshFailed": "PBS-anslutningen sparades, men anslutningslistan kunde inte uppdateras. Läs in sidan igen innan du gör en annan ändring.", + "removedRefreshFailed": "PBS-anslutningen togs bort, men anslutningslistan kunde inte uppdateras. Läs in sidan igen.", + "technicalDetails": "Tekniska detaljer", + "datastoreType": "Datalager" }, "monitorLinks": { "groups": { @@ -7408,6 +7764,17 @@ "addSelected": "Lägg till valda", "pbsWebInterface": "PBS webbgränssnitt", "changeAddress": "Ändra adress", - "cancel": "Avbryt" + "cancel": "Avbryt", + "errors": { + "addressRequired": "Ange adressen till Monitor.", + "invalidAddress": "Adressen måste börja med http:// eller https:// och ange en värd.", + "addressCredentials": "Adressen får inte innehålla användare eller lösenord.", + "invalidPort": "Adressens port är inte giltig.", + "invalidRequest": "Förfrågan är inte giltig. Läs in sidan igen och försök igen.", + "limit": "Högst {count} noder kan läggas till.", + "duplicate": "Den här adressen finns redan i listan.", + "notFound": "Noden hittades inte. Läs in listan igen och försök igen.", + "detectedRemove": "Endast noder som lagts till manuellt kan tas bort. Identifierade noder kan döljas." + } } } diff --git a/AppImage/scripts/flask_monitor_links_routes.py b/AppImage/scripts/flask_monitor_links_routes.py index 24c7d3ee..bf150aae 100644 --- a/AppImage/scripts/flask_monitor_links_routes.py +++ b/AppImage/scripts/flask_monitor_links_routes.py @@ -7,6 +7,13 @@ from jwt_middleware import require_auth, require_admin_scope monitor_links_bp = Blueprint("monitor_links", __name__) +def link_error(exc): + payload = {"error": str(exc), "code": exc.code} + if exc.params: + payload["params"] = exc.params + return jsonify(payload), 400 + + @monitor_links_bp.after_request def no_cache(response): response.headers["Cache-Control"] = "no-store" @@ -27,9 +34,9 @@ def add_link(): monitor_links.refresh() return jsonify(success=True, key=key) except monitor_links.LinkError as exc: - return jsonify(error=str(exc)), 400 + return link_error(exc) except OSError: - return jsonify(error="Could not save the node list."), 500 + return jsonify(error="Could not save the node list.", code="monitor_links_save_failed"), 500 @monitor_links_bp.route("/api/monitor-links/", methods=["PATCH"]) @@ -40,9 +47,9 @@ def update_link(key): monitor_links.refresh() return jsonify(success=True) except monitor_links.LinkError as exc: - return jsonify(error=str(exc)), 400 + return link_error(exc) except OSError: - return jsonify(error="Could not save the node list."), 500 + return jsonify(error="Could not save the node list.", code="monitor_links_save_failed"), 500 @monitor_links_bp.route("/api/monitor-links/", methods=["DELETE"]) @@ -53,6 +60,6 @@ def delete_link(key): monitor_links.refresh() return jsonify(success=True) except monitor_links.LinkError as exc: - return jsonify(error=str(exc)), 400 + return link_error(exc) except OSError: - return jsonify(error="Could not save the node list."), 500 + return jsonify(error="Could not save the node list.", code="monitor_links_save_failed"), 500 diff --git a/AppImage/scripts/flask_pbs_routes.py b/AppImage/scripts/flask_pbs_routes.py index 2c18f8b8..1ecb148c 100644 --- a/AppImage/scripts/flask_pbs_routes.py +++ b/AppImage/scripts/flask_pbs_routes.py @@ -8,6 +8,10 @@ from jwt_middleware import require_auth, require_admin_scope pbs_bp = Blueprint("pbs", __name__) +def pbs_error(exc, status): + return jsonify(error=str(exc), **exc.problem()), status + + @pbs_bp.after_request def no_cache(response): response.headers["Cache-Control"] = "no-store" @@ -27,7 +31,7 @@ def servers(): servers = pbs.public_servers() return jsonify(servers=servers, local_available=pbs.local_available(), detected=_detected(servers)) except pbs.PBSError as exc: - return jsonify(error=str(exc)), 500 + return pbs_error(exc, 500) def _detected(servers): @@ -57,42 +61,42 @@ def _protected_configuration(): @require_admin_scope def save_server(): if not _protected_configuration(): - return jsonify(error="Enable local authentication before saving remote PBS credentials."), 409 + return jsonify(error="Enable local authentication before saving remote PBS credentials.", code="pbs_auth_required"), 409 try: identifier = pbs.save_server(request.get_json(silent=True)) return jsonify(success=True, id=identifier, servers=pbs.public_servers()) except pbs.PBSError as exc: - return jsonify(error=str(exc)), 400 + return pbs_error(exc, 400) except OSError: - return jsonify(error="Could not save PBS connection."), 500 + return jsonify(error="Could not save PBS connection.", code="pbs_save_failed"), 500 @pbs_bp.route("/api/pbs/servers/login", methods=["POST"]) @require_admin_scope def connect_with_password(): if not _protected_configuration(): - return jsonify(error="Enable local authentication before saving remote PBS credentials."), 409 + return jsonify(error="Enable local authentication before saving remote PBS credentials.", code="pbs_auth_required"), 409 try: identifier = pbs.connect_with_password(request.get_json(silent=True)) return jsonify(success=True, id=identifier, servers=pbs.public_servers()) except pbs.PBSError as exc: - return jsonify(error=str(exc)), 400 + return pbs_error(exc, 400) except OSError: - return jsonify(error="Could not save PBS connection."), 500 + return jsonify(error="Could not save PBS connection.", code="pbs_save_failed"), 500 @pbs_bp.route("/api/pbs/servers/", methods=["DELETE"]) @require_admin_scope def delete_server(identifier): if not _protected_configuration(): - return jsonify(error="Enable local authentication before changing PBS connections."), 409 + return jsonify(error="Enable local authentication before changing PBS connections.", code="pbs_auth_required"), 409 try: pbs.delete_server(identifier) return jsonify(success=True) except pbs.PBSError as exc: - return jsonify(error=str(exc)), 400 + return pbs_error(exc, 400) except OSError: - return jsonify(error="Could not remove PBS connection."), 500 + return jsonify(error="Could not remove PBS connection.", code="pbs_remove_failed"), 500 @pbs_bp.route("/api/pbs/status") @@ -101,4 +105,4 @@ def status(): try: return jsonify(pbs.get_status(request.args.get("server", "local"))) except pbs.PBSError as exc: - return jsonify(error=str(exc)), 502 + return pbs_error(exc, 502) diff --git a/AppImage/scripts/monitor_links.py b/AppImage/scripts/monitor_links.py index 169ca0f0..6bf46ebc 100644 --- a/AppImage/scripts/monitor_links.py +++ b/AppImage/scripts/monitor_links.py @@ -39,7 +39,10 @@ _refresh_lock = threading.Lock() class LinkError(ValueError): - pass + def __init__(self, message, *, code="monitor_links_save_failed", params=None): + super().__init__(message) + self.code = code + self.params = params def _load(): @@ -63,19 +66,19 @@ def _save(data): def normalize_url(value): """Return the origin of an http(s) address, or raise LinkError.""" if not isinstance(value, str) or not value.strip(): - raise LinkError("Enter the address of the Monitor.") + raise LinkError("Enter the address of the Monitor.", code="monitor_link_address_required") text = value.strip() if "://" not in text: text = "https://" + text parsed = urllib.parse.urlsplit(text) if parsed.scheme not in ("http", "https") or not parsed.hostname: - raise LinkError("The address must start with http:// or https:// and name a host.") + raise LinkError("The address must start with http:// or https:// and name a host.", code="monitor_link_invalid_address") if parsed.username or parsed.password: - raise LinkError("The address must not contain a user or password.") + raise LinkError("The address must not contain a user or password.", code="monitor_link_address_credentials") try: port = parsed.port except ValueError as exc: - raise LinkError("The port of the address is not valid.") from exc + raise LinkError("The port of the address is not valid.", code="monitor_link_invalid_port") from exc host = parsed.hostname if ":" in host: host = f"[{host}]" @@ -301,16 +304,16 @@ def start_prewarmer(): def add_link(payload): if not isinstance(payload, dict): - raise LinkError("Invalid request.") + raise LinkError("Invalid request.", code="monitor_link_invalid_request") name = str(payload.get("name") or "").strip()[:64] url = normalize_url(payload.get("url")) product = payload.get("product") if payload.get("product") in PRODUCTS else "pve" with _lock: data = _load() if len(data["manual"]) >= MAX_MANUAL: - raise LinkError(f"At most {MAX_MANUAL} nodes can be added.") + raise LinkError(f"At most {MAX_MANUAL} nodes can be added.", code="monitor_link_limit", params={"count": MAX_MANUAL}) if any(row.get("url") == url for row in data["manual"]): - raise LinkError("This address is already in the list.") + raise LinkError("This address is already in the list.", code="monitor_link_duplicate") identifier = secrets.token_hex(6) data["manual"].append({"id": identifier, "name": name or urllib.parse.urlsplit(url).hostname, "url": url, "product": product}) @@ -320,13 +323,13 @@ def add_link(payload): def update_link(key, payload): if not isinstance(payload, dict): - raise LinkError("Invalid request.") + raise LinkError("Invalid request.", code="monitor_link_invalid_request") with _lock: data = _load() if key.startswith("manual:"): row = next((r for r in data["manual"] if f"manual:{r.get('id')}" == key), None) if row is None: - raise LinkError("Node not found.") + raise LinkError("Node not found.", code="monitor_link_not_found") if "name" in payload: row["name"] = str(payload["name"] or "").strip()[:64] or row["name"] if payload.get("url"): @@ -345,7 +348,7 @@ def update_link(key, payload): if not override: data["overrides"].pop(key, None) else: - raise LinkError("Node not found.") + raise LinkError("Node not found.", code="monitor_link_not_found") _save(data) @@ -354,6 +357,6 @@ def delete_link(key): data = _load() remaining = [r for r in data["manual"] if f"manual:{r.get('id')}" != key] if len(remaining) == len(data["manual"]): - raise LinkError("Only nodes added by hand can be removed; detected ones can be hidden.") + raise LinkError("Only nodes added by hand can be removed; detected ones can be hidden.", code="monitor_link_detected_remove") data["manual"] = remaining _save(data) diff --git a/AppImage/scripts/pbs_manager.py b/AppImage/scripts/pbs_manager.py index 7ec910d1..d4a12ad4 100644 --- a/AppImage/scripts/pbs_manager.py +++ b/AppImage/scripts/pbs_manager.py @@ -39,7 +39,13 @@ MAX_RESPONSE = 4 * 1024 * 1024 class PBSError(ValueError): - pass + def __init__(self, message, *, code="pbs_unknown", params=None): + super().__init__(message) + self.code = code + self.params = params + + def problem(self): + return {"code": self.code, **({"params": self.params} if self.params else {})} def get_platform(): @@ -87,7 +93,7 @@ def _load_servers(): except FileNotFoundError: return [] except (OSError, ValueError) as exc: - raise PBSError("Could not read the PBS server configuration.") from exc + raise PBSError("Could not read the PBS server configuration.", code="pbs_config_read") from exc def _save_servers(servers): @@ -113,11 +119,11 @@ def public_servers(): def _validate_server(data, previous=None, fields=("name", "url", "token_id", "token_secret", "fingerprint")): if not isinstance(data, dict): - raise PBSError("Invalid PBS server configuration.") + raise PBSError("Invalid PBS server configuration.", code="pbs_invalid_config") previous = previous or {} row = {field: data.get(field, previous.get(field, "")) for field in fields} if any(not isinstance(value, str) or len(value) > 4096 for value in row.values()): - raise PBSError("Invalid PBS connection field.") + raise PBSError("Invalid PBS connection field.", code="pbs_invalid_field") row["name"] = row["name"].strip() row["url"] = row["url"].strip().rstrip("/") try: @@ -127,26 +133,26 @@ def _validate_server(data, previous=None, fields=("name", "url", "token_id", "to or parts.query or parts.fragment): raise ValueError() except ValueError as exc: - raise PBSError("Use an HTTPS PBS URL without embedded credentials, query or fragment.") from exc + raise PBSError("Use an HTTPS PBS URL without embedded credentials, query or fragment.", code="pbs_invalid_url") from exc if not row["name"] or len(row["name"]) > 128: - raise PBSError("A server name of at most 128 characters is required.") + raise PBSError("A server name of at most 128 characters is required.", code="pbs_name_required") if "token_id" not in row: return _validated_fingerprint(row) row["token_id"] = row["token_id"].strip() if not re.fullmatch(r"[^\s:!]+@[^\s:!]+![^\s:!]+", row["token_id"]): - raise PBSError("Enter a PBS API token ID in user@realm!token format.") + raise PBSError("Enter a PBS API token ID in user@realm!token format.", code="pbs_token_id_format") if (not row["token_secret"] or not row["token_secret"].isascii() or any(char.isspace() or ord(char) < 32 for char in row["token_secret"])): - raise PBSError("A valid API token secret is required.") + raise PBSError("A valid API token secret is required.", code="pbs_token_secret") if not row["token_id"].isascii(): - raise PBSError("Invalid API token ID.") + raise PBSError("Invalid API token ID.", code="pbs_invalid_token_id") return _validated_fingerprint(row) def _validated_fingerprint(row): fingerprint = row["fingerprint"].strip().lower().replace(":", "") if fingerprint and not re.fullmatch("[a-f0-9]{64}", fingerprint): - raise PBSError("The certificate fingerprint must be SHA256 (64 hex characters).") + raise PBSError("The certificate fingerprint must be SHA256 (64 hex characters).", code="pbs_invalid_fingerprint") row["fingerprint"] = fingerprint return row @@ -158,7 +164,8 @@ def _remote_get(server, endpoint): def _remote_request(server, method, endpoint, headers, form=None, - rejected="PBS rejected the API token or its permissions. Check both the user and token ACLs."): + rejected="PBS rejected the API token or its permissions. Check both the user and token ACLs.", + *, rejected_code="pbs_token_rejected"): """One request to PBS; credentials leave only after the certificate is checked.""" parts = urlsplit(server["url"]) fingerprint = server.get("fingerprint") @@ -175,7 +182,7 @@ def _remote_request(server, method, endpoint, headers, form=None, if fingerprint: actual = hashlib.sha256(connection.sock.getpeercert(binary_form=True)).hexdigest() if not hmac.compare_digest(actual, fingerprint): - raise PBSError("PBS certificate fingerprint does not match. No credentials were sent.") + raise PBSError("PBS certificate fingerprint does not match. No credentials were sent.", code="pbs_fingerprint_mismatch") path = parts.path.rstrip("/") + "/api2/json" + endpoint body = urlencode(form) if form is not None else None request_headers = {"Accept": "application/json", **headers} @@ -185,17 +192,17 @@ def _remote_request(server, method, endpoint, headers, form=None, response = connection.getresponse() content = response.read(MAX_RESPONSE + 1) if response.status in (401, 403): - raise PBSError(rejected) + raise PBSError(rejected, code=rejected_code) if response.status != 200 or len(content) > MAX_RESPONSE: - raise PBSError("PBS returned an invalid response. Redirects are not followed.") + raise PBSError("PBS returned an invalid response. Redirects are not followed.", code="pbs_invalid_response") document = json.loads(content) if not isinstance(document, dict) or "data" not in document: - raise PBSError("PBS returned an invalid JSON document.") + raise PBSError("PBS returned an invalid JSON document.", code="pbs_invalid_json") return document["data"] except PBSError: raise except (OSError, http.client.HTTPException, ValueError) as exc: - raise PBSError("Could not connect to PBS over verified HTTPS. Check the address, certificate and service.") from exc + raise PBSError("Could not connect to PBS over verified HTTPS. Check the address, certificate and service.", code="pbs_connect_failed") from exc finally: connection.close() @@ -203,19 +210,19 @@ def _remote_request(server, method, endpoint, headers, form=None, def save_server(data): identifier = data.get("id") if isinstance(data, dict) else None if identifier is not None and not re.fullmatch(r"[A-Za-z0-9_-]{1,64}", str(identifier)): - raise PBSError("Invalid PBS server ID.") + raise PBSError("Invalid PBS server ID.", code="pbs_invalid_id") with _lock: previous = next((row for row in _load_servers() if row["id"] == identifier), None) row = _validate_server(data, previous) # /version may be public; validate credentials on the protected status API. usage = _remote_get(row, "/status/datastore-usage") if not isinstance(usage, list): - raise PBSError("PBS returned an invalid datastore list.") + raise PBSError("PBS returned an invalid datastore list.", code="pbs_invalid_datastores") row.update(id=identifier or "pbs-" + secrets.token_hex(6), revision=secrets.token_hex(16)) with _lock: servers = _load_servers() if previous is None and len(servers) >= 32: - raise PBSError("At most 32 PBS connections may be configured.") + raise PBSError("At most 32 PBS connections may be configured.", code="pbs_connection_limit", params={"count": 32}) servers = [existing for existing in servers if existing["id"] != row["id"]] _save_servers([*servers, row]) return row["id"] @@ -228,27 +235,27 @@ def connect_with_password(data): username = data.get("username") if isinstance(data, dict) else None password = data.get("password") if isinstance(data, dict) else None if not isinstance(username, str) or not re.fullmatch(r"[^\s:!@]+@[^\s:!@]+", username.strip()): - raise PBSError("Enter the PBS user as user@realm, for example root@pam.") + raise PBSError("Enter the PBS user as user@realm, for example root@pam.", code="pbs_username") if not isinstance(password, str) or not password or len(password) > 4096: - raise PBSError("Enter the password of the PBS user.") + raise PBSError("Enter the password of the PBS user.", code="pbs_password") ticket = _remote_request(endpoint, "POST", "/access/ticket", {}, {"username": username.strip(), "password": password}, - rejected="PBS rejected the user name or password.") + rejected="PBS rejected the user name or password.", rejected_code="pbs_login_rejected") if not isinstance(ticket, dict) or not ticket.get("ticket") or not ticket.get("CSRFPreventionToken"): - raise PBSError("PBS returned an invalid sign-in response.") + raise PBSError("PBS returned an invalid sign-in response.", code="pbs_invalid_login") session = {"Cookie": "PBSAuthCookie=" + quote(ticket["ticket"], safe=""), "CSRFPreventionToken": ticket["CSRFPreventionToken"]} user = str(ticket.get("username") or username.strip()) name = "proxmenux-" + secrets.token_hex(4) token_path = f"/access/users/{quote(user, safe='')}/token/{name}" created = _remote_request(endpoint, "POST", token_path, session, {"comment": "ProxMenux Monitor, read-only"}, - rejected="This PBS user cannot create API tokens.") + rejected="This PBS user cannot create API tokens.", rejected_code="pbs_token_create_denied") if not isinstance(created, dict) or not created.get("tokenid") or not created.get("value"): - raise PBSError("PBS returned an invalid API token.") + raise PBSError("PBS returned an invalid API token.", code="pbs_invalid_token") try: _remote_request(endpoint, "PUT", "/access/acl", session, {"path": "/", "role": "Audit", "auth-id": created["tokenid"], "propagate": "1"}, - rejected="This PBS user cannot grant the Audit role. Sign in with root@pam or an administrator.") + rejected="This PBS user cannot grant the Audit role. Sign in with root@pam or an administrator.", rejected_code="pbs_audit_role_denied") return save_server({**endpoint, "token_id": created["tokenid"], "token_secret": created["value"]}) except PBSError: try: @@ -263,7 +270,7 @@ def delete_server(identifier): servers = _load_servers() remaining = [row for row in servers if row["id"] != identifier] if len(remaining) == len(servers): - raise PBSError("PBS server not found.") + raise PBSError("PBS server not found.", code="pbs_not_found") _save_servers(remaining) @@ -276,7 +283,7 @@ def _cli(*arguments): raise ValueError() return data except (OSError, subprocess.SubprocessError, ValueError) as exc: - raise PBSError("Could not read PBS " + " ".join(arguments[:2]) + ". Check its service and permissions.") from exc + raise PBSError("Could not read PBS " + " ".join(arguments[:2]) + ". Check its service and permissions.", code="pbs_read_failed") from exc def _local_api(path): @@ -290,7 +297,7 @@ def _local_api(path): raise ValueError() return data except (OSError, subprocess.SubprocessError, ValueError) as exc: - raise PBSError("Could not read PBS " + path + ". Check its service and permissions.") from exc + raise PBSError("Could not read PBS " + path + ". Check its service and permissions.", code="pbs_read_failed") from exc def _local_datastores(): @@ -305,12 +312,14 @@ def _local_datastores(): inactive = store.get("backing-device") and not (path and os.path.ismount(path)) if not path or inactive or store.get("maintenance-mode"): row["error"] = "Datastore is offline, in maintenance or has no mounted backing device." + row["error_code"] = "pbs_datastore_offline" else: try: capacity = shutil.disk_usage(path) row.update(total=capacity.total, used=capacity.used, avail=capacity.free) except OSError: row["error"] = "Datastore filesystem is not available." + row["error_code"] = "pbs_datastore_unavailable" result.append(row) return result @@ -331,10 +340,10 @@ def get_status(identifier): cached = _status_cache.get(identifier) if cached and cached[0] > time.monotonic(): return cached[1] - errors = {} + errors, error_details = {}, {} if identifier == "local": if not local_available(): - raise PBSError("The local host is not a PBS server.") + raise PBSError("The local host is not a PBS server.", code="pbs_local_unavailable") name, version = get_platform().get("hostname") or socket.gethostname(), _local_version() services = _local_services() operations = {"datastores": _local_datastores, @@ -346,7 +355,7 @@ def get_status(identifier): with _lock: server = next((row for row in _load_servers() if row["id"] == identifier), None) if not server: - raise PBSError("PBS server not found.") + raise PBSError("PBS server not found.", code="pbs_not_found") metadata = _remote_get(server, "/version") name, version = server["name"], metadata.get("version") if isinstance(metadata, dict) else None services = {} @@ -354,18 +363,19 @@ def get_status(identifier): "sync": "/admin/sync", "verify": "/admin/verify", "prune": "/admin/prune"} operations = {key: (lambda endpoint=path: _remote_get(server, endpoint)) for key, path in endpoints.items()} result = {"server": identifier, "name": name, "version": version, "services": services, - "fetched_at": int(time.time()), "errors": errors} + "fetched_at": int(time.time()), "errors": errors, "error_details": error_details} with ThreadPoolExecutor(max_workers=5) as executor: futures = {key: executor.submit(operation) for key, operation in operations.items()} for key, future in futures.items(): try: data = future.result() if not isinstance(data, list) or not all(isinstance(row, dict) for row in data): - raise PBSError("PBS returned an invalid list.") + raise PBSError("PBS returned an invalid list.", code="pbs_invalid_list") result[key] = [{**row, "name": row.get("store", row.get("name"))} for row in data] if key == "datastores" else data except PBSError as exc: result[key] = None # Unknown/forbidden is never presented as zero. errors[key] = str(exc) + error_details[key] = exc.problem() with _lock: if len(_status_cache) >= 33: _status_cache.clear() diff --git a/AppImage/scripts/tests/test_monitor_links_i18n.py b/AppImage/scripts/tests/test_monitor_links_i18n.py new file mode 100644 index 00000000..197096c2 --- /dev/null +++ b/AppImage/scripts/tests/test_monitor_links_i18n.py @@ -0,0 +1,138 @@ +"""Exercise the shipped routes and persistence; localization is additive.""" +import importlib.util +import json +from pathlib import Path +import sys +import tempfile +import types +import unittest +from unittest import mock + +from flask import Flask + +ROOT = Path(__file__).resolve().parents[3] +sys.path.insert(0, str(ROOT / "AppImage/scripts")) +import monitor_links as links + + +class MonitorLinksI18nTests(unittest.TestCase): + def setUp(self): + temporary = tempfile.TemporaryDirectory() + self.addCleanup(temporary.cleanup) + self.path = Path(temporary.name) / "links.json" + self.previous = {"manual": [{"id": "saved", "name": "Saved", "url": "https://saved.test", "product": "pve"}], "overrides": {}} + self.path.write_text(json.dumps(self.previous)) + for patch in [mock.patch.object(links, "LINKS_FILE", self.path), + mock.patch.object(links, "refresh"), mock.patch.object(links, "_probe")]: + patch.start() + self.addCleanup(patch.stop) + auth_provider = types.SimpleNamespace( + load_auth_config=lambda: {"enabled": True}, + verify_token=lambda token: "fixture" if token in ("admin", "reader") else None, + verify_token_full=lambda token: ("fixture", "full_admin" if token == "admin" else "read_only") + if token in ("admin", "reader") else (None, None)) + middleware_spec = importlib.util.spec_from_file_location("fixture_jwt_middleware", ROOT / "AppImage/scripts/jwt_middleware.py") + middleware = importlib.util.module_from_spec(middleware_spec) + # Execute the shipped decorators; only credential verification is faked. + with mock.patch.dict(sys.modules, {"auth_manager": auth_provider}): + middleware_spec.loader.exec_module(middleware) + spec = importlib.util.spec_from_file_location("fixture_monitor_links_routes", ROOT / "AppImage/scripts/flask_monitor_links_routes.py") + routes = importlib.util.module_from_spec(spec) + # Import isolation keeps the real JWT module and other suites untouched. + with mock.patch.dict(sys.modules, {"jwt_middleware": middleware}): + spec.loader.exec_module(routes) + app = Flask(__name__) + app.register_blueprint(routes.monitor_links_bp) + self.client = app.test_client() + + def send(self, method, path="", payload=None, role="admin"): + return self.client.open("/api/monitor-links" + path, method=method, + json=payload, headers={"Authorization": "Bearer " + role} if role else {}) + + def rejected(self, method, path, payload, message, code, params=None): + before = self.path.read_bytes() + with mock.patch.object(links, "_save") as save: + response = self.send(method, path, payload) + self.assertEqual(response.status_code, 400) + expected = {"error": message, "code": code} + if params: + expected["params"] = params + self.assertEqual(response.json, expected) + self.assertEqual(response.headers["Cache-Control"], "no-store") + save.assert_not_called() + links.refresh.assert_not_called() + links._probe.assert_not_called() + self.assertEqual(self.path.read_bytes(), before) + + def test_validation_errors_preserve_english_status_and_have_stable_codes_without_effects(self): + cases = [ + ("POST", "", None, "Invalid request.", "monitor_link_invalid_request"), + ("PATCH", "/manual:saved", [], "Invalid request.", "monitor_link_invalid_request"), + ("POST", "", {"url": " "}, "Enter the address of the Monitor.", "monitor_link_address_required"), + ("POST", "", {"url": "ftp://example.test"}, "The address must start with http:// or https:// and name a host.", "monitor_link_invalid_address"), + ("POST", "", {"url": "https://user:pass@example.test"}, "The address must not contain a user or password.", "monitor_link_address_credentials"), + ("PATCH", "/manual:saved", {"name": "Unsaved", "url": "https://example.test:99999"}, "The port of the address is not valid.", "monitor_link_invalid_port"), + ("PATCH", "/cluster:node", {"url": "ftp://example.test"}, "The address must start with http:// or https:// and name a host.", "monitor_link_invalid_address"), + ("POST", "", {"url": "https://saved.test/path"}, "This address is already in the list.", "monitor_link_duplicate"), + ("PATCH", "/manual:absent", {"url": "https://new.test"}, "Node not found.", "monitor_link_not_found"), + ("PATCH", "/other:node", {}, "Node not found.", "monitor_link_not_found"), + ("DELETE", "/cluster:node", None, "Only nodes added by hand can be removed; detected ones can be hidden.", "monitor_link_detected_remove"), + ] + for case in cases: + with self.subTest(case=case): + self.rejected(*case) + + def test_limit_uses_actual_count_and_preserves_previous_file(self): + with mock.patch.object(links, "MAX_MANUAL", 1): + self.rejected("POST", "", {"url": "https://new.test"}, "At most 1 nodes can be added.", + "monitor_link_limit", {"count": 1}) + + def test_write_failure_is_localizable_without_leaking_filesystem_details(self): + for method, path, payload in [("POST", "", {"url": "https://new.test"}), + ("PATCH", "/manual:saved", {"name": "Unsaved"}), + ("DELETE", "/manual:saved", None)]: + with self.subTest(method=method), mock.patch.object(links.os, "replace", side_effect=OSError("private path details")): + before = self.path.read_bytes() + response = self.send(method, path, payload) + self.assertEqual(response.status_code, 500) + self.assertEqual(response.json, {"error": "Could not save the node list.", "code": "monitor_links_save_failed"}) + self.assertEqual(self.path.read_bytes(), before) + links.refresh.assert_not_called() + links._probe.assert_not_called() + + def test_successful_crud_and_detected_hide_reset_keep_existing_contract(self): + response = self.send("POST", payload={"name": "New", "url": "new.test:8008/path", "product": "pbs"}) + self.assertEqual(response.status_code, 200) + self.assertEqual(set(response.json), {"success", "key"}) + key = response.json["key"] + self.assertTrue(key.startswith("manual:")) + row = links._load()["manual"][-1] + self.assertEqual((row["url"], row["product"]), ("https://new.test:8008", "pbs")) + self.assertEqual(self.send("PATCH", "/" + key, {"url": "http://changed.test"}).json, {"success": True}) + self.assertEqual(links._load()["manual"][-1]["url"], "http://changed.test") + self.assertEqual(self.send("PATCH", "/cluster:node", {"url": "https://override.test", "hidden": True}).json, {"success": True}) + self.assertEqual(self.send("PATCH", "/cluster:node", {"url": "", "hidden": False}).json, {"success": True}) + self.assertEqual(links._load()["overrides"], {"cluster:node": {"hidden": False}}) + self.assertEqual(self.send("DELETE", "/" + key).json, {"success": True}) + self.assertEqual(links._load()["manual"], self.previous["manual"]) + self.assertEqual(self.path.stat().st_mode & 0o777, 0o600) + self.assertEqual(links.refresh.call_count, 5) + links._probe.assert_not_called() + + def test_existing_read_and_admin_decorators_still_guard_routes_before_effects(self): + with mock.patch.object(links, "cached_links", return_value={"self": {}, "links": []}) as cached, \ + mock.patch.object(links, "_save") as save: + for method, path in [("POST", ""), ("PATCH", "/manual:saved"), ("DELETE", "/manual:saved")]: + for role, status in [(None, 401), ("reader", 403)]: + self.assertEqual(self.send(method, path, {"url": "https://new.test"}, role).status_code, status) + self.assertEqual(self.send("GET", role=None).status_code, 401) + self.assertEqual(self.send("GET", "?all=1", role="reader").status_code, 200) + cached.assert_called_once_with(include_hidden=True) + save.assert_not_called() + links.refresh.assert_not_called() + links._probe.assert_not_called() + self.assertEqual(json.loads(self.path.read_text()), self.previous) + + +if __name__ == "__main__": + unittest.main() diff --git a/AppImage/scripts/tests/test_pbs.py b/AppImage/scripts/tests/test_pbs.py index cf932a8e..e86c38ac 100644 --- a/AppImage/scripts/tests/test_pbs.py +++ b/AppImage/scripts/tests/test_pbs.py @@ -205,7 +205,7 @@ class PBSManagerTests(unittest.TestCase): def test_password_sign_in_keeps_only_a_read_only_token(self): calls = [] - def request(server, method, endpoint, headers, form=None, rejected=""): + def request(server, method, endpoint, headers, form=None, rejected="", **kwargs): calls.append((method, endpoint, form)) if endpoint == "/access/ticket": return {"ticket": "PBS:root@pam:ticket", "CSRFPreventionToken": "csrf", "username": "root@pam"} @@ -227,7 +227,7 @@ class PBSManagerTests(unittest.TestCase): def test_password_sign_in_removes_its_token_when_the_role_cannot_be_granted(self): calls = [] - def request(server, method, endpoint, headers, form=None, rejected=""): + def request(server, method, endpoint, headers, form=None, rejected="", **kwargs): calls.append((method, endpoint)) if endpoint == "/access/ticket": return {"ticket": "t", "CSRFPreventionToken": "c"} @@ -351,15 +351,17 @@ class TLSTests(unittest.TestCase): def test_bad_pin_and_untrusted_ca_send_no_http_credentials(self): for fingerprint in ('0' * 64, ''): - with self.subTest(fingerprint=fingerprint), self.assertRaises(pbs.PBSError): + with self.subTest(fingerprint=fingerprint), self.assertRaises(pbs.PBSError) as caught: pbs._remote_get({**self.connection, "fingerprint": fingerprint}, '/status/datastore-usage') + self.assertEqual(caught.exception.code, "pbs_fingerprint_mismatch" if fingerprint else "pbs_connect_failed") self.assertEqual(self.requests, []) def test_bad_credentials_and_redirects_are_rejected(self): for status in (401, 403, 302): type(self).response_status = status - with self.subTest(status=status), self.assertRaises(pbs.PBSError): + with self.subTest(status=status), self.assertRaises(pbs.PBSError) as caught: pbs._remote_get(self.connection, '/status/datastore-usage') + self.assertEqual(caught.exception.code, "pbs_token_rejected" if status in (401, 403) else "pbs_invalid_response") if __name__ == '__main__': diff --git a/AppImage/scripts/tests/test_pbs_i18n.py b/AppImage/scripts/tests/test_pbs_i18n.py new file mode 100644 index 00000000..42a629c7 --- /dev/null +++ b/AppImage/scripts/tests/test_pbs_i18n.py @@ -0,0 +1,196 @@ +"""PBS localization metadata must preserve routes, security and persistence.""" +import importlib.util +import json +from pathlib import Path +import sys +import tempfile +import types +import unittest +from unittest import mock +from flask import Flask + +ROOT = Path(__file__).resolve().parents[3] +sys.path.insert(0, str(ROOT / "AppImage/scripts")) +import auth_manager +import pbs_manager as pbs +REAL_REMOTE_REQUEST = pbs._remote_request + + +class PBSI18nTests(unittest.TestCase): + def setUp(self): + temp = tempfile.TemporaryDirectory(); self.addCleanup(temp.cleanup) + self.root = Path(temp.name) + for patch in [mock.patch.multiple(auth_manager, CONFIG_DIR=self.root, AUTH_CONFIG_FILE=self.root / "auth.json"), + mock.patch.object(pbs, "_remote_get", return_value=[]), + mock.patch.object(pbs, "_remote_request"), + mock.patch.object(pbs, "local_available", return_value=False)]: + patch.start(); self.addCleanup(patch.stop) + (self.root / "auth.json").write_text(json.dumps({"enabled": True, "password_hash": "fixture"})) + self.server = {"name": "Fixture", "url": "https://pbs.invalid:8007", "token_id": "audit@pbs!monitor", "token_secret": "fake-fixture-secret", "fingerprint": ""} + self.id = pbs.save_server(self.server) + pbs._remote_get.reset_mock(); pbs._status_cache.clear() + auth = types.SimpleNamespace(load_auth_config=auth_manager.load_auth_config, verify_token=lambda _: "fixture", + verify_token_full=lambda token: ("fixture", "full_admin" if token == "admin" else "read_only")) + spec = importlib.util.spec_from_file_location("fixture_pbs_jwt", ROOT / "AppImage/scripts/jwt_middleware.py") + middleware = importlib.util.module_from_spec(spec) + with mock.patch.dict(sys.modules, {"auth_manager": auth}): spec.loader.exec_module(middleware) + spec = importlib.util.spec_from_file_location("fixture_pbs_routes", ROOT / "AppImage/scripts/flask_pbs_routes.py") + routes = importlib.util.module_from_spec(spec) + with mock.patch.dict(sys.modules, {"jwt_middleware": middleware}): spec.loader.exec_module(routes) + app = Flask(__name__); app.register_blueprint(routes.pbs_bp); self.client = app.test_client() + + def send(self, method="POST", path="/api/pbs/servers", data=None, role="admin"): + return self.client.open(path, method=method, json=data, headers={"Authorization": "Bearer " + role} if role else {}) + + def reject(self, data, message, code, path="/api/pbs/servers"): + before = (self.root / "pbs_servers.json").read_bytes() + with mock.patch.object(pbs, "_save_servers") as save: + response = self.send(path=path, data=data) + self.assertEqual(response.status_code, 400) + self.assertEqual(response.json, {"error": message, "code": code}) + self.assertEqual(response.headers["Cache-Control"], "no-store") + save.assert_not_called(); pbs._remote_get.assert_not_called(); pbs._remote_request.assert_not_called() + self.assertEqual((self.root / "pbs_servers.json").read_bytes(), before) + + def test_invalid_input_is_localizable_before_any_remote_or_save_effect(self): + cases = [ + (None, "Invalid PBS server configuration.", "pbs_invalid_config"), + ({**self.server, "name": []}, "Invalid PBS connection field.", "pbs_invalid_field"), + ({**self.server, "url": "http://pbs.invalid"}, "Use an HTTPS PBS URL without embedded credentials, query or fragment.", "pbs_invalid_url"), + ({**self.server, "name": ""}, "A server name of at most 128 characters is required.", "pbs_name_required"), + ({**self.server, "token_id": "bad"}, "Enter a PBS API token ID in user@realm!token format.", "pbs_token_id_format"), + ({**self.server, "token_secret": "bad\nsecret"}, "A valid API token secret is required.", "pbs_token_secret"), + ({**self.server, "token_id": "človek@pbs!monitor"}, "Invalid API token ID.", "pbs_invalid_token_id"), + ({**self.server, "fingerprint": "invalid"}, "The certificate fingerprint must be SHA256 (64 hex characters).", "pbs_invalid_fingerprint"), + ({**self.server, "id": "../../bad"}, "Invalid PBS server ID.", "pbs_invalid_id"), + ] + for data, message, code in cases: + with self.subTest(code=code): self.reject(data, message, code) + for data, message, code in [ + ({**self.server, "username": "missing-realm", "password": "fake"}, "Enter the PBS user as user@realm, for example root@pam.", "pbs_username"), + ({**self.server, "username": "root@pam", "password": ""}, "Enter the password of the PBS user.", "pbs_password"), + ]: + with self.subTest(code=code): self.reject(data, message, code, "/api/pbs/servers/login") + + def test_authentication_and_scope_guards_precede_all_mutations(self): + before = (self.root / "pbs_servers.json").read_bytes() + save_patch = mock.patch.object(pbs, "_save_servers") + save = save_patch.start(); self.addCleanup(save_patch.stop) + for path, method in [("/api/pbs/servers", "POST"), ("/api/pbs/servers/login", "POST"), ("/api/pbs/servers/" + self.id, "DELETE")]: + for role, status in [(None, 401), ("reader", 403)]: + self.assertEqual(self.send(method, path, self.server, role).status_code, status) + (self.root / "auth.json").write_text(json.dumps({"enabled": False})) + for path in ("/api/pbs/servers", "/api/pbs/servers/login"): + response = self.send(path=path, data=self.server) + self.assertEqual(response.status_code, 409) + self.assertEqual(response.json, {"error": "Enable local authentication before saving remote PBS credentials.", "code": "pbs_auth_required"}) + response = self.send("DELETE", "/api/pbs/servers/" + self.id) + self.assertEqual(response.status_code, 409) + self.assertEqual(response.json["code"], "pbs_auth_required") + pbs._remote_get.assert_not_called(); pbs._remote_request.assert_not_called() + save.assert_not_called() + self.assertEqual((self.root / "pbs_servers.json").read_bytes(), before) + + def test_corrupt_configuration_missing_server_and_local_unavailable_keep_status(self): + response = self.send("DELETE", "/api/pbs/servers/absent") + self.assertEqual((response.status_code, response.json), (400, {"error": "PBS server not found.", "code": "pbs_not_found"})) + for identifier, code in [("absent", "pbs_not_found"), ("local", "pbs_local_unavailable")]: + response = self.send("GET", "/api/pbs/status?server=" + identifier) + self.assertEqual(response.status_code, 502); self.assertEqual(response.json["code"], code) + (self.root / "pbs_servers.json").write_text("invalid json") + response = self.send("GET", "/api/pbs/servers") + self.assertEqual((response.status_code, response.json), (500, {"error": "Could not read the PBS server configuration.", "code": "pbs_config_read"})) + pbs._remote_get.assert_not_called(); pbs._remote_request.assert_not_called() + + def test_save_delete_failures_leave_previous_bytes_and_do_not_leak_details(self): + for path, method, data, code, message in [ + ("/api/pbs/servers", "POST", {**self.server, "id": self.id}, "pbs_save_failed", "Could not save PBS connection."), + ("/api/pbs/servers/" + self.id, "DELETE", None, "pbs_remove_failed", "Could not remove PBS connection."), + ]: + before = (self.root / "pbs_servers.json").read_bytes() + with self.subTest(method=method), mock.patch.object(pbs.os, "replace", side_effect=OSError("private filesystem detail")): + response = self.send(method, path, data) + self.assertEqual((response.status_code, response.json), (500, {"error": message, "code": code})) + self.assertEqual((self.root / "pbs_servers.json").read_bytes(), before) + + def test_partial_status_preserves_legacy_error_null_and_cache_with_additive_metadata(self): + def remote(server, endpoint): + if endpoint == "/version": return {"version": "4.2.5"} + if endpoint == "/admin/verify": raise pbs.PBSError("Fixture access denied", code="pbs_token_rejected") + if endpoint == "/admin/prune": return {"invalid": "list"} + return [] + with mock.patch.object(pbs, "_remote_get", side_effect=remote) as remote_call: + result = self.send("GET", "/api/pbs/status?server=" + self.id) + count = remote_call.call_count + self.assertEqual(self.send("GET", "/api/pbs/status?server=" + self.id).json, result.json) + self.assertEqual(remote_call.call_count, count) + self.assertEqual(result.status_code, 200) + self.assertIsNone(result.json["verify"]); self.assertIsNone(result.json["prune"]) + self.assertEqual(result.json["sync"], []) + self.assertEqual(result.json["errors"]["verify"], "Fixture access denied") + self.assertEqual(result.json["error_details"]["verify"], {"code": "pbs_token_rejected"}) + self.assertEqual(result.json["error_details"]["prune"], {"code": "pbs_invalid_list"}) + + def test_local_datastore_errors_and_command_errors_keep_legacy_messages(self): + with mock.patch.object(pbs, "_cli", return_value=[{"name": "offline", "path": "/fixture", "backing-device": "fixture"}]), \ + mock.patch.object(pbs.os.path, "ismount", return_value=False), mock.patch.object(pbs.shutil, "disk_usage") as usage: + store = pbs._local_datastores()[0] + self.assertEqual(store["error"], "Datastore is offline, in maintenance or has no mounted backing device.") + self.assertEqual(store["error_code"], "pbs_datastore_offline"); usage.assert_not_called(); self.assertIsNone(store["total"]) + with mock.patch.object(pbs.subprocess, "run", side_effect=OSError("fixture")): + for fn, args in [(pbs._cli, ("task", "list")), (pbs._local_api, ("/admin/sync",))]: + with self.subTest(args=args), self.assertRaises(pbs.PBSError) as caught: fn(*args) + self.assertEqual(caught.exception.code, "pbs_read_failed") + self.assertIn("Check its service and permissions.", str(caught.exception)) + + def test_remote_failure_codes_follow_the_actual_request_and_keep_english(self): + cases = [ + (401, b'{}', "pbs_token_rejected", "PBS rejected the API token or its permissions. Check both the user and token ACLs."), + (302, b'{}', "pbs_invalid_response", "PBS returned an invalid response. Redirects are not followed."), + (200, b'{}', "pbs_invalid_json", "PBS returned an invalid JSON document."), + (200, b'invalid-json', "pbs_connect_failed", "Could not connect to PBS over verified HTTPS. Check the address, certificate and service."), + ] + for status, body, code, message in cases: + connection = mock.Mock(); connection.getresponse.return_value.status = status + connection.getresponse.return_value.read.return_value = body + with self.subTest(code=code), mock.patch.object(pbs.http.client, "HTTPSConnection", return_value=connection), \ + self.assertRaises(pbs.PBSError) as caught: + REAL_REMOTE_REQUEST(self.server, "GET", "/version", {}) + self.assertEqual((str(caught.exception), caught.exception.problem()), (message, {"code": code})) + connection.close.assert_called_once() + for code in ("pbs_login_rejected", "pbs_token_create_denied", "pbs_audit_role_denied"): + connection = mock.Mock(); connection.getresponse.return_value.status = 403 + connection.getresponse.return_value.read.return_value = b'{}' + with self.subTest(code=code), mock.patch.object(pbs.http.client, "HTTPSConnection", return_value=connection), self.assertRaises(pbs.PBSError) as caught: + REAL_REMOTE_REQUEST(self.server, "POST", "/access/ticket", {}, rejected="Original context", rejected_code=code) + self.assertEqual((str(caught.exception), caught.exception.code), ("Original context", code)) + + def test_connection_limit_and_invalid_datastore_response_do_not_save(self): + before = (self.root / "pbs_servers.json").read_bytes() + with mock.patch.object(pbs, "_save_servers") as save, mock.patch.object(pbs, "_load_servers", return_value=[{"id": str(i)} for i in range(32)]): + response = self.send(data=self.server) + self.assertEqual(response.json, {"error": "At most 32 PBS connections may be configured.", "code": "pbs_connection_limit", "params": {"count": 32}}) + self.assertEqual(response.status_code, 400); save.assert_not_called() + pbs._remote_get.return_value = {} + response = self.send(data=self.server) + self.assertEqual(response.json["code"], "pbs_invalid_datastores") + self.assertEqual((self.root / "pbs_servers.json").read_bytes(), before) + + def test_login_failures_keep_saved_state_and_cleanup_a_created_token(self): + before = (self.root / "pbs_servers.json").read_bytes() + login = {"name": "Fixture", "url": "https://pbs.invalid", "username": "root@pam", "password": "fake"} + for stage, code in [("ticket", "pbs_invalid_login"), ("token", "pbs_invalid_token"), ("acl", "pbs_audit_role_denied")]: + calls = [] + def request(server, method, endpoint, headers, form=None, rejected="", rejected_code="pbs_token_rejected"): + calls.append((method, endpoint)) + if endpoint == "/access/ticket": return None if stage == "ticket" else {"ticket": "fake", "CSRFPreventionToken": "fake"} + if method == "POST": return None if stage == "token" else {"tokenid": "audit@pbs!fixture", "value": "fake"} + if method == "PUT": raise pbs.PBSError(rejected, code=rejected_code) + pbs._remote_request.side_effect = request + response = self.send(path="/api/pbs/servers/login", data=login) + self.assertEqual(response.status_code, 400); self.assertEqual(response.json["code"], code) + self.assertEqual((self.root / "pbs_servers.json").read_bytes(), before) + self.assertEqual(sum(method == "DELETE" for method, _ in calls), 1 if stage == "acl" else 0) + + +if __name__ == "__main__": unittest.main() diff --git a/lang/de.json b/lang/de.json index 7a15f617..6b7d29be 100644 --- a/lang/de.json +++ b/lang/de.json @@ -1,6 +1,9 @@ { "# Alternative if you prefer screen": "# Alternative, wenn Sie den Bildschirm bevorzugen", "# Recommended: avoids disconnection during upgrade": "# Empfohlen: Verhindert Verbindungsabbrüche während des Upgrades", + "%s of %s updates failed — see the messages above.": "%s von %s Updates sind fehlgeschlagen – siehe die Meldungen oben.", + "%s of %s updates failed.": "%s von %s Updates sind fehlgeschlagen.", + "'auto'/'local', or root@IP for development": "'auto'/'local' oder root@IP für die Entwicklung", "(Checked entries will be removed. Uncheck to keep in VM.)": "(Überprüfte Einträge werden entfernt. Deaktivieren Sie die Markierung, um sie in VM zu behalten.)", "(Import is selected by default — required for disk image imports)": "(Import ist standardmäßig ausgewählt – erforderlich für Disk-Image-Importe)", "(Only the host directory is modified. Nothing inside the container is changed.": "(Es wird nur das Hostverzeichnis geändert. Im Container wird nichts geändert.", @@ -163,6 +166,7 @@ "APT configured to skip additional languages": "APT ist so konfiguriert, dass zusätzliche Sprachen übersprungen werden", "APT configured to skip downloading additional languages": "APT ist so konfiguriert, dass das Herunterladen zusätzlicher Sprachen übersprungen wird", "APT configured to use IPv4": "APT ist für die Verwendung von IPv4 konfiguriert", + "APT hook syntax issue, removing...": "Syntaxproblem im APT-Hook, wird entfernt...", "APT index update failed after switching to no-subscription. See log:": "Die Aktualisierung des APT-Index ist nach dem Wechsel zu „Kein Abonnement“ fehlgeschlagen. Siehe Protokoll:", "APT index update failed. See log:": "Die Aktualisierung des APT-Index ist fehlgeschlagen. Siehe Protokoll:", "APT indexes updated for Trixie": "APT-Indizes für Trixie aktualisiert", @@ -210,6 +214,7 @@ "Activate ProxMenux Monitor": "Aktivieren Sie den ProxMenux Monitor", "Active": "Aktiv", "Active Connections": "Aktive Verbindungen", + "Active ZRAM algorithm, capacity or swap sources did not match the profile": "Aktiver ZRAM-Algorithmus, Kapazität oder Swap-Quellen stimmen nicht mit dem Profil überein", "Active exports:": "Aktive Exporte:", "Active session:": "Aktive Sitzung:", "Actual device path on the host": "Tatsächlicher Gerätepfad auf dem Host", @@ -263,6 +268,7 @@ "Add or remove extra paths and devices": "Zusätzliche Pfade und Geräte hinzufügen oder entfernen", "Add physical disk to VM via": "Fügen Sie der VM eine physische Festplatte hinzu über", "Add share block in /etc/samba/smb.conf:": "Freigabeblock in /etc/samba/smb.conf hinzufügen:", + "Add the host firewall rule of this container; one option for each confirmed rule": "Die Host-Firewall-Regel dieses Containers hinzufügen; eine Option für jede bestätigte Regel", "Add unprivileged flag to container configuration:": "Unprivilegiert-Flag zur Containerkonfiguration hinzufügen:", "Add virtual disk": "Fügen Sie eine virtuelle Festplatte hinzu", "Add: Mount Host Directory into LXC": "Hinzufügen: Hostverzeichnis in LXC einbinden", @@ -337,6 +343,7 @@ "Aliases added to .bashrc": "Aliase wurden zu .bashrc hinzugefügt", "Alist Sync web interface": "Alist Sync Web Interface", "All": "Alle", + "All %s update(s) completed successfully.": "Alle %s Update(s) wurden erfolgreich abgeschlossen.", "All Available Scripts": "Alle verfügbaren Skripte", "All GPUs Already Assigned": "Alle GPUs bereits zugewiesen", "All ProxMenux optimizations are up to date.": "Alle ProxMenux-Optimierungen sind auf dem neuesten Stand.", @@ -367,6 +374,9 @@ "All {count} containers of the application will be recreated from their saved image digests (main CT: {vmid}). The stack is stopped, every container is backed up and replaced, then checked. If the operation fails after a container was changed, the backups are restored. An operation that stops halfway is recovered from the OCI management menu.": "Alle {count} Container der Anwendung werden aus ihren gespeicherten Image-Digests neu erstellt (Haupt-CT: {vmid}). Der Stack wird angehalten, jeder Container wird gesichert und ersetzt und anschließend überprüft. Wenn der Vorgang nach dem Ändern eines Containers fehlschlägt, werden die Sicherungen wiederhergestellt. Ein Vorgang, der auf halbem Weg stoppt, wird über das OCI-Verwaltungsmenü wiederhergestellt.", "Allocate CPU Cores": "Weisen Sie CPU-Kerne zu", "Allocate RAM in MiB": "Weisen Sie RAM in MiB zu", + "Allocated Cores:": "Zugewiesene Kerne:", + "Allocated RAM:": "Zugewiesener RAM:", + "Allocating virtual disk for %s...": "Virtueller Datenträger für %s wird zugewiesen...", "Allow TCP port {port} from {subnet} through the host firewall? Existing firewall rules are not changed.": "TCP-Port {port} von {subnet} durch die Host-Firewall zulassen? Bestehende Firewall-Regeln werden nicht geändert.", "Allowed hosts (comma separated; * allows access through the assigned IP)": "Zulässige Hosts (Komma getrennt; * ermöglicht den Zugriff über die zugewiesene IP)", "Allowed source subnet:": "Zulässiges Quellsubnetz:", @@ -407,6 +417,7 @@ "Analyzing selected disks...": "Ausgewählte Festplatten werden analysiert...", "Analyzing system for available PCIe storage devices...": "Analysesystem für verfügbare PCIe-Speichergeräte...", "Another OCI operation is using the instance registry": "Eine andere OCI operation verwendet die Instanzregistrierung", + "Another OCI operation is using the instance registry.": "Ein anderer OCI-Vorgang verwendet das Instanzregister.", "Another OCI operation is using the instance registry. Wait for it to finish and open this menu again; no container is modified.": "Eine andere OCI operation verwendet die Instanzregistrierung. Warten Sie, bis es fertig ist und öffnen Sie dieses Menü erneut; kein Container wird geändert.", "Another OCI operation is using the instance registry. Wait for it to finish.": "Ein weiterer OCI-Vorgang verwendet die Instanzregistrierung. Warten Sie, bis der Vorgang abgeschlossen ist.", "Another OCI operation is using the registry. This operation was not started.": "Eine weitere OCI operation verwendet die Registry. Diese operation wurde nicht gestartet.", @@ -421,6 +432,7 @@ "Another registry account operation is running. Try again when it finishes.": "Ein anderer Registrierungskontovorgang wird ausgeführt. Versuchen Sie es erneut, wenn der Vorgang abgeschlossen ist.", "Another stack operation is pending": "Ein weiterer Stack operation steht aus", "Application": "Antragstellung", + "Application data": "Anwendungsdaten", "Application registered on this host:": "Auf diesem Host registrierte Anwendung:", "Application responding:": "Antragsantwort:", "Application responding; checking its stability...": "Anwendung reagiert; Überprüfung seiner Stabilität...", @@ -566,6 +578,7 @@ "BIOS from": "BIOS von", "BIOS: OVMF (UEFI)": "BIOS: OVMF (UEFI)", "BOINC is a platform for high-throughput computing on a large scale (thousands or millions of computers). It can be used for volunteer computing (using consumer devices) or grid computing (using organizational resources). It supports virtualized, parallel, and GPU-based applications.": "BOINC ist eine Plattform für Hochdurchsatz-Computing in großem Maßstab (Tausende oder Millionen von Computern). Es kann für Freiwilligen-Computing (unter Verwendung von Consumer-Geräten) oder Grid-Computing (unter Verwendung von organisatorischen Ressourcen) verwendet werden. Es unterstützt virtualisierte, parallele und GPU-basierte Anwendungen.", + "BRIDGE": "BRIDGE", "BRIDGE CONFIGURATION ANALYSIS": "BRÜCKENKONFIGURATIONSANALYSE", "BTRFS:": "BTRFS:", "Baby Buddy web interface": "Baby Buddy Web-Schnittstelle", @@ -628,6 +641,7 @@ "Bandwidth limit configured": "Bandbreitenbegrenzung konfiguriert", "Bandwidth test (iperf3)": "Bandbreitentest (iperf3)", "Bandwidth test completed successfully": "Bandbreitentest erfolgreich abgeschlossen", + "Banner removal cancelled by user.": "Entfernung des Banners vom Benutzer abgebrochen.", "Base VM created with ID": "Basis-VM mit ID erstellt", "Base VMID": "Basis-VMID", "Base VMID (empty = next free block)": "Basis VMID (leer = nächster freier Block)", @@ -657,6 +671,7 @@ "Blocked GPU ID for VM Mode": "Blockierte GPU-ID für den VM-Modus", "Blocked device(s)": "Blockierte(s) Gerät(e)", "Blocked device(s):": "Blockierte(s) Gerät(e):", + "Blockers": "Hindernisse", "BookStack web interface": "BookStack Web-Schnittstelle", "Bookstack is a free and open source Wiki designed for creating beautiful documentation. Featuring a simple, but powerful WYSIWYG editor it allows for teams to create detailed and useful documentation with ease.": "Bookstack ist ein kostenloses und Open-Source-Wiki für die Erstellung schöner Dokumentation. Mit einem einfachen, aber leistungsstarken WYSIWYG-Editor können Teams mit Leichtigkeit detaillierte und nützliche Dokumentationen erstellen.", "Boot Disk": "Bootdiskette", @@ -691,6 +706,7 @@ "Build and install the gasket and apex kernel modules (DKMS)": "gasket- und apex-Kernelmodule erstellen und installieren (DKMS)", "Build dependencies installed.": "Build-Abhängigkeiten installiert.", "Build your personal knowledge base with TriliumNext Notes": "Erstellen Sie Ihre persönliche Wissensbasis mit TriliumNext Notes", + "Bulk generation requires GITHUB_TOKEN to obtain an immutable revision per application": "Die Massengenerierung erfordert GITHUB_TOKEN, um für jede Anwendung eine unveränderliche Revision zu erhalten", "Business & ERP": "Unternehmen und ERP", "CHANGES APPLIED SUCCESSFULLY": "ÄNDERUNGEN WURDEN ERFOLGREICH ANGEWENDET", "CIFS Client Tools: AVAILABLE": "CIFS-Client-Tools: VERFÜGBAR", @@ -709,6 +725,7 @@ "CLUSTER UPGRADE NOTES:": "HINWEISE ZUM CLUSTER-UPGRADE:", "CONFIGURED INTERFACES": "Konfigurierte Schnittstellen", "CONFIRM FORMAT": "BESTÄTIGEN SIE DAS FORMAT", + "CORE COUNT": "ANZAHL DER KERNE", "CPU": "CPU", "CPU Cores": "CPU-Kerne", "CPU MODEL": "CPU-MODELL", @@ -720,7 +737,11 @@ "CRITICAL: The selected disk is referenced by a RUNNING VM or CT.": "KRITISCH: Die ausgewählte Festplatte wird von einer LAUFENDEN VM oder CT referenziert.", "CT": "CT", "CT started successfully.": "CT erfolgreich gestartet.", + "CT {vmid} ({name}) could not be kept running; it is left stopped": "CT {vmid} ({name}) konnte nicht in Betrieb gehalten werden; er bleibt gestoppt", + "CT {vmid} ({name}) stopped on its own; starting it again (attempt {attempt})": "CT {vmid} ({name}) wurde von selbst gestoppt; er wird erneut gestartet (Versuch {attempt})", "CT {vmid} is a host monitor and had a rule in the host firewall. Allow TCP port {port} from {subnet} through the firewall of this host? Existing firewall rules are not changed.": "CT {vmid} ist ein Host-Monitor und hatte eine Regel in der Host-Firewall. TCP-Port {port} von {subnet} durch die Firewall dieses Hosts zulassen? Bestehende Firewall-Regeln werden nicht geändert.", + "CT {vmid} is one of the {count} containers of {application}.": "CT {vmid} ist einer der {count} Container von {application}.", + "CT {vmid}: DHCP client of {name} (IPv{version}) started again": "CT {vmid}: DHCP-Client von {name} (IPv{version}) wurde erneut gestartet", "CUDA requires a working NVIDIA driver": "CUDA requires ein funktionierender NVIDIA Fahrer", "CUDA requires the NVIDIA Container Toolkit on the host": "CUDA requires das NVIDIA Container Toolkit auf dem Host", "Calculate all kinds of statistics from your (local) Emby or Jellyfin server": "Berechnen Sie alle Arten von Statistiken von Ihrem (lokalen) Emby- oder Jellyfin-Server", @@ -737,6 +758,7 @@ "Cannot continue": "Kann nicht fortgesetzt werden", "Cannot create:": "Kann nicht erstellt werden:", "Cannot detect filesystem on": "Dateisystem kann nicht erkannt werden", + "Cannot determine installed systemd-zram-generator version": "Die installierte Version von systemd-zram-generator kann nicht ermittelt werden", "Cannot find": "Kann nicht gefunden werden", "Cannot identify the vendor of the device:": "Kann den Anbieter des Geräts nicht identifizieren:", "Cannot inspect current swap configuration": "Die aktuelle Swap-Konfiguration kann nicht überprüft werden", @@ -871,8 +893,11 @@ "Checklist post-upgrade finished. Warnings:": "Checkliste nach dem Upgrade abgeschlossen. Warnungen:", "Checklist pre-check finished. Warnings:": "Checklisten-Vorprüfung abgeschlossen. Warnungen:", "Checks for LVM and storage issues": "Prüft auf LVM- und Speicherprobleme", + "Choose": "Auswählen", + "Choose BIOS Type": "BIOS-Typ auswählen", "Choose BIOS type": "Wählen Sie den BIOS-Typ", "Choose No to abort and roll back to the legacy refuse behaviour.": "Wählen Sie „Nein“, um den Vorgang abzubrechen und zum alten Ablehnungsverhalten zurückzukehren.", + "Choose Type": "Typ auswählen", "Choose ZimaOS image option:": "Wählen Sie die ZimaOS-Bildoption:", "Choose a Samba server:": "Wählen Sie einen Samba-Server:", "Choose a Windows ISO to use:": "Wählen Sie ein zu verwendendes Windows-ISO aus:", @@ -972,10 +997,12 @@ "Cluster configuration (advanced)": "Clusterkonfiguration (erweitert)", "Cluster data will be applied automatically at next boot.": "Clusterdaten werden beim nächsten Start automatisch angewendet.", "Cluster upgrade mode": "Cluster-Upgrade-Modus", + "Code": "Code", "Code-server is VS Code running on a remote server, accessible through the browser.": "Code-Server ist VS Code, der auf einem entfernten Server läuft und über den Browser zugänglich ist.", "CodeProject.AI Server": "CodeProject. AI Server", "Command": "Befehl", "Command failed": "Befehl fehlgeschlagen", + "Command not found.": "Befehl nicht gefunden.", "Command override for an unknown service:": "Command Override für einen unbekannten Dienst:", "Commenting any residual Bookworm lines in *.list...": "Kommentieren aller verbleibenden Bookworm-Zeilen in *.list...", "Commenting legacy PVE 8 repository .list files (if any)...": "Kommentieren älterer PVE 8-Repository-.list-Dateien (falls vorhanden) ...", @@ -1017,8 +1044,11 @@ "Component:": "Komponente:", "Components to uninstall (manual for now):": "Zu deinstallierende Komponenten (vorerst manuell):", "Compose capabilities validated in the LXC user namespace:": "Compose-Funktionen, die im LXC-Benutzernamensraum validiert wurden:", + "Compose environment must be a list or a mapping.": "Die Compose-Umgebung muss eine Liste oder eine Zuordnung sein.", "Compose file of the application": "Datei des Antrags erstellen", "Compose file of this host": "Datei dieses Hosts erstellen", + "Compose ports must be a list.": "Die Compose-Ports müssen eine Liste sein.", + "Compose volumes must be a list.": "Die Compose-Volumes müssen eine Liste sein.", "Compressed size:": "Komprimierte Größe:", "Compressing": "Komprimieren", "Compression": "Komprimierung", @@ -1057,6 +1087,7 @@ "Configure Proxmox APT repositories": "Proxmox APT-Repositorys konfigurieren", "Configure Samba Client in LXC (only privileged)": "Samba-Client in LXC konfigurieren (nur privilegiert)", "Configure Samba Server in LXC (only privileged)": "Samba-Server in LXC konfigurieren (nur privilegiert)", + "Configure and install an application": "Eine Anwendung konfigurieren und installieren", "Configure as guest (no authentication)": "Als Gast konfigurieren (keine Authentifizierung)", "Configure backup destinations": "Konfigurieren Sie Sicherungsziele", "Configure backup destinations (PBS, Borg, local)": "Backup-Ziele konfigurieren (PBS, Borg, lokal)", @@ -1065,7 +1096,12 @@ "Configure the remote in the Rclone Web UI first. Checking its name may start a stopped CT, even in a dry run. Applying the mount restarts the CT and attempts to publish two FUSE views on the host; a dry run does not publish them.": "Konfigurieren Sie zuerst die Fernbedienung in der Rclone-Web-Benutzeroberfläche. Die Überprüfung des Namens kann dazu führen, dass ein gestoppter CT gestartet wird, selbst bei einem Probelauf. Durch Anwenden des Mount wird CT neu gestartet und versucht, zwei FUSE-Ansichten auf dem Host zu veröffentlichen.ein Probelauf veröffentlicht sie nicht.", "Configure with username and password": "Konfigurieren Sie mit Benutzername und Passwort", "Configured Ports": "Konfigurierte Ports", + "Configured VM description": "VM-Beschreibung konfiguriert", "Configured but doesn't exist": "Konfiguriert, aber nicht vorhanden", + "Configured controller/NVMe as hostpci%s: %s": "Controller/NVMe als hostpci%s konfiguriert: %s", + "Configured import disk %s as %s": "Importierter Datenträger %s als %s konfiguriert", + "Configured loader disk as ide0": "Loader-Datenträger als ide0 konfiguriert", + "Configured virtual disk as %s, %sGB on %s": "Virtueller Datenträger als %s konfiguriert, %sGB auf %s", "Configuring AMD GPU passthrough...": "AMD-GPU-Passthrough wird konfiguriert...", "Configuring AMD softdep...": "Konfigurieren der AMD-Softdep...", "Configuring APT to skip downloading additional languages": "APT so konfigurieren, dass das Herunterladen zusätzlicher Sprachen übersprungen wird", @@ -1086,6 +1122,7 @@ "Configuring Proxmox APT repositories...": "Proxmox APT-Repositorys konfigurieren ...", "Configuring Proxmox filter...": "Proxmox-Filter konfigurieren...", "Configuring Proxmox jail...": "Proxmox-Jail wird konfiguriert...", + "Configuring Serial Port:": "Serielle Schnittstelle wird konfiguriert:", "Configuring TCP optimizations...": "TCP-Optimierungen konfigurieren...", "Configuring TPM device": "TPM-Gerät konfigurieren", "Configuring Unpackerr...": "Konfiguration von Unpackerr...", @@ -1161,6 +1198,7 @@ "Consider security implications for production environments": "Berücksichtigen Sie Sicherheitsauswirkungen für Produktionsumgebungen", "Consider visiting the repository and supporting the project.": "Erwägen Sie einen Besuch im Repository und die Unterstützung des Projekts.", "Console log:": "Konsolenprotokoll:", + "Consume/export": "Verbrauch/Export", "Container": "Container", "Container — LXC root directories": "Container – LXC-Stammverzeichnisse", "Container ID": "Container-ID", @@ -1247,6 +1285,7 @@ "Controller + NVMe passthrough requires machine type q35. Skipping controller assignment.": "Controller + NVMe-Passthrough erfordern Maschinentyp q35. Controller-Zuweisung wird übersprungen.", "Controller/NVMe Conflict Policy": "Controller-/NVMe-Konfliktrichtlinie", "Controller/NVMe already present in VM config": "Controller/NVMe bereits in der VM-Konfiguration vorhanden", + "Controller/NVMe already present in VM config (%s)": "Controller/NVMe ist bereits in der VM-Konfiguration vorhanden (%s)", "Controller/NVMe assigned": "Controller/NVMe zugewiesen", "Controller/NVMe is in use by running VM": "Controller/NVMe wird von der laufenden VM verwendet", "Controller/NVMe passthrough requires IOMMU enabled in BIOS/UEFI and kernel.": "Controller/NVMe-Passthrough erfordert die Aktivierung von IOMMU im BIOS/UEFI und im Kernel.", @@ -1313,6 +1352,7 @@ "Core packages": "Kernpakete", "Cores": "Kerne", "Corrupted gzip layer": "Korrupte Gzip-Schicht", + "Could not activate dev-zram0.swap": "dev-zram0.swap konnte nicht aktiviert werden", "Could not add": "Konnte nicht hinzugefügt werden", "Could not add disk": "Festplatte konnte nicht hinzugefügt werden", "Could not add the confirmed host firewall rule": "Die bestätigte Host-Firewall-Regel konnte nicht hinzugefügt werden", @@ -1329,12 +1369,14 @@ "Could not change VM virtual display to vga: std": "Die virtuelle VM-Anzeige konnte nicht in vga: std geändert werden", "Could not check the NVIDIA GPU": "Konnte die NVIDIA GPU nicht überprüfen", "Could not clone any gasket-driver repository. Check your internet connection and": "Es konnte kein gasket-driver-Repository geklont werden. Überprüfen Sie Ihre Internetverbindung und", + "Could not complete or verify the repository switch; changes may be partial and repository state is unknown. Inspect {ui} before retrying; no automatic rollback was attempted.": "Der Repository-Wechsel konnte nicht abgeschlossen oder überprüft werden; die Änderungen sind möglicherweise unvollständig und der Zustand der Repositorys ist unbekannt. Prüfen Sie {ui}, bevor Sie es erneut versuchen; es wurde kein automatisches Zurücksetzen versucht.", "Could not complete private network release:": "Die Veröffentlichung des privaten Netzwerks konnte nicht abgeschlossen werden:", "Could not configure IOMMU kernel parameters automatically. Configure manually and reboot.": "IOMMU-Kernelparameter konnten nicht automatisch konfiguriert werden. Manuell konfigurieren und neu starten.", "Could not convert the OCI rootfs to privileged": "Konnte die OCI-Rootfs nicht in privilegierte umwandeln", "Could not copy the PVE keyfile into place. Check permissions on:": "Die PVE-Schlüsseldatei konnte nicht kopiert werden. Überprüfen Sie die Berechtigungen für:", "Could not copy the keyfile into place.": "Die Schlüsseldatei konnte nicht kopiert werden.", "Could not copy the keyfile into place. Check permissions on:": "Die Schlüsseldatei konnte nicht kopiert werden. Überprüfen Sie die Berechtigungen für:", + "Could not create ZRAM generator directory": "Das Verzeichnis des ZRAM-Generators konnte nicht erstellt werden", "Could not create a temporary directory for the NVIDIA Container Toolkit.": "Es konnte kein temporäres Verzeichnis für das NVIDIA Container Toolkit erstellt werden.", "Could not create converter directory:": "Konverterverzeichnis konnte nicht erstellt werden:", "Could not create destination directory:": "Zielverzeichnis konnte nicht erstellt werden:", @@ -1391,6 +1433,7 @@ "Could not push the key. Check the password and that": "Die Taste konnte nicht gedrückt werden. Überprüfen Sie das Passwort und so weiter", "Could not query the image registry": "Konnte die Bildregistrierung nicht abfragen", "Could not reach {registry}. Check its address, DNS and network access.": "{registry} konnte nicht erreicht werden. Überprüfen Sie die Adresse, den DNS und den Netzwerkzugriff.", + "Could not reach {url} after 3 attempts: {reason}": "{url} war nach 3 Versuchen nicht erreichbar: {reason}", "Could not read SMART data from": "Die SMART-Daten konnten nicht gelesen werden", "Could not read VM configuration.": "Die VM-Konfiguration konnte nicht gelesen werden.", "Could not read the CUDA compute capability": "Konnte die CUDA-Rechenfähigkeit nicht lesen", @@ -1423,6 +1466,7 @@ "Could not stage pending restore. Nothing new was scheduled.": "Die Wiederherstellung konnte nicht bereitgestellt werden. Es war nichts Neues geplant.", "Could not stop LXC": "LXC konnte nicht gestoppt werden", "Could not stop ZRAM swap; profile configuration remains": "ZRAM-Austausch konnte nicht gestoppt werden; Die Profilkonfiguration bleibt erhalten", + "Could not stop existing dev-zram0.swap": "Das vorhandene dev-zram0.swap konnte nicht gestoppt werden", "Could not translate the Compose command/entrypoint": "Konnte den Befehl Compose/Entrypoint nicht übersetzen", "Could not unload nouveau module (may be in use). The blacklist will take effect after reboot. Installation will continue but a reboot will be required.": "Das Nouveau-Modul konnte nicht entladen werden (möglicherweise wird es verwendet). Die Blacklist wird nach dem Neustart wirksam. Die Installation wird fortgesetzt, es ist jedoch ein Neustart erforderlich.", "Could not unmount": "Die Bereitstellung konnte nicht aufgehoben werden", @@ -1431,6 +1475,8 @@ "Could not unmount — disk may be busy. Removing fstab entry anyway.": "Die Bereitstellung konnte nicht aufgehoben werden – die Festplatte ist möglicherweise ausgelastet. Fstab-Eintrag trotzdem entfernen.", "Could not update config file.": "Die Konfigurationsdatei konnte nicht aktualisiert werden.", "Could not verify removal of the managed host firewall rule.": "Die Entfernung der verwalteten Host-Firewall-Regel konnte nicht überprüft werden.", + "Could not write ZRAM generator configuration": "Die Konfiguration des ZRAM-Generators konnte nicht geschrieben werden", + "Could not write ZRAM package ownership state": "Der Paketbesitzstatus von ZRAM konnte nicht geschrieben werden", "Could not write to:": "Es konnte nicht geschrieben werden an:", "Crafty Controller default login": "Crafty Controller Standard Login", "Create Directory": "Verzeichnis erstellen", @@ -1449,6 +1495,7 @@ "Create VM System Windows": "Windows-VM erstellen", "Create VM System macOS (OSX-PROXMOX)": "macOS-VM erstellen (OSX-PROXMOX)", "Create VM from template or script": "Erstellen Sie eine VM aus einer Vorlage oder einem Skript", + "Create a %s": "%s erstellen", "Create a VM first (machine type q35 + UEFI BIOS), then run this option again.": "Erstellen Sie zuerst eine VM (Maschinentyp q35 + UEFI-BIOS) und führen Sie diese Option dann erneut aus.", "Create a backup of the container configuration:": "Erstellen Sie ein Backup der Containerkonfiguration:", "Create a backup of your container before proceeding": "Erstellen Sie ein Backup Ihres Containers, bevor Sie fortfahren", @@ -1473,6 +1520,7 @@ "Created persistent names for": "Persistente Namen erstellt für", "Created remapped user": "Neu zugeordneter Benutzer erstellt", "Created sharedfiles group (GID: 101000)": "Sharedfiles-Gruppe erstellt (GID: 101000)", + "Created with ProxMenuX": "Erstellt mit ProxMenuX", "Creating APT configuration to force IPv4...": "APT-Konfiguration erstellen, um IPv4 zu erzwingen...", "Creating Ceph repository for PVE 8 (legacy format)...": "Erstellen eines Ceph-Repositorys für PVE 8 (Legacy-Format) ...", "Creating Ceph repository for PVE 9 (deb822 format)...": "Erstellen eines Ceph-Repositorys für PVE 9 (deb822-Format) ...", @@ -1482,6 +1530,8 @@ "Creating UID remapping for unprivileged container compatibility...": "Erstellen einer UID-Neuzuordnung für Kompatibilität mit unprivilegierten Containern ...", "Creating VM with the above configuration": "Erstellen einer VM mit der obigen Konfiguration", "Creating VM...": "VM erstellen...", + "Creating a %s using the above advanced settings": "%s wird mit den obigen erweiterten Einstellungen erstellt", + "Creating a %s using the above default settings": "%s wird mit den obigen Standardeinstellungen erstellt", "Creating a backup in": "Erstellen eines Backups in", "Creating a backup of": "Erstellen eines Backups von", "Creating a backup of the container...": "Erstellen eines Backups des Containers...", @@ -1490,6 +1540,7 @@ "Creating backup of network interfaces configuration...": "Backup der Netzwerkschnittstellenkonfiguration wird erstellt...", "Creating compressed archive...": "Komprimiertes Archiv wird erstellt...", "Creating export archive...": "Exportarchiv wird erstellt...", + "Creating images directory": "Images-Verzeichnis wird erstellt", "Creating local archive...": "Lokales Archiv erstellen...", "Creating mount point...": "Mountpunkt wird erstellt...", "Creating partition table and partition...": "Partitionstabelle und Partition erstellen...", @@ -1504,6 +1555,7 @@ "Creating the initial administrator...": "Erstellen des ersten Administrators...", "Creating the private network...": "Privates Netzwerk wird erstellt...", "Creating the temporary data container": "Erstellen des temporären Datencontainers", + "Creating virtual disk (format=raw) for %s...": "Virtueller Datenträger (format=raw) für %s wird erstellt...", "Creative & Design": "Kreativität und Design", "Credential helper": "Anmeldeinformations-Helfer", "Credential storage and access": "Speicherung und Zugriff von Anmeldeinformationen", @@ -1564,6 +1616,8 @@ "Custom Configuration": "Benutzerdefinierte Konfiguration", "Custom Content": "Benutzerdefinierter Inhalt", "Custom Directory": "Benutzerdefiniertes Verzeichnis", + "Custom Image": "Benutzerdefiniertes Image", + "Custom Loader Image (from %s)": "Benutzerdefiniertes Loader-Image (aus %s)", "Custom Logo Instructions": "Anweisungen für individuelle Logos", "Custom MOTD message is already configured": "Die benutzerdefinierte MOTD-Nachricht ist bereits konfiguriert", "Custom Options": "Benutzerdefinierte Optionen", @@ -1638,6 +1692,7 @@ "Dedicated container volume (included in backups)": "Dediziertes Containervolumen (in Backups enthalten)", "Dedicated container volumes (included in backups)": "Dedizierte Container-Volumes (in Backups enthalten)", "DeepSeek Harness “Everything is a Plugin“.": "DeepSeek Harness \"Alles ist ein Plugin\".", + "Default": "Standard", "Default ACLs applied for group inheritance.": "Für die Gruppenvererbung werden Standard-ACLs angewendet.", "Default Credentials": "Standardanmeldeinformationen", "Default Gateway": "Standard-Gateway", @@ -1880,9 +1935,11 @@ "Do you want to update the existing export?": "Möchten Sie den vorhandenen Export aktualisieren?", "Do you want to update the existing share?": "Möchten Sie die vorhandene Freigabe aktualisieren?", "Do you want to view the selected backup before restoring?": "Möchten Sie das ausgewählte Backup vor der Wiederherstellung anzeigen?", + "Do-Over": "Neu beginnen", "Docker Mods are only offered for compatible LinuxServer images": "Docker Mods werden nur für kompatible LinuxServer Images angeboten", "Docker Volume Backup": "Docker Volume Backup", "Docker/CLI not available yet or no valid answer": "Docker/CLI noch nicht verfügbar oder keine gültige Antwort", + "Docs": "Doku", "Documents & Notes": "Dokumente und Notizen", "Documents volume size in GB": "Dokumentenvolumen in 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 ist eine einfach zu bedienende und äußerst vielseitige Open-Source-Wiki-Software, die keine Datenbank requi ist. Es wird von den Benutzern für seine saubere und lesbare Syntax geliebt. Die einfache Wartung, Sicherung und Integration macht es zum Favoriten des Administrators. Integrierte Zugangskontrollen und Authentifizierungskonnektoren machen DokuWiki besonders nützlich im Unternehmenskontext und die große Anzahl von Plugins, die von der lebendigen Community beigetragen werden, ermöglichen eine breite Palette von Anwendungsfällen jenseits eines traditionellen Wikis.", @@ -1898,6 +1955,7 @@ "Download its Compose file from an address": "Laden Sie die Compose-Datei von einer Adresse herunter", "Download keyfile": "Schlüsseldatei herunterladen", "Download latest VirtIO ISO automatically": "Laden Sie die neueste VirtIO-ISO automatisch herunter", + "Downloaded %s to %s": "%s nach %s heruntergeladen", "Downloaded OCI images deleted:": "Heruntergeladene OCI-Bilder gelöscht:", "Downloaded amdgpu_top": "Amdgpu_top heruntergeladen", "Downloading": "Herunterladen", @@ -1943,8 +2001,12 @@ "Duration": "Dauer", "Duration:": "Dauer:", "Dynamic NVIDIA is only validated for unprivileged containers. This profile uses static mounts and must be recreated after the host driver changes.": "Dynamic NVIDIA ist nur für unprivilegierte Container validiert. Dieses Profil verwendet statische Halterungen und muss nach dem Wechsel des Hosttreibers neu erstellt werden.", + "EFI Disk Storage": "EFI-Datenträgerspeicher", + "EFI disk created (raw) and configured on %s": "EFI-Datenträger erstellt (raw) und auf %s konfiguriert", "EFI disk created and configured on": "EFI-Festplatte erstellt und konfiguriert auf", + "EFI disk created and configured on %s": "EFI-Datenträger erstellt und auf %s konfiguriert", "EFI storage selection cancelled.": "EFI-Speicherauswahl abgebrochen.", + "EFI storage selection failed or was cancelled.": "Die Auswahl des EFI-Speichers ist fehlgeschlagen oder wurde abgebrochen.", "EFI storage selection failed or was cancelled. VM creation aborted.": "Die EFI-Speicherauswahl ist fehlgeschlagen oder wurde abgebrochen. VM-Erstellung wurde abgebrochen.", "EMERGENCY PROXMOX SYSTEM REPAIR": "NOTFALLREPARATUR DES PROXMOX-SYSTEMS", "ENABLED for restore": "Für die Wiederherstellung AKTIVIERT", @@ -1960,6 +2022,7 @@ "Edit raw CT configuration file": "Bearbeiten Sie die Roh-CT-Konfigurationsdatei", "Edit raw VM configuration file": "Bearbeiten Sie die Roh-VM-Konfigurationsdatei", "Edit the VM machine type to q35 and try again.": "Bearbeiten Sie den VM-Maschinentyp auf q35 und versuchen Sie es erneut.", + "Edition:": "Edition:", "Email address for certificate expiry notices (required by ZeroSSL)": "E-Mail-Adresse für Zertifikatsverfallsmeldungen (required by ZeroSSL)", "Email address of the LibreDB Studio administrator": "E-Mail-Adresse des LibreDB Studio-Administrators", "Email address of the NetBox admin account": "E-Mail-Adresse des NetBox Administratorkontos", @@ -1969,6 +2032,7 @@ "Emby organizes video, music, live TV, and photos from personal media libraries and streams them to smart TVs, streaming boxes and mobile devices. This container is packaged as a standalone emby Media Server.": "Emby organisiert Video, Musik, Live-TV und Fotos aus persönlichen Medienbibliotheken und streamt sie auf Smart-TVs, Streaming-Boxen und mobile Geräte. Dieser Container ist als eigenständiger emby Media Server verpackt.", "Emergency Proxmox System Repair": "Notfallreparatur des Proxmox-Systems", "Emergency recovery:": "Notfallwiederherstellung:", + "Emit numeric progress for the OCI menu": "Numerischen Fortschritt für das OCI-Menü ausgeben", "Empowering the smart home": "Empowerment des Smart Home", "Empty": "Leer", "Empty exec service check": "Leere Exec-Prüfung", @@ -1991,6 +2055,7 @@ "Enable ZFS autotrim (SSD/NVMe pools)": "ZFS-Autotrim aktivieren (SSD/NVMe-Pools)", "Enable ZRAM swap profile": "ZRAM-Swap-Profil aktivieren", "Enable a mount on an existing Rclone OCI container": "Aktivieren einer Halterung an einem vorhandenen Rclone OCI Container", + "Enable a mount on an installed Rclone OCI": "Einen Mount in einem installierten Rclone-OCI aktivieren", "Enable an optical drive for MakeMKV": "Aktivieren eines optischen Laufwerks für MakeMKV", "Enable auto-sync if /var/log exceeds 90% of its size?": "Automatische Synchronisierung aktivieren, wenn /var/log 90 % seiner Größe überschreitet?", "Enable fast reboots": "Schnelle Neustarts aktivieren", @@ -2118,6 +2183,7 @@ "Enter target disk (e.g. /dev/sdX):": "Geben Sie die Zielfestplatte ein (z. B. /dev/sdX):", "Enter target storage name (e.g., local-lvm):": "Geben Sie den Zielspeichernamen ein (z. B. local-lvm):", "Enter target storage:": "Zielspeicher eingeben:", + "Enter temporary folder path (default: %s):": "Pfad des temporären Ordners eingeben (Standard: %s):", "Enter the BORG REPOKEY passphrase for target:": "Geben Sie die BORG REPOKEY-Passphrase für das Ziel ein:", "Enter the Samba username:": "Geben Sie den Samba-Benutzernamen ein:", "Enter the VMID for the new VM:": "Geben Sie die VMID für die neue VM ein:", @@ -2144,6 +2210,7 @@ "Enterprise repository present": "Unternehmens-Repository vorhanden", "Enterprise repository returned 401 Unauthorized (no valid subscription). Switch to the no-subscription repository and retry?": "Das Unternehmens-Repository hat 401 Nicht autorisiert zurückgegeben (kein gültiges Abonnement). Zum Repository ohne Abonnement wechseln und es erneut versuchen?", "Enterprise repository unauthorized and fallback declined by user": "Unternehmens-Repository nicht autorisiert und Fallback vom Benutzer abgelehnt", + "Enterprise shares an APT stanza with other components. Split it in the Proxmox repository UI; no repository changed.": "Enterprise teilt sich einen APT-Abschnitt mit anderen Komponenten. Trennen Sie ihn in der Proxmox-Repository-Oberfläche; es wurde kein Repository geändert.", "Entropy generation optimization removed": "Optimierung der Entropieerzeugung entfernt", "Environment entry without an explicit value": "Umwelteintrag ohne expliziten Wert", "Environment override for an unknown service:": "Environment Override für einen unbekannten Dienst:", @@ -2153,6 +2220,7 @@ "Error": "Fehler", "Error applying patch. Backups preserved at": "Fehler beim Anwenden des Patches. Backups werden aufbewahrt unter", "Error details:": "Fehlerdetails:", + "Error generating UUP download list.": "Fehler beim Erstellen der UUP-Downloadliste.", "Error installing": "Fehler bei der Installation", "Error installing build dependencies. Check": "Fehler beim Installieren von Build-Abhängigkeiten. Überprüfen", "Error:": "Fehler:", @@ -2197,15 +2265,17 @@ "Execution engine for Index-TTS": "Ausführungsmaschine für Index-TTS", "Existing Groups": "Bestehende Gruppen", "Existing TLS certificate reused:": "Bestehendes TLS-Zertifikat wiederverwendet:", + "Existing ZRAM profile is active but does not match its configuration": "Das vorhandene ZRAM-Profil ist aktiv, entspricht aber nicht seiner Konfiguration", "Existing file, re-downloading...": "Vorhandene Datei, erneuter Download...", "Existing filesystem:": "Vorhandenes Dateisystem:", "Existing hostpci entries detected — they will be reused": "Vorhandene Hostpci-Einträge erkannt – sie werden wiederverwendet", "Existing key is at:": "Der vorhandene Schlüssel befindet sich unter:", "Existing recovery envelopes already on PBS stay intact — they still recover the old key with its original passphrase.": "Vorhandene Wiederherstellungsumschläge, die sich bereits auf PBS befinden, bleiben erhalten – sie stellen weiterhin den alten Schlüssel mit seiner ursprünglichen Passphrase wieder her.", "Existing zram0 configuration is not owned by ProxMenux": "Die vorhandene zram0-Konfiguration gehört nicht ProxMenux", - "Exit": "Ausfahrt", + "Exit": "Beenden", "Exit and repair manually": "Beenden und manuell reparieren", "Exit the container terminal:": "Verlassen Sie das Containerterminal:", + "Exit-Script": "Skript beenden", "Exit: Stop to create backup manually": "Beenden: Anhalten, um ein Backup manuell zu erstellen", "Exiting for manual repair...": "Wird zur manuellen Reparatur beendet...", "Expected /tmp/gasket-driver/src not found. The clone seems incomplete or uses an unknown layout.": "Erwartet, dass /tmp/gasket-driver/src nicht gefunden wurde. Der Klon scheint unvollständig zu sein oder verwendet ein unbekanntes Layout.", @@ -2282,7 +2352,11 @@ "Failed to add bind mount:": "Bind-Mount konnte nicht hinzugefügt werden:", "Failed to add iSCSI storage to Proxmox.": "iSCSI-Speicher konnte nicht zu Proxmox hinzugefügt werden.", "Failed to add storage to Proxmox.": "Das Hinzufügen von Speicher zu Proxmox ist fehlgeschlagen.", + "Failed to allocate virtual disk %s": "Virtueller Datenträger %s konnte nicht zugewiesen werden", "Failed to assign Controller/NVMe": "Controller/NVMe konnte nicht zugewiesen werden", + "Failed to assign disk %s (%s) on %s": "Datenträger %s (%s) konnte nicht auf %s zugewiesen werden", + "Failed to assign loader disk": "Loader-Datenträger konnte nicht zugewiesen werden", + "Failed to assign loader disk to ide0": "Loader-Datenträger konnte nicht ide0 zugewiesen werden", "Failed to assign virtual disk": "Die Zuweisung der virtuellen Festplatte ist fehlgeschlagen", "Failed to clone Lynis from GitHub": "Lynis konnte nicht von GitHub geklont werden", "Failed to clone log2ram repository. Check /tmp/log2ram_install.log": "Das Klonen des log2ram-Repositorys ist fehlgeschlagen. Überprüfen Sie /tmp/log2ram_install.log", @@ -2291,8 +2365,11 @@ "Failed to configure Proxmox Backup Server repositories": "Proxmox Backup Server-Repositorys konnten nicht konfiguriert werden", "Failed to configure Proxmox repositories": "Proxmox-Repositorys konnten nicht konfiguriert werden", "Failed to configure TPM device in VM": "Das TPM-Gerät konnte in der VM nicht konfiguriert werden", + "Failed to configure controller/NVMe: %s": "Controller/NVMe konnte nicht konfiguriert werden: %s", + "Failed to configure import disk %s as %s": "Importierter Datenträger %s konnte nicht als %s konfiguriert werden", "Failed to configure repositories.": "Die Repositorys konnten nicht konfiguriert werden.", "Failed to configure repositories. Installation aborted.": "Die Repositorys konnten nicht konfiguriert werden. Installation abgebrochen.", + "Failed to configure virtual disk as %s": "Virtueller Datenträger konnte nicht als %s konfiguriert werden", "Failed to connect to": "Es konnte keine Verbindung hergestellt werden", "Failed to connect to server.": "Verbindung zum Server fehlgeschlagen.", "Failed to copy sources into": "Quellen konnten nicht kopiert werden", @@ -2366,7 +2443,9 @@ "Failed to install intel-gpu-tools": "Intel-GPU-Tools konnten nicht installiert werden", "Failed to install libedgetpu1-std. Check": "Die Installation von libedgetpu1-std ist fehlgeschlagen. Überprüfen", "Failed to install pigz": "Pigz konnte nicht installiert werden", + "Failed to install unzip": "unzip konnte nicht installiert werden", "Failed to install zfs-auto-snapshot": "Die Installation von zfs-auto-snapshot ist fehlgeschlagen", + "Failed to install:": "Installation fehlgeschlagen:", "Failed to migrate the existing ProxMenux Bash configuration.": "Die vorhandene Bash-Konfiguration ProxMenux konnte nicht migriert werden.", "Failed to mount CIFS share on host.": "Die Bereitstellung der CIFS-Freigabe auf dem Host ist fehlgeschlagen.", "Failed to mount NFS share on host.": "Die Bereitstellung der NFS-Freigabe auf dem Host ist fehlgeschlagen.", @@ -2550,6 +2629,7 @@ "Full path": "Vollständiger Pfad", "Full report — complete SMART data (scrollable)": "Vollständiger Bericht – vollständige SMART-Daten (scrollbar)", "Full system upgrade, including dependencies": "Vollständiges System-Upgrade, einschließlich Abhängigkeiten", + "Function '%s' is not defined in the %s flow.": "Die Funktion '%s' ist im Ablauf %s nicht definiert.", "Function Level Reset (FLR) not available": "Function Level Reset (FLR) nicht verfügbar", "GID already in use:": "GID bereits verwendet:", "GID in CT": "GID im CT", @@ -2628,6 +2708,7 @@ "Generated Paperless administrator": "Generierter papierloser Administrator", "Generated Tandoor administrator": "Tandoor-Administrator generiert", "Generated administrator login": "Generierte Administrator-Login", + "Generated: {generated}; failed: {failed}; family: {provider}": "Erstellt: {generated}; fehlgeschlagen: {failed}; Familie: {provider}", "Generating OVF descriptor...": "OVF-Deskriptor wird generiert...", "Generating dkms.conf...": "dkms.conf wird generiert...", "Generating manifest...": "Manifest wird erstellt...", @@ -2639,6 +2720,9 @@ "Get the container's storage information:": "Rufen Sie die Speicherinformationen des Containers ab:", "Get up and running with large language models locally": "Aufstehen und Laufen mit großen Sprachmodellen lokal", "Git installed": "Git installiert", + "GitHub returned HTTP 403 for {url}. Set GITHUB_TOKEN to raise the API rate limit.": "GitHub hat HTTP 403 für {url} zurückgegeben. Setzen Sie GITHUB_TOKEN, um das API-Anfragelimit zu erhöhen.", + "GitHub returned HTTP {status} for {url}.": "GitHub hat HTTP {status} für {url} zurückgegeben.", + "GitHub returned a truncated tree for the CasaOS catalogue": "GitHub hat für den CasaOS-Katalog einen unvollständigen Baum zurückgegeben", "GitQlient is a multi-platform Git client originally forked from QGit. Nowadays it goes beyond of just a fork and adds a lot of new functionality.": "GitQlient ist eine Multi-Plattform Git-Client ursprünglich forked von QGit. Heutzutage geht es über nur einen fork hinaus und fügt viele neue Funktionen hinzu.", "Github Desktop is an open source Electron-based GitHub app. It is written in TypeScript and uses React.": "Github Desktop ist eine Open Source Electron-basierte GitHub App. Es ist in TypeScript geschrieben und verwendet React.", "Global settings and SSH jail configured": "Globale Einstellungen und SSH-Gefängnis konfiguriert", @@ -2691,6 +2775,7 @@ "HAOS One is a community image that runs Docker inside the container. The LXC stays unprivileged, but the inner AppArmor profiles may not be available. The first start downloads Home Assistant Core and its add-ons. If the check fails, the CT and /mnt/data are kept for diagnosis.": "HAOS One ist ein Community-Image, das Docker im Container ausführt. Der LXC bleibt unprivilegiert, aber die inneren AppArmor-Profile sind möglicherweise nicht verfügbar. Der erste Start lädt Home Assistant Core und seine Add-ons herunter. Wenn die Überprüfung fehlschlägt, werden die CT und / mnt / Daten zur Diagnose aufbewahrt.", "HAOS One profile declined": "HAOS One-Profil rückläufig", "HAOS One requires an unprivileged unmanaged LXC with nesting and keyctl, 2 cores, 2048 MB RAM, rootfs of at least 12 GB and /mnt/data of at least 16 GB on a container volume included in backups": "HAOS One requires ein unprivilegiertes unmanaged LXC mit Nesting und Keyctl, 2 Kernen, 2048 MB RAM, Rootfs von mindestens 12 GB und /mnt / Daten von mindestens 16 GB auf einem Containervolumen, das in Backups enthalten ist", + "HOSTNAME": "HOSTNAME", "HTML5 Network Speed Test Server.": "HTML5-Netzwerkgeschwindigkeitstestserver.", "HTTP service check without a saved URL": "HTTP Service Check ohne gespeicherte URL", "Habridge emulates Philips Hue API to other home automation gateways such as an Amazon Echo/Dot Gen 1 (gen 2 has issues discovering ha-bridge) or other systems that support Philips Hue. The Bridge handles basic commands such as On, Off and brightness commands of the hue protocol. This bridge can control most devices that have a distinct API.": "Habridge emuliert Philips Hue API zu anderen Home Automation Gateways wie einem Amazon Echo / Dot Gen 1 (Gen 2 hat Probleme bei der Erkennung von Ha-Bridge) oder anderen Systemen, die Philips Hue unterstützen. Die Bridge verarbeitet grundlegende Befehle wie Ein-, Aus- und Helligkeitsbefehle des Farbtonprotokolls. Diese Brücke kann die meisten Geräte mit einer bestimmten API steuern.", @@ -2786,6 +2871,7 @@ "Host device node": "Hostvorrichtungsknoten", "Host directories are not included in the backup and are not reverted by a recovery.": "Host-Verzeichnisse sind nicht im Backup enthalten und werden nicht durch eine Wiederherstellung rückgängig gemacht.", "Host directories are not included in the backups and are not reverted by a recovery.": "Host-Verzeichnisse sind nicht in den Backups enthalten und werden nicht durch eine Wiederherstellung rückgängig gemacht.", + "Host directories are not reverted by the backup (confirmed beforehand)": "Host-Verzeichnisse werden durch das Backup nicht zurückgesetzt (vorab bestätigt)", "Host directories cannot be included in vzdump": "Hostverzeichnisse können nicht in vzdump einbezogen werden", "Host directories cannot be part of the vzdump backup": "Hostverzeichnisse können nicht Teil des vzdump-Backups sein", "Host directories that are kept, with their content:": "Host-Verzeichnisse, die geführt werden, mit ihrem Inhalt:", @@ -2809,6 +2895,7 @@ "Host fstab NFS mounts (not registered with pvesm):": "Host-fstab-NFS-Mounts (nicht bei pvesm registriert):", "Host fstab NFS mounts:": "Host-fstab-NFS-Mounts:", "Host fstab mounts (not registered as Proxmox storage):": "Host-fstab-Mounts (nicht als Proxmox-Speicher registriert):", + "Host has an active subscription but no active {short} repository. Configure its Enterprise source in {ui}; no repository changed.": "Der Host hat ein aktives Abonnement, aber kein aktives {short}-Repository. Konfigurieren Sie dessen Enterprise-Quelle in {ui}; es wurde kein Repository geändert.", "Host identity (hostname, hosts)": "Hostidentität (Hostname, Hosts)", "Host kernel module loaded:": "Hostkernel-Modul geladen:", "Host monitor configured: shared PID and network namespaces, LXCFS disabled in this container": "Host-Monitor konfiguriert: freigegebene PID und Netzwerk-Namespaces, LXCFS in diesem Container deaktiviert", @@ -2838,6 +2925,7 @@ "Htpcmanager is a front end for many htpc related applications.": "Htpcmanager ist ein Frontend für viele htpc-bezogene Anwendungen.", "I have read this": "Ich habe das gelesen", "I/O priority configured": "E/A-Priorität konfiguriert", + "ID %s is already in use": "Die ID %s wird bereits verwendet", "ID already in use. Please choose another.": "ID bereits verwendet. Bitte wählen Sie eine andere.", "IGDB": "IGDB", "IGDB Client ID": "IGDB Client ID", @@ -2891,6 +2979,7 @@ "ISO image — installation images": "ISO-Image – Installationsimages", "ISO image downloaded": "ISO-Image heruntergeladen", "ISO not found to mount on device": "ISO zum Mounten auf dem Gerät nicht gefunden", + "Icons resolved: {resolved}; cleared: {cleared}; unchanged: {unchanged}; with a theme variant: {themed}": "Symbole aufgelöst: {resolved}; entfernt: {cleared}; unverändert: {unchanged}; mit Theme-Variante: {themed}", "Identical:": "Identisch:", "Identify candidate disk (never use system disk):": "Identifizieren Sie den Kandidatendatenträger (verwenden Sie niemals den Systemdatenträger):", "Identify persistent disk paths": "Identifizieren Sie persistente Festplattenpfade", @@ -2898,6 +2987,7 @@ "If Code 43 error appears, KVM hiding is already configured.": "Wenn der Fehler Code 43 auftritt, ist das KVM-Ausblenden bereits konfiguriert.", "If GUI does not load:": "Wenn die GUI nicht geladen wird:", "If ZFS errors occur:": "Wenn ZFS-Fehler auftreten:", + "If a newer application image is available, the container is stopped and backed up, and the backup integrity is verified. The container is then updated using the new image.\n\nIf the update fails after the container was changed, ProxMenux attempts to restore the previous installation from the backup. If the operation remains incomplete, select the application in OCI management and choose \"Recover the previous installation\".\n\nHost directories mounted in the container are not restored by the container backup.": "Wenn ein neueres Anwendungsimage verfügbar ist, wird der Container gestoppt und ein Backup erstellt, dessen Integrität überprüft wird. Anschließend wird der Container mit dem neuen Image aktualisiert.\n\nSchlägt das Update fehl, nachdem der Container verändert wurde, versucht ProxMenux, die vorherige Installation aus dem Backup wiederherzustellen. Bleibt der Vorgang unvollständig, wählen Sie die Anwendung in der OCI-Verwaltung aus und wählen Sie „Wiederherstellen der vorherigen Installation“.\n\nIn den Container eingehängte Host-Verzeichnisse werden durch das Backup des Containers nicht wiederhergestellt.", "If booting in EFI mode with root on LVM: install GRUB for EFI": "If booting in EFI mode with root on LVM: install GRUB for EFI", "If config issues occur:": "Wenn Konfigurationsprobleme auftreten:", "If container won't start:": "Wenn der Container nicht startet:", @@ -2955,6 +3045,7 @@ "Image selection was cancelled": "Die Image-Auswahl wurde abgebrochen", "Image that is not in the catalog": "Bild, das nicht im Katalog enthalten ist", "Image:": "Bild:", + "Images directory created: %s": "Images-Verzeichnis erstellt: %s", "Images to import:": "Zu importierende Bilder:", "Immich CUDA requires NVIDIA driver 545 or later": "Immich CUDA requires NVIDIA Treiber 545 oder höher", "Immich GPU profile not validated": "Immich GPU-Profil nicht validiert", @@ -2986,6 +3077,7 @@ "Imported:": "Importiert:", "Importing": "Importieren", "Importing disk": "Datenträger importieren", + "Importing loader disk:": "Loader-Datenträger wird importiert:", "Importing:": "Importieren:", "Improve log rotation and limit log size to save space and extend disk life": "Verbessern Sie die Protokollrotation und begrenzen Sie die Protokollgröße, um Platz zu sparen und die Lebensdauer der Festplatte zu verlängern", "In an LXC": "In einem LXC", @@ -3040,6 +3132,7 @@ "Independent LXC applications installed": "Unabhängige LXC-Anwendungen installiert", "Independent LXCs: no main container or hookscript. Each one keeps its own Start with Proxmox setting.": "Unabhängige LXCs: kein Hauptcontainer oder Hookscript. Jeder behält seinen eigenen Start mit Proxmox-Einstellung.", "Independent applications, without a main container.": "Unabhängige Anwendungen, ohne Hauptcontainer.", + "Index updated: {count} candidate applications": "Index aktualisiert: {count} Kandidatenanwendungen", "Indexers and quality profiles still need to be configured.": "Indexer und Qualitätsprofile müssen noch konfiguriert werden.", "Inherited retention:": "Geerbte Aufbewahrung:", "Inherited schedule:": "Geerbter Zeitplan:", @@ -3110,7 +3203,10 @@ "Install with: apt-get install open-iscsi": "Installieren mit: apt-get install open-iscsi", "Install/Update Coral TPU on Host": "Coral TPU auf dem Host installieren/aktualisieren", "Install/Update NVIDIA Drivers (Host + LXC)": "NVIDIA-Treiber installieren/aktualisieren (Host + LXC)", + "Install? [y/N]:": "Installieren? [y/N]:", "Installation Complete": "Installation abgeschlossen", + "Installation blocked:": "Installation blockiert:", + "Installation cancelled.": "Installation abgebrochen.", "Installation completed": "Installation abgeschlossen", "Installation completed.": "Installation abgeschlossen.", "Installation completed. Please reboot the server manually as soon as possible.": "Installation abgeschlossen. Bitte starten Sie den Server so schnell wie möglich manuell neu.", @@ -3124,6 +3220,7 @@ "Installed": "Installiert", "Installed at:": "Installiert unter:", "Installed components:": "Installierte Komponenten:", + "Installed unzip successfully.": "unzip wurde erfolgreich installiert.", "Installed:": "Installiert:", "Installer already downloaded and verified.": "Das Installationsprogramm wurde bereits heruntergeladen und überprüft.", "Installer copied to container.": "Installer in Container kopiert.", @@ -3165,6 +3262,7 @@ "Installing and configuring Figurine...": "Figur installieren und konfigurieren...", "Installing and configuring ZFS auto-snapshot...": "Installieren und Konfigurieren des automatischen ZFS-Snapshots...", "Installing build dependencies...": "Build-Abhängigkeiten werden installiert...", + "Installing dependencies:": "Abhängigkeiten werden installiert:", "Installing dependency:": "Abhängigkeit installieren:", "Installing essential Proxmox packages...": "Wichtige Proxmox-Pakete werden installiert...", "Installing gawk (required for OVF parsing)...": "Gawk wird installiert (erforderlich für OVF-Parsing) ...", @@ -3187,9 +3285,11 @@ "Installing the new image...": "Das neue Image installieren...", "Installing the new image:": "Installieren des neuen Images:", "Installing the stack startup hook...": "Installieren Sie den Stack Startup Hook ...", + "Installing unzip...": "unzip wird installiert...", "Installing zfs-auto-snapshot package...": "ZFS-Auto-Snapshot-Paket wird installiert...", "Installs essential packages if missing": "Installiert wichtige Pakete, falls diese fehlen", "Insufficient Disk Space": "Nicht genügend Speicherplatz", + "Insufficient disk space. Available:": "Nicht genügend Speicherplatz. Verfügbar:", "Insufficient disk space. Skipping LXC": "Nicht genügend Speicherplatz. LXC überspringen", "Insufficient memory. NVIDIA install aborted.": "Unzureichender Speicher. NVIDIA-Installation abgebrochen.", "Insufficient memory. Skipping LXC": "Unzureichender Speicher. LXC überspringen", @@ -3225,12 +3325,15 @@ "Interfaces to Remove": "Zu entfernende Schnittstellen", "Internal error: NVIDIA installer path is empty or file not found.": "Interner Fehler: Der NVIDIA-Installationspfad ist leer oder die Datei wurde nicht gefunden.", "Internal error: missing arguments in pmx_prepare_host_shared_dir": "Interner Fehler: fehlende Argumente in pmx_prepare_host_shared_dir", + "Internal installer operation; not legacy adoption": "Interner Installationsvorgang; keine Übernahme einer Altinstallation", "Internal subnet of the tunnel (change it only if it clashes)": "Internes Subnetz des Tunnels (ändern Sie es nur, wenn es kollidiert)", "Interrupted operation": "Unterbrochene operation", "Interrupted operation:": "Unterbrochene operation:", "Interrupted stack operation found": "Unterbrochener Stapel operation gefunden", "Invalid 'proxmox-ve' candidate (not 9.x or none). Please verify your repository configuration and network, then retry.": "Ungültiger „proxmox-ve“-Kandidat (nicht 9.x oder keiner). Bitte überprüfen Sie Ihre Repository-Konfiguration und Ihr Netzwerk und versuchen Sie es dann erneut.", "Invalid ALLOWED_HOSTS value": "Ungültiger Wert für ALLOWED_HOSTS", + "Invalid Compose port:": "Ungültiger Compose-Port:", + "Invalid Compose volume path:": "Ungültiger Compose-Volume-Pfad:", "Invalid Home Assistant OS check timeout": "Invalid Home Assistant OS Check Timeout", "Invalid ID": "Ungültige ID", "Invalid IPv4 address": "Ungültige IPv4-Adresse", @@ -3266,6 +3369,7 @@ "Invalid action": "Ungültige Aktion", "Invalid administrator email": "E-Mail des ungültigen Administrators", "Invalid administrator user name": "Ungültiger Administrator Benutzername", + "Invalid application identifier:": "Ungültige Anwendungskennung:", "Invalid base VMID": "Ungültige Basis VMID", "Invalid bridge": "Ungültige Bridge", "Invalid check package:": "Ungültiges Kontrollpaket:", @@ -3397,7 +3501,9 @@ "JSON output for scripts": "JSON-Ausgabe für Skripte", "Jackett works as a proxy server: it translates queries from apps (Sonarr, SickRage, CouchPotato, Mylar, etc) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software. This allows for getting recent uploads (like RSS) and performing searches. Jackett is a single repository of maintained indexer scraping & translation logic - removing the burden from other apps.": "Jackett arbeitet als Proxy-Server: Er übersetzt Abfragen von Apps (Sonarr, SickRage, CouchPotato, Mylar usw.) in Tracker-Site-spezifische http-Abfragen, analysiert die HTML-Antwort und sendet dann Ergebnisse an die anfordernde Software zurück. Dies ermöglicht es, aktuelle Uploads (wie RSS) zu erhalten und Suchen durchzuführen. Jackett ist ein einziges Repository für gepflegte Indexer-Scraping- und Übersetzungslogik, das die Belastung anderer Apps beseitigt.", "Jellyfin WebUI": "Jellyfin WebUI", + "Jellyfin configuration already applied:": "Jellyfin-Konfiguration bereits angewendet:", "Jellyfin configuration applied:": "Jellyfin-Konfiguration angewendet:", + "Jellyfin configuration updated:": "Jellyfin-Konfiguration aktualisiert:", "Jellyfin did not create encoding.xml before the timeout": "Jellyfin hat coding.xml nicht vor dem Timeout erstellt", "Jellyfin has not created encoding.xml in any declared path": "Jellyfin hat coding.xml in keinem deklarierten Pfad erstellt", "Jellyseerr is a free and open source software application for managing requests for your media library.": "Jellyseerr ist eine kostenlose Open-Source-Softwareanwendung zur Verwaltung von Anfragen für Ihre Medienbibliothek.", @@ -3440,6 +3546,7 @@ "Keep current version (N)": "Aktuelle Version behalten (N)", "Keep current version (N) if modified": "Bei Änderungen die aktuelle Version (N) beibehalten", "Keep in source VM(s) + disable onboot + add to target VM": "In Quell-VM(s) behalten + Onboot deaktivieren + zur Ziel-VM hinzufügen", + "Keep the backup taken before the update in this Proxmox storage": "Das vor dem Update erstellte Backup in diesem Proxmox-Speicher behalten", "Keeping GPU in source VM config": "GPU in der Quell-VM-Konfiguration belassen", "Keeping the settings changed in Proxmox:": "Die Einstellungen in Proxmox ändern:", "Kept sharedfiles group (has regular users assigned).": "Sharedfiles-Gruppe beibehalten (mit regulären Benutzern).", @@ -3506,6 +3613,7 @@ "Language Change": "Sprachwechsel", "Language changed to": "Sprache geändert zu", "Language/locale (e.g. es_ES.UTF-8; translation of every application is not guaranteed)": "Sprache/Local (z. B. es ES.UTF-8; Übersetzung jeder Anwendung ist nicht garantiert)", + "Language:": "Sprache:", "Last 50 kernel log lines": "Letzte 50 Kernel-Protokollzeilen", "Last run:": "Letzte Ausführung:", "Last system boot time": "Letzte Systemstartzeit", @@ -3525,6 +3633,7 @@ "Let's review your current network configuration.": "Lassen Sie uns Ihre aktuelle Netzwerkkonfiguration überprüfen.", "Liberate your videos and unleash infinite possibilities.": "Befreie deine Videos und entfessele unendliche Möglichkeiten.", "Libraries: /data/media/movies, /data/media/series and /data/media/music. Select them in the media server.": "Bibliotheken: /data/media/movies, /data/media/series und /data/media/music. Wählen Sie diese im Media Server aus.", + "Library": "Bibliothek", "Library size in GB": "Bibliotheksgröße in GB", "LibreDB Studio": "LibreDB Studio", "LibreOffice is a free and powerful office suite, and a successor to OpenOffice.org (commonly known as OpenOffice). Its clean interface and feature-rich tools help you unleash your creativity and enhance your productivity.": "LibreOffice ist eine kostenlose und leistungsstarke Office-Suite und ein Nachfolger von OpenOffice.org (allgemein bekannt als OpenOffice). Die saubere Benutzeroberfläche und die funktionsreichen Tools helfen Ihnen, Ihre Kreativität zu entfalten und Ihre Produktivität zu steigern.", @@ -3553,6 +3662,7 @@ "List all containers to identify the privileged one:": "Listen Sie alle Container auf, um den privilegierten Container zu identifizieren:", "List all containers to identify the unprivileged one:": "Listen Sie alle Container auf, um den unprivilegierten zu identifizieren:", "List all virtual machines": "Listen Sie alle virtuellen Maschinen auf", + "List applications": "Anwendungen auflisten", "List backups in a specific storage": "Listen Sie Backups in einem bestimmten Speicher auf", "List block devices and partitions": "Blockgeräte und Partitionen auflisten", "List configured storages:": "Konfigurierte Speicher auflisten:", @@ -3568,6 +3678,13 @@ "Listening ports:": "Abhörports:", "Listing relevant CT users and their mapped UID/GID on host...": "Auflistung relevanter CT-Benutzer und ihrer zugeordneten UID/GID auf dem Host ...", "Load and verify the WireGuard module on the Proxmox host": "Laden und Verifizieren des WireGuard-Moduls auf dem Proxmox-Host", + "Loader": "Loader", + "Loader configured as boot device.": "Loader als Startgerät konfiguriert.", + "Loader import failed. No disk detected in config.": "Import des Loaders fehlgeschlagen. Kein Datenträger in der Konfiguration erkannt.", + "Loader import failed. No disk detected.": "Import des Loaders fehlgeschlagen. Kein Datenträger erkannt.", + "Loader imported successfully to %s": "Loader erfolgreich nach %s importiert", + "Loader storage selection failed or was cancelled.": "Die Auswahl des Loader-Speichers ist fehlgeschlagen oder wurde abgebrochen.", + "Loader:": "Loader:", "Loading modules...": "Module werden geladen...", "Loading the Helper-Scripts catalog...": "Helper-Scripts-Katalog wird geladen...", "Loading the host kernel module:": "Laden des Hostkernel-Moduls:", @@ -3631,16 +3748,20 @@ "Lyrion Music Server is a streaming audio server for Squeezebox audio players.": "Lyrion Music Server ist ein Streaming-Audioserver für Squeezebox-Audioplayer.", "M.2 / PCIe devices:": "M.2 / PCIe-Geräte:", "M3U proxy server": "M3U Proxy-Server", + "MAC ADDRESS": "MAC-ADRESSE", "MAC Address": "MAC-Adresse", "MAC address": "MAC-Adresse", "MACHINE TYPE": "MASCHINENTYP", "MAME is a free and open-source emulator designed to emulate the hardware of arcade games, video game consoles, old computers and other systems in software on modern personal computers.": "MAME ist ein kostenloser und Open-Source-Emulator, der entwickelt wurde, um die Hardware von Arcade-Spielen, Videospielkonsolen, alten Computern und anderen Systemen in Software auf modernen PCs zu emulieren.", "MOTD configuration updated successfully": "MOTD-Konfiguration erfolgreich aktualisiert", "MOTD configuration was already up to date": "Die MOTD-Konfiguration war bereits auf dem neuesten Stand", + "MTU SIZE": "MTU-GRÖSSE", "Machine Type": "Maschinentyp", + "Machine i440fx": "Maschine i440fx", "Machine learning": "Maschinelles Lernen", "Machine learning container prepared": "Container für maschinelles Lernen vorbereitet", "Machine learning profile not implemented; it is not replaced by CPU:": "Machine Learning-Profil nicht implementiert; es wird nicht durch CPU ersetzt:", + "Machine q35": "Maschine q35", "Machine type: q35": "Maschinentyp: q35", "Machine: q35": "Maschine: q35", "Main endpoint not yet defined": "Hauptendpunkt noch nicht definiert", @@ -4086,6 +4207,7 @@ "No Changes Needed": "Keine Änderungen erforderlich", "No Cleanup Needed": "Keine Reinigung erforderlich", "No Compose file was given": "Keine Compose-Datei wurde angegeben", + "No Compose files were found in the CasaOS catalogue": "Im CasaOS-Katalog wurden keine Compose-Dateien gefunden", "No Controller/NVMe selected for now.": "Derzeit ist kein Controller/NVMe ausgewählt.", "No Coral Detected": "Kein Coral erkannt", "No Coral TPU device was found on this host (neither PCIe/M.2 nor USB).": "Auf diesem Host wurde kein Coral TPU-Gerät gefunden (weder PCIe/M.2 noch USB).", @@ -4179,6 +4301,7 @@ "No accessible Samba servers found.": "Keine erreichbaren Samba-Server gefunden.", "No accessible exports found.": "Keine zugänglichen Exporte gefunden.", "No accessible shares found.": "Keine zugänglichen Freigaben gefunden.", + "No active Debian base repository for this suite; configure it in the Proxmox repository UI before continuing.": "Kein aktives Debian-Basis-Repository für diese Suite; konfigurieren Sie es in der Proxmox-Repository-Oberfläche, bevor Sie fortfahren.", "No active Proxmox storage accepts OCI template archives.": "Kein aktiver Proxmox-Speicher akzeptiert OCI-Vorlagenarchive.", "No active exports or showmount not available": "Keine aktiven Exporte oder Showmount nicht verfügbar", "No active session": "Keine aktive Sitzung", @@ -4208,12 +4331,14 @@ "No compatible GPUs were detected on this host.": "Auf diesem Host wurden keine kompatiblen GPUs erkannt.", "No compatible PVE jobs": "Keine kompatiblen PVE-Jobs", "No compatible disk images found in:": "Keine kompatiblen Disk-Images gefunden in:", + "No compatible images found in %s\n\nSupported formats: .img, .iso, .qcow2, .vmdk\n\nPlease add some images and try again.": "Keine kompatiblen Images in %s gefunden\n\nUnterstützte Formate: .img, .iso, .qcow2, .vmdk\n\nBitte fügen Sie Images hinzu und versuchen Sie es erneut.", "No configuration issues found": "Es wurden keine Konfigurationsprobleme gefunden", "No container of the stack was modified.": "Es wurde kein Behälter des Stapels verändert.", "No container runtime available.": "Keine Containerlaufzeit verfügbar.", "No container selected. Exiting.": "Kein Container ausgewählt. Verlassen.", "No controller/NVMe selected.": "Kein Controller/NVMe ausgewählt.", "No controllers remaining after conflict resolution.": "Nach der Konfliktlösung sind keine Verantwortlichen mehr übrig.", + "No custom image selected": "Kein benutzerdefiniertes Image ausgewählt", "No custom key (rely on default SSH config)": "Kein benutzerdefinierter Schlüssel (verlassen Sie sich auf die Standard-SSH-Konfiguration)", "No custom logos were found in /usr/local/share/fastfetch/logos/.\n\nPlease add a logo and try again.": "In /usr/local/share/fastfetch/logos/ wurden keine benutzerdefinierten Logos gefunden.\n\nBitte fügen Sie ein Logo hinzu und versuchen Sie es erneut.", "No desktop UI backup found, will reinstall packages": "Es wurde keine Sicherung der Desktop-Benutzeroberfläche gefunden. Die Pakete werden neu installiert", @@ -4226,6 +4351,7 @@ "No disks were added.": "Es wurden keine Datenträger hinzugefügt.", "No disks were configured for processing.": "Es wurden keine Datenträger für die Verarbeitung konfiguriert.", "No disks were selected.": "Es wurden keine Datenträger ausgewählt.", + "No disks/controllers configured.": "Keine Datenträger/Controller konfiguriert.", "No docker run command was given": "Es wurde kein docker-run-Befehl angegeben", "No duplicate IP addresses": "Keine doppelten IP-Adressen", "No duplicate repositories found": "Keine doppelten Repositorys gefunden", @@ -4331,6 +4457,7 @@ "No supported NVIDIA versions found for this GPU": "Für diese GPU wurden keine unterstützten NVIDIA-Versionen gefunden", "No sysfs ROM entry — trying ACPI VFCT table...": "Kein sysfs-ROM-Eintrag – versuchen Sie es mit der ACPI-VFCT-Tabelle ...", "No target configured.": "Kein Ziel konfiguriert.", + "No template is available for '{app_id}'": "Für '{app_id}' ist keine Vorlage verfügbar", "No test currently running": "Derzeit läuft kein Test", "No unambiguous loader download found in release metadata.": "In den Release-Metadaten wurde kein eindeutiger Loader-Download gefunden.", "No uninstaller found for:": "Kein Deinstallationsprogramm gefunden für:", @@ -4472,6 +4599,7 @@ "Only one service at a time can be installed this way.": "Auf diese Weise kann jeweils nur ein Dienst installiert werden.", "Only removes storage definition, not remote data.": "Entfernt nur die Speicherdefinition, keine Remote-Daten.", "Only run this if you used LVM (step 6b):": "Führen Sie dies nur aus, wenn Sie LVM verwendet haben (Schritt 6b):", + "Only the applications that need no question: the ones the cluster keeps a record of": "Nur die Anwendungen, die keine Rückfrage benötigen: diejenigen, über die der Cluster einen Datensatz führt", "Only the host backup hook is removed — PVE vzdump jobs targeting this storage stay intact.": "Nur der Host-Backup-Hook wird entfernt – PVE-vzdump-Jobs, die auf diesen Speicher abzielen, bleiben intakt.", "Only the image reference, with no Compose file": "Nur die Bildreferenz, ohne Compose-Datei", "Only the update of the image runs unattended.": "Nur die Aktualisierung des Bildes läuft unbeaufsichtigt.", @@ -4485,6 +4613,7 @@ "Open the VM console and wait for the loader to boot": "Öffnen Sie die VM-Konsole und warten Sie, bis der Loader startet", "Open the dashboard from this host on port 8008 to create a new admin account.": "Öffnen Sie das Dashboard von diesem Host auf Port 8008, um ein neues Administratorkonto zu erstellen.", "Open the dashboard to create a new admin account:": "Öffnen Sie das Dashboard, um ein neues Administratorkonto zu erstellen:", + "Open the page of an application in the menu": "Die Seite einer Anwendung im Menü öffnen", "Open-source AI-powered coding assistant": "Open-Source AI-powered Coding Assistant", "Open-source UI for building and debugging multi-agent and RAG applications": "Open-Source-Benutzeroberfläche zum Erstellen und Debuggen von Multi-Agenten- und RAG-Anwendungen", "Open-source self-hosted SQL IDE.": "Open-Source selbst gehostete SQL IDE.", @@ -4803,6 +4932,7 @@ "Press ENTER to continue...": "Drücken Sie ENTER, um fortzufahren...", "Press ENTER to return to the menu...": "Drücken Sie ENTER, um zum Menü zurückzukehren...", "Press ENTER to return...": "Drücken Sie ENTER, um zurückzukehren...", + "Press Enter to close this terminal...": "Drücken Sie die Eingabetaste, um dieses Terminal zu schließen...", "Press Enter to close...": "Drücken Sie die Eingabetaste, um zu schließen...", "Press Enter to continue": "Drücken Sie die Eingabetaste, um fortzufahren", "Press Enter to continue...": "Drücken Sie die Eingabetaste, um fortzufahren...", @@ -4884,6 +5014,7 @@ "ProxMenux Monitor protection": "ProxMenux Monitorschutz", "ProxMenux Monitor unit repaired and restarted": "ProxMenux Monitor-Einheit repariert und neu gestartet", "ProxMenux Monitor → Backups tab (live progress card with estimated time, logs, rollback delta)": "ProxMenux Monitor → Registerkarte „Backups“ (Live-Fortschrittskarte mit geschätzter Zeit, Protokollen, Rollback-Delta)", + "ProxMenux OCI manager Apps (Technology Preview)": "ProxMenux OCI manager Apps (Technology Preview)", "ProxMenux attaches directories, not single files, so this image cannot be installed yet.": "ProxMenux verbindet Verzeichnisse, nicht einzelne Dateien, so dass dieses Bild noch nicht installiert werden kann.", "ProxMenux can apply open permissions on this NFS directory from the host so the container can read and write:": "ProxMenux kann vom Host aus Öffnungsberechtigungen für dieses NFS-Verzeichnis anwenden, sodass der Container lesen und schreiben kann:", "ProxMenux can remount it with open permissions so any LXC can read and write.": "ProxMenux kann es mit offenen Berechtigungen erneut bereitstellen, sodass jeder LXC lesen und schreiben kann.", @@ -4903,9 +5034,13 @@ "Proxmology logo applied": "Proxmology-Logo angewendet", "Proxmox 9 system update allready": "Proxmox 9 Systemupdate bereits", "Proxmox APT repositories configured": "Proxmox APT-Repositorys konfiguriert", + "Proxmox APT repository inventory is invalid or reports parse errors. Fix sources in {ui}; no repository changed.": "Das Proxmox-APT-Repository-Inventar ist ungültig oder meldet Parse-Fehler. Korrigieren Sie die Quellen in {ui}; es wurde kein Repository geändert.", "Proxmox Backup Server": "Proxmox Backup Server", "Proxmox Backup Server (PBS) destinations": "Proxmox Backup Server (PBS)-Ziele", "Proxmox Backup Server APT repositories configured": "Proxmox Backup Server APT-Repositorys konfiguriert", + "Proxmox Backup Server Microcode": "Proxmox Backup Server Microcode", + "Proxmox Backup Server Post Install": "Proxmox Backup Server Post-Install", + "Proxmox Backup Server Subscription Banner Removal": "Entfernung des Abonnementbanners für Proxmox Backup Server", "Proxmox Backup Server Update": "Aktualisierung von Proxmox Backup Server", "Proxmox Backup Server update completed.": "Aktualisierung von Proxmox Backup Server abgeschlossen.", "Proxmox CIFS Storage Status:": "Proxmox CIFS-Speicherstatus:", @@ -4927,6 +5062,7 @@ "Proxmox iSCSI Storage Status:": "Proxmox iSCSI-Speicherstatus:", "Proxmox jail configured": "Proxmox-Jail konfiguriert", "Proxmox local storages:": "Lokale Proxmox-Speicher:", + "Proxmox no-subscription standard repository handle unavailable; no repository changed.": "Das Handle des Standard-Repositorys no-subscription von Proxmox ist nicht verfügbar; es wurde kein Repository geändert.", "Proxmox repository": "Proxmox-Repository", "Proxmox repository OK (candidate is 9.x)": "Proxmox-Repository OK (Kandidat ist 9.x)", "Proxmox repository configuration completed": "Konfiguration des Proxmox-Repositorys abgeschlossen", @@ -4994,6 +5130,7 @@ "Rclone mount needs a privileged LXC with FUSE access. The container is dedicated to Rclone and its web UI must not be exposed to untrusted networks.": "Rclone Mount benötigt einen privilegierten LXC mit FUSE-Zugang. Der Container ist Rclone gewidmet und seine Web-Benutzeroberfläche darf nicht nicht vertrauenswürdigen Netzwerken ausgesetzt sein.", "Rclone mount requires a privileged LXC with FUSE access. Use this profile only on a trusted node and network.": "Rclone Mount requires eine privilegierte LXC mit FUSE-Zugang. Verwenden Sie dieses Profil nur auf einem vertrauenswürdigen Knoten und Netzwerk.", "Rclone mount requires a privileged container": "Rclone Mount requires ein privilegierter Container", + "Rclone remote": "Rclone-Remote", "Re-enter the BORG REPOKEY passphrase to confirm:": "Geben Sie die BORG REPOKEY-Passphrase erneut ein, um zu bestätigen:", "Re-running pre-check after repairs...": "Nach der Reparatur wird die Vorkontrolle erneut durchgeführt...", "Reachable": "Erreichbar", @@ -5017,6 +5154,7 @@ "Reading SMART self-test log...": "SMART-Selbsttestprotokoll wird gelesen...", "Reading full SMART report...": "Vollständigen SMART-Bericht lesen...", "Reading image metadata. Please wait...": "Bildmetadaten lesen. Bitte warten...", + "Ready to create a %s?": "Bereit, %s zu erstellen?", "Real-time Performance Monitoring": "Echtzeit-Leistungsüberwachung", "Real-time bandwidth usage (press q to exit)": "Echtzeit-Bandbreitennutzung (zum Beenden q drücken)", "Real-time collaborative document editor": "Echtzeit-Collaborative Document Editor", @@ -5099,15 +5237,19 @@ "Recreation prepared": "Erholung vorbereitet", "Refresh APT index and verify repositories:": "APT-Index aktualisieren und Repositorys überprüfen:", "Refresh the configured APT repositories and review the PBS package upgrade? Repository files will be preserved.": "Die konfigurierten APT-Repositories aktualisieren und die PBS-Paketaktualisierung prüfen? Repository-Dateien bleiben erhalten.", + "Refresh the index from the image sources": "Den Index aus den Image-Quellen aktualisieren", "Refresh token of the connector, from the Twingate admin console": "Aktualisierungstoken des Connectors aus der Twingate-Verwaltungskonsole", "Refresh your browser (Ctrl+Shift+R) to see changes": "Aktualisieren Sie Ihren Browser (Strg+Umschalt+R), um die Änderungen anzuzeigen", "Refresh your browser to see changes (server restart may be required)": "Aktualisieren Sie Ihren Browser, um Änderungen zu sehen (möglicherweise ist ein Neustart des Servers erforderlich).", "Refreshing apt cache...": "Apt-Cache wird aktualisiert...", "Refreshing the NVIDIA runtime...": "Erfrischung der NVIDIA Runtime...", "Refusing an unexpected rootfs path:": "Ablehnung eines unerwarteten Rootfs-Pfades:", + "Regenerate the catalog templates": "Die Katalogvorlagen neu erstellen", + "Regenerate the template of one application": "Die Vorlage einer Anwendung neu erstellen", "Regenerating PVE package cache...": "Der PVE-Paket-Cache wird neu generiert...", "Regenerating boot artifacts for the merged kernel-agnostic changes...": "Boot-Artefakte für die zusammengeführten Kernel-agnostischen Änderungen werden neu generiert ...", "Regenerating certificates and restarting services...": "Zertifikate werden neu generiert und Dienste neu gestartet...", + "Register again the OCI applications restored from a backup": "Die aus einem Backup wiederhergestellten OCI-Anwendungen erneut registrieren", "Register mount path in Proxmox:": "Mount-Pfad in Proxmox registrieren:", "Registering disk as Proxmox storage...": "Festplatte als Proxmox-Speicher registrieren...", "Registering module with DKMS...": "Modul bei DKMS registrieren...", @@ -5294,6 +5436,7 @@ "Resetting time synchronization...": "Zeitsynchronisierung wird zurückgesetzt...", "Residual Bookworm entries commented where applicable": "Verbleibende Bücherwurm-Einträge ggf. kommentiert", "Resilio-sync (formerly BitTorrent Sync) uses the BitTorrent protocol to sync files and folders between all of your devices. There are both free and paid versions, this container supports both. There is an official sync image but we created this one as it supports user mapping to simplify permissions for volumes.": "Resilio-sync (ehemals BitTorrent Sync) verwendet das BitTorrent-Protokoll, um Dateien und Ordner zwischen allen Ihren Geräten zu synchronisieren. Es gibt sowohl kostenlose als auch kostenpflichtige Versionen, dieser Container unterstützt beide. Es gibt ein offizielles Synchronisierungsbild, aber wir haben dieses erstellt, da es die Benutzerzuordnung unterstützt, um Berechtigungen für Volumes zu vereinfachen.", + "Resolve catalog icons against the jsdelivr icon sets": "Katalogsymbole anhand der jsdelivr-Symbolsätze auflösen", "Resolve package conflicts": "Paketkonflikte lösen", "Resources": "Ressourcen", "Restart Network": "Netzwerk neu starten", @@ -5352,6 +5495,7 @@ "Results:": "Ergebnisse:", "Retention": "Zurückbehaltung", "Retention policy (prune-backups syntax).": "Aufbewahrungsrichtlinie (Prune-Backups-Syntax).", + "Retrieving the URL for the %s loader": "URL für den Loader %s wird abgerufen", "RetroArch is a frontend for emulators, game engines and media players. It enables you to run classic games on a wide range of computers and consoles through its slick graphical interface.": "RetroArch ist ein Frontend für Emulatoren, Game Engines und Media Player. Es ermöglicht Ihnen, klassische Spiele auf einer Vielzahl von Computern und Konsolen durch seine glatte grafische Oberfläche laufen.", "Return": "Zurückkehren", "Return to Main Menu": "Zurück zum Hauptmenü", @@ -5431,6 +5575,9 @@ "SCSI (recommended for Linux)": "SCSI (empfohlen für Linux)", "SECURITY CONSIDERATIONS:": "SICHERHEITSÜBERLEGUNGEN:", "SECURITY WARNING:": "SICHERHEITSHINWEIS:", + "SELECT CUSTOM IMAGE": "BENUTZERDEFINIERTES IMAGE AUSWÄHLEN", + "SELECT LOADER": "LOADER AUSWÄHLEN", + "SETTINGS": "EINSTELLUNGEN", "SMART Action": "SMART-Aktion", "SMART Disk Health & Test": "SMART-Festplattenstatus und -test", "SMART health status: PASSED": "SMART-Gesundheitsstatus: BESTANDEN", @@ -5456,6 +5603,7 @@ "SSH protection (aggressive mode)": "SSH-Schutz (aggressiver Modus)", "STEP 6: Choose commands based on your storage type": "SCHRITT 6: Wählen Sie Befehle basierend auf Ihrem Speichertyp aus", "STEP 9: Cleanup (LVM only)": "SCHRITT 9: Bereinigung (nur LVM)", + "STORAGE PLAN": "SPEICHERPLAN", "STORAGE TYPE IDENTIFICATION:": "IDENTIFIZIERUNG DES SPEICHERTYPS:", "SUGGESTION FOR": "VORSCHLAG FÜR", "SWAG serves HTTPS on port 443. Plain HTTP on port 80 is disabled in /config/nginx/site-confs/default.conf.": "SWAG dient HTTPS auf Port 443. HTTP auf Port 80 ist deaktiviert in /config/nginx/site-confs/default.conf.", @@ -5536,6 +5684,7 @@ "Scheduled backup job created": "Geplanter Sicherungsauftrag erstellt", "Scheduled backup jobs": "Geplante Sicherungsjobs", "Scheduled backups and retention policies": "Geplante Backups und Aufbewahrungsrichtlinien", + "Scheduled run: no questions; stops where a person has to decide": "Geplante Ausführung: keine Rückfragen; hält dort an, wo eine Person entscheiden muss", "Scheduled tasks (cron)": "Geplante Aufgaben (cron)", "Scheduler script not found:": "Scheduler-Skript nicht gefunden:", "ScreenScraper": "ScreenScraper", @@ -5545,6 +5694,7 @@ "Script not found:": "Skript nicht gefunden:", "Scripts in": "Skripte in", "ScummVM is a program which allows you to run certain classic graphical adventure and role-playing games, provided you already have their data files. The clever part about this: ScummVM just replaces the executables shipped with the games, allowing you to play them on systems for which they were never designed! ScummVM is a complete rewrite of these games' executables and is not an emulator.": "ScummVM ist ein Programm, mit dem Sie bestimmte klassische grafische Abenteuer- und Rollenspiele ausführen können, sofern Sie bereits über deren Datendateien verfügen. Der clevere Teil dabei: ScummVM ersetzt nur die ausführbaren Dateien, die mit den Spielen ausgeliefert werden, so dass Sie sie auf Systemen spielen können, für die sie nie entwickelt wurden! ScummVM ist ein komplettes Umschreiben der ausführbaren Dateien dieser Spiele und kein Emulator.", + "SeaBIOS (Legacy)": "SeaBIOS (Legacy)", "Sealskin is a self-hosted, client-server platform that enables users to run powerful, containerized desktop applications streamed directly to a web browser. It uses a browser extension to intercept user actions—such as clicking a link or downloading a file and redirects them to a secure, isolated application environment running on a remote server.": "Sealskin ist eine selbst gehostete Client-Server-Plattform, mit der Benutzer leistungsstarke, containerisierte Desktop-Anwendungen ausführen können, die direkt in einen Webbrowser gestreamt werden. Es verwendet eine Browsererweiterung, um Benutzeraktionen abzufangen - wie das Klicken auf einen Link oder das Herunterladen einer Datei und leitet sie in eine sichere, isolierte Anwendungsumgebung um, die auf einem entfernten Server ausgeführt wird.", "Search": "Suchen", "Search Results for:": "Suchergebnisse für:", @@ -5730,6 +5880,7 @@ "Selected GPU(s)": "Ausgewählte GPU(s)", "Selected GPU(s):": "Ausgewählte GPU(s):", "Selected LXC action": "Ausgewählte LXC-Aktion", + "Selected Loader:": "Ausgewählter Loader:", "Selected VM": "Ausgewählte VM", "Selected VM action": "Ausgewählte VM-Aktion", "Selected bridge:": "Ausgewählte Brücke:", @@ -5895,6 +6046,7 @@ "Show standard exclude patterns": "Standard-Ausschlussmuster anzeigen", "Show status of all storage pools": "Status aller Speicherpools anzeigen", "Show the QR code of a peer again with: pct exec -- /app/show-peer 1": "Zeigen Sie den QR-Code eines Peers erneut mit: pct exec -- /app/show-peer 1", + "Show the summary of a template": "Die Zusammenfassung einer Vorlage anzeigen", "Show traffic statistics per interface": "Verkehrsstatistiken pro Schnittstelle anzeigen", "Show vzdump backup configuration": "vzdump-Sicherungskonfiguration anzeigen", "Shows status and type (nfs/cifs/dir/iscsi...).": "Zeigt Status und Typ an (nfs/cifs/dir/iscsi...).", @@ -6001,6 +6153,7 @@ "Start VM": "Starten Sie die VM", "Start VM after creation": "Starten Sie die VM nach der Erstellung", "Start VM after creation?": "VM nach Erstellung starten?", + "Start VM when completed:": "VM nach Abschluss starten:", "Start a container. Use the correct ": "Starten Sie einen Container. Verwenden Sie die richtige ", "Start a virtual machine. Use the correct ": "Starten Sie eine virtuelle Maschine. Verwenden Sie die richtige ", "Start each LXC with Proxmox (no coordinated startup)": "Starten Sie jeden LXC mit Proxmox (kein koordiniertes Starten)", @@ -6030,6 +6183,7 @@ "Starting": "Beginn", "Starting Borg backup...": "Borg-Backup wird gestartet...", "Starting CT": "CT starten", + "Starting ISO conversion...": "ISO-Konvertierung wird gestartet...", "Starting LXC Privileged to Unprivileged conversion process...": "Der Konvertierungsprozess von LXC Privileged zu Unprivileged wird gestartet ...", "Starting LXC Unprivileged to Privileged conversion process...": "Der Konvertierungsprozess von LXC Unprivileged zu Privileged wird gestartet ...", "Starting NVIDIA installer. This may take several minutes...": "NVIDIA-Installationsprogramm starten. Dies kann einige Minuten dauern...", @@ -6137,6 +6291,7 @@ "Subscription banner removal failed": "Das Entfernen des Abonnementbanners ist fehlgeschlagen", "Subscription banner removed successfully": "Das Abonnementbanner wurde erfolgreich entfernt", "Subscription banner restored successfully (desktop and mobile)": "Abonnementbanner erfolgreich wiederhergestellt (Desktop und Mobilgerät)", + "Subscription status is not unambiguously active, notfound or expired. Check proxmox-backup-manager subscription get locally; no repository changed.": "Der Abonnementstatus ist nicht eindeutig active, notfound oder expired. Prüfen Sie proxmox-backup-manager subscription get lokal; es wurde kein Repository geändert.", "Success": "Erfolg", "Successful": "Erfolgreich", "Supervisor does not confirm healthy and supported yet": "Supervisor bestätigt nicht gesund und unterstützt noch", @@ -6164,6 +6319,7 @@ "Synchronize time automatically": "Zeit automatisch synchronisieren", "Synclounge is a third party tool that allows you to watch Plex in sync with your friends/family, wherever you are.": "Synclounge ist ein Drittanbieter-Tool, mit dem Sie Plex synchron mit Ihren Freunden / Ihrer Familie ansehen können, wo auch immer Sie sind.", "Syncthing replaces proprietary sync and cloud services with something open, trustworthy and decentralized. Your data is your data alone and you deserve to choose where it is stored, if it is shared with some third party and how it's transmitted over the Internet.": "Syncthing ersetzt proprietäre Sync- und Cloud-Dienste durch etwas Offenes, Vertrauenswürdiges und Dezentralisiertes. Ihre Daten sind Ihre Daten allein und Sie verdienen es zu wählen, wo sie gespeichert werden, ob sie mit Dritten geteilt werden und wie sie über das Internet übertragen werden.", + "Synology VM Creator": "Synology VM Creator", "Sysctl not namespaced or not valid:": "Sysctl nicht namespaced oder nicht gültig:", "System": "System", "System CLI Tools": "System-CLI-Tools", @@ -6185,6 +6341,7 @@ "System path mounts are not yet supported": "Systempfadhalterungen werden noch nicht unterstützt", "System reboot required": "Systemneustart erforderlich", "System upgrade completed": "Systemaktualisierung abgeschlossen", + "System upgrade failed. Check log:": "System-Upgrade fehlgeschlagen. Protokoll prüfen:", "System uptime": "Systemverfügbarkeit", "Systemd ulimits set": "Systemd-Ulimits festgelegt", "TCP BBR configuration created successfully": "TCP-BBR-Konfiguration erfolgreich erstellt", @@ -6249,10 +6406,13 @@ "The Bookmark Everything App": "Die Bookmark Everything App", "The Brave browser is a fast, private and secure web browser for PC, Mac and mobile.": "Der Brave Browser ist ein schneller, privater und sicherer Webbrowser für PC, Mac und Mobilgeräte.", "The CT already exists:": "Das CT existiert bereits:", + "The Compose document must be a mapping.": "Das Compose-Dokument muss eine Zuordnung sein.", "The Compose file declares no service": "Die Compose-Datei erklärt keinen Dienst", "The Compose file describes several images:": "Die Compose-Datei beschreibt mehrere Bilder:", "The Compose file describes several services:": "Die Compose-Datei beschreibt mehrere Dienste:", "The Compose file does not contain a Compose document": "Die Compose-Datei enthält kein Compose-Dokument", + "The Compose file has no services.": "Die Compose-Datei hat keine Dienste.", + "The Compose file has no x-casaos metadata.": "Die Compose-Datei hat keine x-casaos-Metadaten.", "The Compose file is not valid YAML:": "Die Compose-Datei ist nicht gültig 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.": "Das Compose bietet eine optionale AppArmor- oder seccomp-Entspannung; es bleibt deaktiviert, es sei denn, der Benutzer wählt es aus. Fahren Sie nur fort, wenn Sie dem Image vertrauen und dieses Risiko akzeptieren.", "The Compose value must be text or a list:": "Der Compose-Wert muss Text oder eine Liste sein:", @@ -6302,9 +6462,11 @@ "The PostgreSQL volume needs at least 4 GB": "Das PostgreSQL-Volume benötigt mindestens 4 GB", "The PostgreSQL volume needs at least 8 GB": "Das PostgreSQL-Volume benötigt mindestens 8 GB", "The ProxMenux Monitor update checker is not available. Start or update ProxMenux Monitor and try again.": "Die Update-Prüfung von ProxMenux Monitor ist nicht verfügbar. Starte oder aktualisiere ProxMenux Monitor und versuche es erneut.", + "The ProxMenux application catalogue is not a list": "Der ProxMenux-Anwendungskatalog ist keine Liste", "The Proxmox VE 8 update did not finish. The upgrade to Proxmox VE 9 was not started.": "Die Aktualisierung von Proxmox VE 8 wurde nicht abgeschlossen. Das Upgrade auf Proxmox VE 9 wurde nicht gestartet.", "The Proxmox archive keyring is missing; Ceph installation cannot continue safely": "Der Archivschlüsselbund Proxmox fehlt;Die Ceph-Installation kann nicht sicher fortgesetzt werden", "The Proxmox inventory and the local configurations differ": "Das Proxmox-Inventar und die lokalen Konfigurationen unterscheiden sich", + "The README has no recognisable docker-compose section": "Die README hat keinen erkennbaren docker-compose-Abschnitt", "The ROCm image has no support for the AMD GPU of this host:": "Das ROCm-Image unterstützt die AMD-GPU dieses Hosts nicht:", "The ROCm image of this application has no support for the AMD GPU of this host:": "Das ROCm-Image dieser Anwendung unterstützt die AMD-GPU dieses Hosts nicht:", "The Rclone configuration needs at least 1 GB": "Die Rclone-Konfiguration benötigt mindestens 1 GB", @@ -6341,6 +6503,8 @@ "The administrator email is not valid": "Die Administrator-E-Mail ist nicht gültig", "The administrator user contains characters that are not allowed": "Der Administrator-Benutzer enthält Zeichen, die nicht erlaubt sind", "The all-in-one AI application.": "Die All-in-One AI-Anwendung.", + "The application '{app_id}' does not come from LinuxServer": "Die Anwendung '{app_id}' stammt nicht von LinuxServer", + "The application '{app_id}' is not in the index": "Die Anwendung '{app_id}' ist nicht im Index", "The application configuration needs a first start to complete.": "Die Anwendungskonfiguration muss einen ersten Start abschließen.", "The application could not be modified:": "Die Anwendung konnte nicht geändert werden:", "The application could not be recovered:": "Die Anwendung konnte nicht wiederhergestellt werden:", @@ -6370,6 +6534,7 @@ "The backup was taken on a different PVE or kernel major.minor. These paths will be SKIPPED to keep the boot safe:": "Das Backup wurde auf einem anderen PVE oder Kernel-Major. Minor erstellt. Diese Pfade werden ÜBERSPRINGT, um die Boot-Sicherheit zu gewährleisten:", "The bind mount target escapes the rootfs:": "Das bind mount target entkommt den rootfs:", "The block device does not exist:": "Das Blockgerät existiert nicht:", + "The block found does not look like a Docker Compose file": "Der gefundene Block sieht nicht wie eine Docker-Compose-Datei aus", "The build could not be checked beforehand; continuing without that check.": "Der Build konnte vorher nicht überprüft werden;ohne diese Prüfung weitermachen.", "The cached image does not match the current digest": "Das zwischengespeicherte Bild entspricht nicht dem aktuellen Digest", "The cached image is damaged; it will be downloaded again.": "Das zwischengespeicherte Bild ist beschädigt; es wird erneut heruntergeladen.", @@ -6454,6 +6619,8 @@ "The disk size cannot be reproduced": "Die Festplattengröße kann nicht reproduziert werden", "The disk usage of the container could not be read": "Die Festplattennutzung des Containers konnte nicht gelesen werden", "The disks of the failed attempt could not be removed and stay in the temporary container:": "Die Datenträger des fehlgeschlagenen Versuchs konnten nicht entfernt werden und verbleiben im temporären Container:", + "The docker-compose block is not closed": "Der docker-compose-Block ist nicht geschlossen", + "The docker-compose section contains no code block": "Der docker-compose-Abschnitt enthält keinen Codeblock", "The domain must resolve to the public address of this network before the certificate can be issued.": "Die Domain muss sich auf die öffentliche Adresse dieses Netzwerks auflösen, bevor das Zertifikat ausgestellt werden kann.", "The download client still needs to be configured.": "Der Download-Client muss noch konfiguriert werden.", "The download stopped progressing; cancelling this attempt.": "Der Download hat aufgehört voranzukommen; diesen Versuch abzubrechen.", @@ -6487,6 +6654,7 @@ "The fstab entry will still be removed; reboot or manual umount needed.": "Der fstab-Eintrag wird weiterhin entfernt; Neustart oder manuelles Umount erforderlich.", "The gateway must be another usable address in the same subnet.": "Das Gateway muss eine andere nutzbare Adresse im selben Subnetz sein.", "The gateway should appear in your Tailscale admin console shortly.": "Das Gateway sollte in Kürze in Ihrer Tailscale-Administratorkonsole erscheinen.", + "The generated template does not match the schema:": "Die erstellte Vorlage entspricht nicht dem Schema:", "The guest access test did not succeed.": "Der Gastzugriffstest war nicht erfolgreich.", "The healthcheck cannot run without an IP address": "Der Healthcheck kann nicht ohne IP-Adresse laufen", "The host NVIDIA driver is not responding correctly": "Der Host NVIDIA Fahrer reagiert nicht richtig", @@ -6564,6 +6732,8 @@ "The long test runs directly on the disk hardware.": "Der Langzeittest läuft direkt auf der Festplatten-Hardware.", "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.": "Der Container für maschinelles Lernen wird mit dem Image der neuen Auswahl neu erstellt. Sein Modellcache, die Bibliothek und die Datenbank bleiben erhalten. Die gesamte Anwendung wird gestoppt und aktualisiert, wie bei einem Update. Wenn der Vorgang nach dem Ändern eines Containers fehlschlägt, werden die vorherigen Container und die vorherige Auswahl wiederhergestellt. Ein Vorgang, der auf halbem Weg stoppt, wird über das OCI-Verwaltungsmenü wiederhergestellt.", "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.": "Der Container für maschinelles Lernen wird mit dem Image der neuen Auswahl neu erstellt. Sein Modellcache, die Bibliothek und die Datenbank bleiben erhalten. Die gesamte Anwendung wird gestoppt und aktualisiert, wie bei einem Update; wenn etwas fehlschlägt, werden die vorherigen Container und die vorherige Auswahl wiederhergestellt.", + "The main Compose service cannot be identified unambiguously": "Der Haupt-Compose-Dienst kann nicht eindeutig ermittelt werden", + "The main Compose service has no image.": "Der Haupt-Compose-Dienst hat kein Image.", "The main container of this application is not on this host. Restore it too.": "Der Hauptcontainer dieser Anwendung befindet sich nicht auf diesem Host. Stellen Sie auch ihn wieder her.", "The main member must stop first and start last": "Hauptmitglied muss zuerst aufhören und zuletzt beginnen", "The main member of the stack is missing": "Das Hauptelement des Stapels fehlt", @@ -6877,6 +7047,7 @@ "This guarantees that device nodes are available before applying LXC GPU config.": "Dies garantiert, dass Geräteknoten verfügbar sind, bevor die LXC-GPU-Konfiguration angewendet wird.", "This host architecture is not supported by the OCI image importer.": "Diese Hostarchitektur wird vom Bildimporteur OCI nicht unterstützt.", "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.": "Dieser Host hat kein aktives Abonnement. Zum Repository ohne Abonnement wechseln? Die unzugängliche Enterprise-PVE-Quelle wird deaktiviert. Falls vorhanden, werden Enterprise-Ceph-Quellen deaktiviert, ohne dass ein Ersatz-Ceph-Kanal ausgewählt wird. Konfigurieren Sie Ceph bei Bedarf separat.", + "This host runs {name} on {suite}, but these {name} repositories are for another suite: {details}. Disable or remove them in {ui} and run the update again; no repository changed.": "Dieser Host führt {name} auf {suite} aus, aber diese {name}-Repositorys sind für eine andere Suite: {details}. Deaktivieren oder entfernen Sie sie in {ui} und führen Sie das Update erneut aus; es wurde kein Repository geändert.", "This image cannot be installed as it is described:": "Dieses Bild kann nicht wie beschrieben installiert werden:", "This image has no compatible Linux image for this host ({architecture}).": "Dieses Image verfügt über kein kompatibles Linux-Image für diesen Host ({architecture}).", "This image requires the host module": "Dieses Bild requires das Host-Modul", @@ -6947,6 +7118,7 @@ "This will add the mount to /etc/fstab so it persists after reboot.": "Dadurch wird der Mount zu /etc/fstab hinzugefügt, sodass er nach dem Neustart bestehen bleibt.", "This will completely remove Fail2Ban and its configuration. Continue?": "Dadurch wird Fail2Ban und seine Konfiguration vollständig entfernt. Weitermachen?", "This will completely remove Lynis from the system. Continue?": "Dadurch wird Lynis vollständig aus dem System entfernt. Weitermachen?", + "This will create a New %s. Proceed?": "Damit wird ein neues %s erstellt. Fortfahren?", "This will create a new VM": "Dadurch wird eine neue VM erstellt", "This will deploy a Tailscale VPN gateway for secure remote access.": "Dadurch wird ein Tailscale VPN-Gateway für sicheren Fernzugriff bereitgestellt.", "This will install and configure Fail2Ban with:": "Dadurch wird Fail2Ban installiert und konfiguriert mit:", @@ -7053,6 +7225,8 @@ "Umbrel OS installer script by Helper Scripts\n\nVisit the GitHub repo to learn more, contribute, or support the project:\n\nhttps://community-scripts.github.io/ProxmoxVE/scripts?id=umbrel-os-vm": "Umbrel OS-Installationsskript von Helper Scripts\n\nBesuchen Sie das GitHub-Repo, um mehr zu erfahren, einen Beitrag zu leisten oder das Projekt zu unterstützen:\n\nhttps://community-scripts.github.io/ProxmoxVE/scripts?id=umbrel-os-vm", "Unable to detect Proxmox version": "Proxmox-Version konnte nicht erkannt werden", "Unable to detect Proxmox version.": "Proxmox-Version kann nicht erkannt werden.", + "Unable to detect a valid storage location for EFI disk.": "Es konnte kein gültiger Speicherort für den EFI-Datenträger erkannt werden.", + "Unable to detect a valid storage location.": "Es konnte kein gültiger Speicherort erkannt werden.", "Unable to determine the installed memory.": "Der installierte Speicher kann nicht ermittelt werden.", "Unable to identify the root filesystem. Aborting.": "Das Root-Dateisystem konnte nicht identifiziert werden. Abbruch.", "Unable to resolve system ZFS pool disks. Aborting.": "System-Pool-Festplatten ZFS können nicht aufgelöst werden. Abbruch.", @@ -7156,6 +7330,7 @@ "Unsupported OCI digest:": "Nicht unterstützter OCI-Digest:", "Unsupported OCI-LXC AppArmor profile:": "Nicht unterstütztes OCI-LXC AppArmor-Profil:", "Unsupported OCI-LXC seccomp profile:": "Nicht unterstütztes OCI-LXC seccomp Profil:", + "Unsupported Proxmox suite; no repository changed.": "Nicht unterstützte Proxmox-Suite; es wurde kein Repository geändert.", "Unsupported Terminal": "Nicht unterstütztes Terminal", "Unsupported architecture for Figurine:": "Nicht unterstützte Architektur für Figurine:", "Unsupported architecture:": "Nicht unterstützte Architektur:", @@ -7167,6 +7342,7 @@ "Unsupported device type:": "Typ des nicht unterstützten Geräts:", "Unsupported dynamic NVIDIA capabilities:": "Nicht unterstützte dynamische NVIDIA-Funktionen:", "Unsupported format. Only .ova and .ovf files are supported.": "Nicht unterstütztes Format. Es werden nur .ova- und .ovf-Dateien unterstützt.", + "Unsupported host architecture:": "Nicht unterstützte Host-Architektur:", "Unsupported kept setting:": "Nicht unterstützte beibehaltene Einstellung:", "Unsupported media storage mode:": "Nicht unterstützter Medienspeichermodus:", "Unsupported mount options": "Nicht unterstützte Mount-Optionen", @@ -7214,6 +7390,8 @@ "Update completed. Press Enter to continue...": "Aktualisierung abgeschlossen. Drücken Sie die Eingabetaste, um fortzufahren...", "Update credentials": "Anmeldeinformationen aktualisieren", "Update every container of the application": "Aktualisieren Sie jeden Container der Anwendung", + "Update for %s completed.": "Update für %s abgeschlossen.", + "Update for %s exited with status %s.": "Update für %s wurde mit Status %s beendet.", "Update kernel to compatible version": "Aktualisieren Sie den Kernel auf eine kompatible Version", "Update now?": "Update jetzt?", "Update package index:": "Paketindex aktualisieren:", @@ -7222,6 +7400,7 @@ "Update system to latest PVE 8.4+ (if not done already):": "Aktualisieren Sie das System auf die neueste PVE 8.4+ (falls noch nicht geschehen):", "Update the image with the saved configuration": "Aktualisieren Sie das Bild mit der gespeicherten Konfiguration", "Update the whole stack?": "Aktualisieren Sie den gesamten Stack?", + "Update, modify or recreate one installed OCI instance": "Eine installierte OCI-Instanz aktualisieren, ändern oder neu erstellen", "Updated": "Aktualisiert", "Updated sharedfiles group to GID: 101000": "Sharedfiles-Gruppe auf GID aktualisiert: 101000", "Updated stack checked": "Aktualisierter Stapel geprüft", @@ -7233,6 +7412,7 @@ "Updates available": "Updates verfügbar", "Updates file is empty or unreadable.": "Die Aktualisierungsdatei ist leer oder nicht lesbar.", "Updating": "Aktualisierung", + "Updating %s (running %s from %s flow)...": "%s wird aktualisiert (%s aus dem Ablauf %s wird ausgeführt)...", "Updating APT package lists...": "APT-Paketlisten werden aktualisiert...", "Updating Debian Bookworm → Trixie in sources.list...": "Debian Bookworm wird aktualisiert → Trixie in resources.list...", "Updating Figurine binary...": "Figur-Binärdatei wird aktualisiert...", @@ -7333,7 +7513,20 @@ "Username on the Borg server that runs \"borg serve\" (typically \"borg\"). This is NOT the admin/root user of the server — that one is asked later only if you choose \"Generate a new key and authorize it\".": "Benutzername auf dem Borg-Server, auf dem „Borg Serve“ ausgeführt wird (normalerweise „Borg“).Dies ist NICHT der Admin-/Root-Benutzer des Servers – dieser wird später nur dann gefragt, wenn Sie „Neuen Schlüssel generieren und autorisieren“ wählen.", "Username:": "Benutzername:", "Users:": "Benutzer:", + "Using Advanced Settings": "Erweiterte Einstellungen werden verwendet", + "Using BIOS Type:": "Verwendeter BIOS-Typ:", + "Using Bridge:": "Verwendete Bridge:", + "Using CPU Model:": "Verwendetes CPU-Modell:", + "Using Custom Image:": "Verwendetes benutzerdefiniertes Image:", + "Using Default Settings": "Standardeinstellungen werden verwendet", + "Using Hostname:": "Verwendeter Hostname:", + "Using Interface MTU Size:": "Verwendete MTU-Größe der Schnittstelle:", + "Using MAC Address:": "Verwendete MAC-Adresse:", + "Using Machine Type:": "Verwendeter Maschinentyp:", "Using UUID is recommended over /dev/sdX.": "Die Verwendung von UUID wird gegenüber /dev/sdX empfohlen.", + "Using VLAN:": "Verwendetes VLAN:", + "Using Virtual Machine ID:": "Verwendete ID der virtuellen Maschine:", + "Using Vlan:": "Verwendetes VLAN:", "Using advanced configuration": "Verwenden der erweiterten Konfiguration", "Using default Proxmox logo...": "Standardmäßiges Proxmox-Logo wird verwendet...", "Using existing encryption key:": "Verwendung des vorhandenen Verschlüsselungsschlüssels:", @@ -7357,6 +7550,8 @@ "VFIO orphans cleared and initramfs rebuilt — next boot will free the GPU.": "VFIO-Waisen gelöscht und initramfs neu erstellt – beim nächsten Start wird die GPU freigegeben.", "VFIO orphans cleared but initramfs rebuild failed; check /var/log/proxmenux logs.": "VFIO-Waisen gelöscht, aber die Neuerstellung von initramfs ist fehlgeschlagen;Überprüfen Sie die /var/log/proxmenux-Protokolle.", "VFS cache mode": "VFS-Cache-Modus", + "VIRTUAL DISK": "VIRTUELLER DATENTRÄGER", + "VIRTUAL MACHINE ID": "ID DER VIRTUELLEN MASCHINE", "VLAN": "VLAN", "VLC Media Player is a free and open source cross-platform multimedia player and framework that delivers dependable performance across multiple devices.": "VLC Medien Player ist ein kostenloser und Open-Source-übergreifender Multimedia-Player und -Framework, der eine zuverlässige Leistung auf mehreren Geräten bietet.", "VM": "VM", @@ -7368,6 +7563,7 @@ "VM Storage (images, backup)": "VM-Speicher (Images, Backup)", "VM and CT Management Commands": "VM- und CT-Verwaltungsbefehle", "VM and CT backup jobs (Datacenter > Backup)": "Sicherungsjobs VM und CT (Datacenter > Backup)", + "VM created with errors. Check configuration.": "VM mit Fehlern erstellt. Überprüfen Sie die Konfiguration.", "VM creation cancelled before disk planning.": "Die VM-Erstellung wurde vor der Festplattenplanung abgebrochen.", "VM creation cancelled by user.": "VM-Erstellung vom Benutzer abgebrochen.", "VM creation completed": "VM-Erstellung abgeschlossen", @@ -7461,6 +7657,7 @@ "Virtual Function": "Virtuelle Funktion", "Virtual Function (parent PF:": "Virtuelle Funktion (übergeordnetes PF:", "Virtual Machine ID": "ID der virtuellen Maschine", + "Virtual Machine ID:": "ID der virtuellen Maschine:", "Virtual disk": "Virtuelle Festplatte", "Virtual disks": "Virtuelle Festplatten", "Virtual display already set to": "Virtuelle Anzeige bereits eingestellt", @@ -7477,6 +7674,7 @@ "Volume configuration cancelled": "Volumenkonfiguration abgesagt", "Volume options are not yet supported": "Volumenoptionen werden noch nicht unterstützt", "Volume size in GB": "Volumengröße in GB", + "Volumes": "Volumes", "Volumes attached": "Angehängte Volumen", "Volumes prepared for the first start:": "Für den ersten Start vorbereitete Volumen:", "Volumes shared between services are not yet supported": "Volumes, die zwischen Diensten geteilt werden, werden noch nicht unterstützt", @@ -7677,6 +7875,7 @@ "ZRAM profile removed, but package purge failed": "ZRAM-Profil entfernt, aber das Löschen des Pakets ist fehlgeschlagen", "ZRAM still holds pages; configuration was preserved": "ZRAM hält noch Seiten; Konfiguration blieb erhalten", "ZRAM still holds pages; profile remains active": "ZRAM hält noch Seiten; Das Profil bleibt aktiv", + "ZRAM swap profile": "ZRAM-Swap-Profil", "ZRAM swap profile enabled": "ZRAM-Swap-Profil aktiviert", "ZRAM swap profile removed": "ZRAM-Swap-Profil entfernt", "ZSTD - fast, good ratio (recommended)": "ZSTD – schnell, gutes Verhältnis (empfohlen)", @@ -7743,6 +7942,7 @@ "chmod 1777 + setfacl o::rwx (applied on the NFS share from this host)": "chmod 1777 + setfacl o::rwx (auf die NFS-Freigabe von diesem Host angewendet)", "chmod failed — NFS server may be restricting changes from root": "chmod fehlgeschlagen – Der NFS-Server schränkt möglicherweise Änderungen vom Root aus ein", "chown/chmod failed — likely unprivileged CT against host bind mount. Falling back to ACL.": "chown/chmod fehlgeschlagen – wahrscheinlich unprivilegierter CT gegen Host-Bind-Mount. Zurückgreifen auf ACL.", + "clone source mount tree": "Mount-Baum der Quelle klonen", "containers": "Behälter", "containers of": "Behälter von", "content:": "Inhalt:", @@ -7782,6 +7982,7 @@ "driver:": "Treiber:", "e.g.": "z. B.", "empty = generate": "leer = erzeugen", + "enter container namespace": "Namespace des Containers betreten", "exFAT (portable: Windows/Linux/macOS)": "exFAT (tragbar: Windows/Linux/macOS)", "exFAT tools installed successfully.": "exFAT-Tools erfolgreich installiert.", "experimental on this GPU": "experimentell auf dieser GPU", @@ -7814,10 +8015,12 @@ "fstab entry exists": "fstab-Eintrag vorhanden", "fstab line:": "fstab-Zeile:", "fstab references UUIDs/devices not present on this host:": "fstab verweist auf UUIDs/Geräte, die auf diesem Host nicht vorhanden sind:", + "function '%s' is not defined in the %s flow.": "Die Funktion '%s' ist im Ablauf %s nicht definiert.", "gasket DKMS entries removed.": "gasket-DKMS-Einträge entfernt.", "gasket-dkms has been fully removed from this system.": "„gasket-dkms“ wurde vollständig aus diesem System entfernt.", "gasket-dkms is still reported by dpkg in state:": "„gasket-dkms“ wird immer noch von dpkg im Status gemeldet:", "gawk installed": "gawk installiert", + "genisoimage/mkisofs not found.": "genisoimage/mkisofs nicht gefunden.", "go2rtc WebUI": "go2rtc WebUI", "google/gasket-driver cloned (fallback — will apply local patches).": "google/gasket-driver geklont (Fallback – wendet lokale Patches an).", "gpg not found; trying apt-key fallback": "gpg nicht gefunden; Ich versuche einen Apt-Key-Fallback", @@ -7861,6 +8064,7 @@ "individual template is blocked": "Einzelne Vorlage wird blockiert", "initramfs updated": "initramfs aktualisiert", "initramfs updated.": "initramfs aktualisiert.", + "installable": "installierbar", "installed": "installiert", "installed but command not immediately available": "installiert, aber der Befehl ist nicht sofort verfügbar", "installed correctly and available": "korrekt installiert und verfügbar", @@ -7877,6 +8081,7 @@ "intel_iommu/amd_iommu is set in cmdline but no IOMMU groups exist — IOMMU appears disabled in BIOS. Enable VT-d / AMD-Vi in firmware before continuing.": "intel_iommu/amd_iommu ist in cmdline festgelegt, aber es sind keine IOMMU-Gruppen vorhanden – IOMMU scheint im BIOS deaktiviert zu sein. Aktivieren Sie VT-d / AMD-Vi in der Firmware, bevor Sie fortfahren.", "interfaces": "Schnittstellen", "into an LXC.": "in einen LXC.", + "invalid source '%s' (must be 'auto', 'custom', or 'detected')": "ungültige Quelle '%s' (muss 'auto', 'custom' oder 'detected' sein)", "iperf3 - Bandwidth test": "iperf3 – Bandbreitentest", "iperf3 - Bandwidth test (Client mode)": "iperf3 – Bandbreitentest (Client-Modus)", "iperf3 - Bandwidth test (Server mode)": "iperf3 – Bandbreitentest (Servermodus)", @@ -7903,9 +8108,12 @@ "is one of the": "ist einer der", "is referenced in the following stopped VM(s)/CT(s):": "wird in den folgenden gestoppten VM(s)/CT(s) referenziert:", "it asks for the network of the host; the container gets its own address instead": "es fragt nach dem Netzwerk des Hosts; der Container erhält stattdessen eine eigene Adresse", + "it asks for two different memory limits": "es fordert zwei unterschiedliche Speicherlimits an", "it could not be started:": "er konnte nicht gestartet werden:", + "it describes more than one image": "es beschreibt mehr als ein Image", "it is locked or its disk could not be mounted": "er ist gesperrt oder sein Datenträger konnte nicht eingehängt werden", "it publishes no other architecture": "Es veröffentlicht keine andere Architektur", + "it uses Compose configs, which have no equivalent here": "es verwendet Compose-configs, für die es hier keine Entsprechung gibt", "it uses an NVIDIA GPU and this host has no working NVIDIA driver and Container Toolkit. Install them and run the recovery again.": "er verwendet eine NVIDIA-GPU und dieser Host verfügt über keinen funktionierenden NVIDIA-Treiber und kein Container Toolkit. Installieren Sie beides und führen Sie die Wiederherstellung erneut aus.", "it uses the Compose option": "Es verwendet die Compose-Option", "its NVIDIA runtime could not be rebuilt for the driver of this host; the container will not start until it is installed again:": "seine NVIDIA-Laufzeit konnte für den Treiber dieses Hosts nicht neu erstellt werden; der Container startet erst, wenn er erneut installiert wird:", @@ -7913,10 +8121,13 @@ "its Rclone mount is published by a host script that a backup does not include. Enable the mount again from the Rclone entry of the catalog before starting it.": "sein Rclone-Mount wird von einem Host-Skript veröffentlicht, das in einer Sicherung nicht enthalten ist. Aktivieren Sie den Mount erneut über den Rclone-Eintrag des Katalogs, bevor Sie ihn starten.", "its backup was made before ProxMenux kept the record inside the container": "sein Backup wurde erstellt, bevor ProxMenux den Datensatz im Container aufbewahrte", "its configuration could not be read": "seine Konfiguration konnte nicht gelesen werden", + "its health check is not written in a way that can be read": "seine Integritätsprüfung (health check) ist nicht in lesbarer Form angegeben", "its hookscript does not exist on this host:": "sein Hookscript existiert auf diesem Host nicht:", "its host firewall rule was not added:": "seine Host-Firewall-Regel wurde nicht hinzugefügt:", "its include exists with other content:": "sein Include existiert mit anderem Inhalt:", "its record is missing and it was not found among the restored containers": "sein Datensatz fehlt und er wurde unter den wiederhergestellten Containern nicht gefunden", + "its shared memory size is not written in a way that can be read": "seine Größe des gemeinsamen Speichers ist nicht in lesbarer Form angegeben", + "its stop timeout is not written in a way that can be read": "sein Stopp-Timeout ist nicht in lesbarer Form angegeben", "journald MaxLevelStore is adequate for auth logging": "„journald MaxLevelStore“ ist für die Authentifizierungsprotokollierung ausreichend", "journald drop-in created: /etc/systemd/journald.conf.d/proxmenux-loglevel.conf": "Journald-Drop-In erstellt: /etc/systemd/journald.conf.d/proxmenux-loglevel.conf", "journald log level restored": "Journald-Protokollebene wiederhergestellt", @@ -7932,6 +8143,7 @@ "keep-weekly (0 disables)": "Keep-weekly (0 Deaktivierungen)", "keep-yearly (0 disables)": "keep-yearly (0 Deaktivierungen)", "keeping current settings": "Beibehaltung der aktuellen Einstellungen", + "kernel": "Kernel", "kexec configured successfully. Use the command: reboot-quick": "kexec erfolgreich konfiguriert. Verwenden Sie den Befehl: reboot-quick", "kexec-pve service enabled": "kexec-pve-Dienst aktiviert", "kexec-pve service file created": "kexec-pve-Dienstdatei erstellt", @@ -7944,12 +8156,15 @@ "layers": "Schichten", "legacy .link file(s) to the ProxMenux-managed format": "ältere .link-Dateien in das von ProxMenux verwaltete Format", "log2ram completely removed from system": "log2ram vollständig aus dem System entfernt", + "main container of the application": "Hauptcontainer der Anwendung", + "make cloned mount tree read-only": "geklonten Mount-Baum schreibgeschützt machen", "manually inside the container before starting it.": "manuell in den Behälter hinein, bevor Sie ihn starten.", "manually inside the container.": "manuell in den Behälter einfüllen.", "maximum performance": "maximale Leistung", "may be closed — trying discovery anyway...": "möglicherweise geschlossen – versuchen Sie es trotzdem ...", "melonDS aims at providing fast and accurate Nintendo DS emulation.": "melonDS zielt darauf ab, eine schnelle und accurate Nintendo DS-Emulation bereitzustellen.", "members:": "Mitglieder:", + "memory": "Arbeitsspeicher", "minimum": "mindestens", "missing": "fehlt", "mkfs.btrfs not found. Install btrfs-progs and retry.": "mkfs.btrfs nicht gefunden. Installieren Sie btrfs-progs und versuchen Sie es erneut.", @@ -7964,6 +8179,7 @@ "needs a relaxed AppArmor or seccomp profile": "braucht ein entspanntes AppArmor- oder seccomp-Profil", "needs stack review": "Needs Stack Überprüfung", "needs these external services, already running:": "benötigt diese externen Dienste, die bereits ausgeführt werden:", + "network": "Netzwerk", "never": "nie", "next free": "Nächster Free", "next free block": "Nächster Free Block", @@ -7974,11 +8190,14 @@ "no declarative value": "kein deklarativer Wert", "no passphrase": "keine Passphrase", "no password": "kein Passwort", + "no-subscription repository": "no-subscription-Repository", "no_root_squash": "no_root_squash", "non-ProxMenux .tar archive(s) in this path": "Nicht-ProxMenux-.tar-Archive in diesem Pfad", + "none": "keine", "not available yet": "noch nicht verfügbar", "not changed": "nicht geändert", "not found.": "nicht gefunden.", + "not generated": "nicht erstellt", "not installed": "nicht installiert", "not reliable on this hardware due to the following limitations": "Aufgrund der folgenden Einschränkungen ist die Funktion auf dieser Hardware nicht zuverlässig", "nouveau driver has been blacklisted.": "Nouveau-Treiber wurde auf die schwarze Liste gesetzt.", @@ -8018,6 +8237,7 @@ "pct exec authorization failed": "Autorisierung für pct exec fehlgeschlagen", "pct push failed. Check log:": "pct push fehlgeschlagen. Protokoll prüfen:", "pending (reboot required to enumerate full group)": "ausstehend (Neustart erforderlich, um die vollständige Gruppe aufzulisten)", + "pending adaptation": "Anpassung ausstehend", "phpMyAdmin is installed with arbitrary server connections enabled: the login page has a Server field where the address of the MySQL or MariaDB server is entered, together with its user and password.": "phpMyAdmin wird mit aktivierten beliebigen Serververbindungen installiert: Die Anmeldeseite hat ein Serverfeld, in dem die Adresse des MySQL- oder MariaDB-Servers zusammen mit seinem Benutzer und seinem Passwort eingegeben wird.", "pigz configuration completed": "Pigz-Konfiguration abgeschlossen", "pigz enabled in vzdump configuration": "pigz in der vzdump-Konfiguration aktiviert", @@ -8027,10 +8247,13 @@ "playit.gg has to claim this agent before it forwards anything. The agent prints a one-time claim link on the container console and keeps it there until the link is opened.": "playit.gg muss diesen Agenten beanspruchen, bevor er etwas weiterleitet. Der Agent druckt einen einmaligen Claim-Link auf der Containerkonsole und behält ihn dort, bis der Link geöffnet ist.", "port": "Hafen", "portmapper/rpcbind has been disabled": "portmapper/rpcbind wurde deaktiviert", + "print the estimated unpacked size in MiB (0 when unknown)": "die geschätzte entpackte Größe in MiB ausgeben (0, wenn unbekannt)", "private network assigned automatically": "Privates Netzwerk automatisch zugewiesen", "privileged LXC": "privilegierte LXC", + "provide either SOURCE_TYPE+FUNCTION_NAME (single mode) or FUNCTIONS_BATCH (batch mode).": "Geben Sie entweder SOURCE_TYPE+FUNCTION_NAME (Einzelmodus) oder FUNCTIONS_BATCH (Stapelmodus) an.", "proxmox-backup-client reported:": "proxmox-backup-client berichtete:", "proxmox-boot-tool refreshed": "proxmox-boot-tool aktualisiert", + "publish mount tree": "Mount-Baum veröffentlichen", "pve-enterprise.list update skipped (no change)": "pve-enterprise.list-Update übersprungen (keine Änderung)", "pve-enterprise.list updated to Trixie": "pve-enterprise.list auf Trixie aktualisiert", "pvecm command not found (might not be in a cluster)": "pvecm-Befehl nicht gefunden (möglicherweise nicht in einem Cluster)", @@ -8043,6 +8266,7 @@ "pvesm status failed": "pvesm status fehlgeschlagen", "pyLoad is a Free and Open Source download manager written in Python and designed to be extremely lightweight, easily extensible and fully manageable via web.": "pyLoad ist ein Free- und Open Source-Download-Manager, der in Python geschrieben ist und extrem leicht, leicht erweiterbar und vollständig über das Web zu verwalten ist.", "pyLoad web interface": "pyLoad Web Interface", + "python3-jsonschema is required to generate templates": "python3-jsonschema ist zum Erstellen von Vorlagen erforderlich", "qBittorrent WebUI password (user: admin)": "qBittorrent WebUI Passwort (Benutzer: admin)", "qBittorrent already has a configuration; it is not overwritten": "qBittorrent hat bereits eine Konfiguration; es wird nicht überschrieben", "qBittorrent configured": "qBittorrent konfiguriert", @@ -8064,12 +8288,14 @@ "removed from Proxmox": "aus Proxmox entfernt", "removed in Proxmox": "in Proxmox entfernt", "removed successfully from Proxmox.": "erfolgreich aus Proxmox entfernt.", + "removed unused image archive: {path} ({size} bytes)": "unbenutztes Image-Archiv entfernt: {path} ({size} Bytes)", "requires running the official installer, which restarts the Monitor service.": "erfordert die Ausführung des offiziellen Installationsprogramms, das den Monitor-Dienst neu startet.", "requires the package": "erfordert das Paket", "restarted successfully": "erfolgreich neu gestartet", "restoring /etc/network would lose connectivity": "Das Wiederherstellen von /etc/network würde zum Verlust der Konnektivität führen", "restoring on:": "Wiederherstellung am:", "retries": "wiederholt", + "return to host namespace": "zum Namespace des Hosts zurückkehren", "reverse proxy": "Reverse-Proxy", "root and real users only": "Nur Root- und echte Benutzer", "rpcbind could not be disabled completely": "rpcbind konnte nicht vollständig deaktiviert werden", @@ -8114,6 +8340,7 @@ "storage yet.": "Speicher noch.", "storage(s) from backup exist on target": "Speicher aus der Sicherung sind auf dem Ziel vorhanden", "storage.": "Lagerung.", + "subscription banner": "Abonnementbanner", "successfully formatted with": "erfolgreich formatiert mit", "suggested:": "empfohlen:", "switch_gpu_mode.sh was not found.": "switch_gpu_mode.sh wurde nicht gefunden.", @@ -8122,18 +8349,22 @@ "systemctl restart networking failed:": "systemctl restart networking fehlgeschlagen:", "systemd OnCalendar expression": "systemd OnCalendar-Ausdruck", "the API key was not generated on the first start": "Der API-Schlüssel wurde beim ersten Start nicht generiert", + "the GPU did not answer in time": "die GPU hat nicht rechtzeitig geantwortet", "the NVIDIA hook of the container is not available:": "der NVIDIA-Hook des Containers ist nicht verfügbar:", "the bridge does not exist on this host:": "die Bridge existiert auf diesem Host nicht:", "the bridge exists on this host with another network:": "die Bridge existiert auf diesem Host mit einem anderen Netzwerk:", "the container has its own address, so the port Docker published on the host is not needed": "der Container hat eine eigene Adresse, so dass der auf dem Host veröffentlichte Port Docker nicht benötigt wird", "the containers do not agree on the private network of": "die Container sind sich nicht einig über das private Netzwerk von", "the device does not exist on this host:": "das Gerät existiert auf diesem Host nicht:", + "the devices it asks for are not written in a way that can be read": "die angeforderten Geräte sind nicht in lesbarer Form angegeben", "the host directory does not exist:": "das Hostverzeichnis existiert nicht:", "the host firewall rule of the installation is not added again; allow its port in the firewall of this host if you use it.": "die Host-Firewall-Regel der Installation wird nicht erneut hinzugefügt; erlauben Sie ihren Port in der Firewall dieses Hosts, wenn Sie sie verwenden.", + "the memory limit it asks for cannot be applied": "das angeforderte Speicherlimit kann nicht angewendet werden", "the minimum number of characters is": "Die Mindestanzahl an Zeichen beträgt", "the qBittorrent schema is not available": "Das qBittorrent-Schema ist nicht verfügbar", "the record it carries does not belong to this container": "der Datensatz, den er enthält, gehört nicht zu diesem Container", "the record of the application does not list this container": "der Datensatz der Anwendung listet diesen Container nicht auf", + "the resource limits it asks for cannot be applied": "die angeforderten Ressourcenlimits können nicht angewendet werden", "the settings of its include are not in the record:": "die Einstellungen seines Include sind nicht im Datensatz:", "the start order of its dependencies is not in the record": "die Startreihenfolge seiner Abhängigkeiten ist nicht im Datensatz enthalten", "this configuration needs the device": "Diese Konfiguration benötigt das Gerät", @@ -8158,6 +8389,7 @@ "unsupported dependency condition": "nicht unterstützte Abhängigkeitsbedingung", "unsupported external credential or boolean": "nicht unterstützte externe credential oder boolean", "unsupported variable": "nicht unterstützte Variable", + "update for %s exited with status %s.": "Das Update für %s wurde mit Status %s beendet.", "updating": "Aktualisierung", "updating NVIDIA userspace libs": "Aktualisieren der NVIDIA-Userspace-Bibliotheken", "user packages missing — will be installed automatically:": "Benutzerpakete fehlen – werden automatisch installiert:", @@ -8186,6 +8418,7 @@ "with Proxmox": "mit Proxmox", "with prefix, e.g.": "mit Präfix, z. B.", "with the password you provided.": "mit dem von Ihnen angegebenen Passwort.", + "x-casaos.main must name an existing service.": "x-casaos.main muss einen vorhandenen Dienst benennen.", "xemu is a free and open-source application that emulates the original Microsoft Xbox game console, enabling people to play their original Xbox games on Windows, macOS, and Linux systems.": "xemu ist eine kostenlose Open-Source-Anwendung, die die ursprüngliche Microsoft Xbox-Spielkonsole emuliert und es Benutzern ermöglicht, ihre ursprünglichen Xbox-Spiele auf Windows-, macOS- und Linux-Systemen zu spielen.", "xfs — Proxmox dir storage (large files and VMs)": "xfs – Proxmox-Verzeichnisspeicher (große Dateien und VMs)", "xfs — better for large files": "xfs – besser für große Dateien", @@ -8201,6 +8434,7 @@ "zfs-auto-snapshot removed (existing snapshots preserved on the pool)": "zfs-auto-snapshot entfernt (vorhandene Snapshots bleiben im Pool erhalten)", "zpool command not found. Install zfsutils-linux and retry.": "zpool-Befehl nicht gefunden. Installieren Sie zfsutils-linux und versuchen Sie es erneut.", "zpool not found. Install zfsutils-linux and retry.": "zpool nicht gefunden. Installieren Sie zfsutils-linux und versuchen Sie es erneut.", + "{application} runs in {count} containers.": "{application} läuft in {count} Containern.", "{count} saved account.": "{count} gespeichertes Konto.", "{count} saved accounts.": "{count} gespeicherte Konten.", "{path} already exists and belongs to another user of the host, so {app} cannot write to it.\n\nProxMenux can add access rules (ACL) to this directory, to everything inside it and to what is created there later, for the users and groups {app} runs as on the host (IDs {ids}). The owner of the files does not change and whatever reads or writes them today keeps doing so; the owner of the directory also gets access to the files {app} creates.\n\nGrant {app} access to this directory?": "{path} existiert bereits und gehört einem anderen Benutzer des Hosts, daher kann {app} nicht darauf schreiben.\n\nProxMenux kann Zugriffsregeln (ACL) zu diesem Verzeichnis, zu allem darin und zu dem, was später dort erstellt wird, für die Benutzer und Gruppen hinzufügen, unter denen {app} auf dem Host läuft (IDs {ids}). Der Eigentümer der Dateien ändert sich nicht, und was sie heute liest oder schreibt, tut dies weiterhin; der Eigentümer des Verzeichnisses erhält außerdem Zugriff auf die von {app} erstellten Dateien.\n\n{app} Zugriff auf dieses Verzeichnis gewähren?", diff --git a/lang/es.json b/lang/es.json index 90cb9eef..ba0cc301 100644 --- a/lang/es.json +++ b/lang/es.json @@ -1,6 +1,9 @@ { "# Alternative if you prefer screen": "# Alternativa si prefieres la pantalla", "# Recommended: avoids disconnection during upgrade": "# Recomendado: evita la desconexión durante la actualización", + "%s of %s updates failed — see the messages above.": "Han fallado %s de %s actualizaciones: revisa los mensajes anteriores.", + "%s of %s updates failed.": "Han fallado %s de %s actualizaciones.", + "'auto'/'local', or root@IP for development": "'auto'/'local', o root@IP para desarrollo", "(Checked entries will be removed. Uncheck to keep in VM.)": "(Las entradas marcadas se eliminarán. Desmarca para mantener en VM).", "(Import is selected by default — required for disk image imports)": "(Importar está seleccionado de forma predeterminada; es necesario para importar imágenes de disco)", "(Only the host directory is modified. Nothing inside the container is changed.": "(Solo se modifica el directorio del host. No se cambia nada dentro del contenedor.", @@ -162,6 +165,7 @@ "APT configured to skip additional languages": "APT configurado para omitir idiomas adicionales", "APT configured to skip downloading additional languages": "APT configurado para omitir la descarga de idiomas adicionales", "APT configured to use IPv4": "APT configurado para usar IPv4", + "APT hook syntax issue, removing...": "Problema de sintaxis en el hook de APT, eliminándolo...", "APT index update failed after switching to no-subscription. See log:": "La actualización del índice APT falló después de cambiar a sin suscripción. Ver log:", "APT index update failed. See log:": "Error al actualizar el índice APT. Ver log:", "APT indexes updated for Trixie": "Índices APT actualizados para Trixie", @@ -208,6 +212,7 @@ "Activate ProxMenux Monitor": "Activar ProxMenux Monitor", "Active": "Activo", "Active Connections": "Conexiones activas", + "Active ZRAM algorithm, capacity or swap sources did not match the profile": "El algoritmo, la capacidad o las fuentes de swap de ZRAM activos no coincidían con el perfil", "Active exports:": "Exportaciones activas:", "Active session:": "Sesión activa:", "Actual device path on the host": "Ruta real del dispositivo en el host", @@ -261,6 +266,7 @@ "Add or remove extra paths and devices": "Añadir o eliminar rutas y dispositivos extra", "Add physical disk to VM via": "Añadir un disco físico a la VM mediante", "Add share block in /etc/samba/smb.conf:": "Añadir el bloque para compartir en /etc/samba/smb.conf:", + "Add the host firewall rule of this container; one option for each confirmed rule": "Añadir la regla del cortafuegos del host de este contenedor; una opción por cada regla confirmada", "Add unprivileged flag to container configuration:": "Añadir la opción de contenedor sin privilegios a su configuración:", "Add virtual disk": "Añadir disco virtual", "Add: Mount Host Directory into LXC": "Añadir: montar un directorio del host en un LXC", @@ -335,6 +341,7 @@ "Aliases added to .bashrc": "Alias añadidos a .bashrc", "Alist Sync web interface": "Interfaz web de Alist Sync", "All": "Todos", + "All %s update(s) completed successfully.": "Todas las actualizaciones (%s) se completaron correctamente.", "All Available Scripts": "Todos los scripts disponibles", "All GPUs Already Assigned": "Todas las GPU ya asignadas", "All ProxMenux optimizations are up to date.": "Todas las optimizaciones de ProxMenux están actualizadas.", @@ -363,6 +370,9 @@ "All {count} containers of the application will be recreated from their saved image digests (main CT: {vmid}). The stack is stopped, every container is backed up and replaced, then checked. If the operation fails after a container was changed, the backups are restored. An operation that stops halfway is recovered from the OCI management menu.": "Los {count} contenedores de la aplicación se recrearán desde los digest de imagen guardados (CT principal: {vmid}). La pila se detiene, se hace un backup de cada contenedor, se sustituye y se comprueba. Si la operación falla después de modificar un contenedor, se restauran los backups. Una operación que se queda a medias se recupera desde el menú de gestión OCI.", "Allocate CPU Cores": "Asignar núcleos de CPU", "Allocate RAM in MiB": "Asignar RAM en MiB", + "Allocated Cores:": "Núcleos asignados:", + "Allocated RAM:": "RAM asignada:", + "Allocating virtual disk for %s...": "Asignando el disco virtual para %s...", "Allow TCP port {port} from {subnet} through the host firewall? Existing firewall rules are not changed.": "¿Permitir el puerto TCP {port} desde {subnet} en el cortafuegos del host? Las reglas existentes no se modifican.", "Allowed hosts (comma separated; * allows access through the assigned IP)": "Hosts permitidos (separados por comas; * permite el acceso a través de la IP asignada)", "Allowed source subnet:": "Subred de origen permitida:", @@ -403,6 +413,7 @@ "Analyzing selected disks...": "Analizando discos seleccionados...", "Analyzing system for available PCIe storage devices...": "Analizando el sistema para dispositivos de almacenamiento PCIe disponibles...", "Another OCI operation is using the instance registry": "Otra operación OCI está utilizando el registro de instancias", + "Another OCI operation is using the instance registry.": "Otra operación OCI está usando el registro de instancias.", "Another OCI operation is using the instance registry. Wait for it to finish and open this menu again; no container is modified.": "Otra operación OCI está usando el registro de instancias. Espera a que termine y vuelve a abrir este menú; no se modifica ningún contenedor.", "Another OCI operation is using the instance registry. Wait for it to finish.": "Otra operación OCI está usando el registro de instancias. Espera a que termine.", "Another OCI operation is using the registry. This operation was not started.": "Otra operación OCI está utilizando el registro. Esta operación no se inició.", @@ -418,6 +429,7 @@ "Another stack operation is pending": "Hay otra operación de pila pendiente", "Application": "Aplicación", "Application Specific": "Específico de la aplicación", + "Application data": "Datos de la aplicación", "Application registered on this host:": "Aplicación registrada en este host:", "Application responding:": "Aplicación respondiendo:", "Application responding; checking its stability...": "Aplicación respondiendo; comprobando su estabilidad...", @@ -564,6 +576,7 @@ "BIOS from": "BIOS de", "BIOS: OVMF (UEFI)": "BIOS: OVMF (UEFI)", "BOINC is a platform for high-throughput computing on a large scale (thousands or millions of computers). It can be used for volunteer computing (using consumer devices) or grid computing (using organizational resources). It supports virtualized, parallel, and GPU-based applications.": "BOINC es una plataforma de computación de alto rendimiento a gran escala (miles o millones de ordenadores). Sirve para computación voluntaria (con dispositivos domésticos) o computación en grid (con recursos de una organización). Admite aplicaciones virtualizadas, paralelas y basadas en GPU.", + "BRIDGE": "PUENTE", "BRIDGE CONFIGURATION ANALYSIS": "ANÁLISIS DE CONFIGURACIÓN DEL PUENTE", "BTRFS:": "BTRFS:", "Baby Buddy web interface": "Interfaz web de Baby Buddy", @@ -626,6 +639,7 @@ "Bandwidth limit configured": "Límite de ancho de banda configurado", "Bandwidth test (iperf3)": "Prueba de ancho de banda (iperf3)", "Bandwidth test completed successfully": "La prueba de ancho de banda se completó correctamente", + "Banner removal cancelled by user.": "Eliminación del banner cancelada por el usuario.", "Base VM created with ID": "VM base creada con ID", "Base VMID": "Base VMID", "Base VMID (empty = next free block)": "Base VMID (vacío = siguiente bloque libre)", @@ -655,6 +669,7 @@ "Blocked GPU ID for VM Mode": "ID de GPU bloqueada para el modo VM", "Blocked device(s)": "Dispositivo(s) bloqueado(s)", "Blocked device(s):": "Dispositivo(s) bloqueado(s):", + "Blockers": "Bloqueos", "BookStack web interface": "Interfaz web de BookStack", "Bookstack is a free and open source Wiki designed for creating beautiful documentation. Featuring a simple, but powerful WYSIWYG editor it allows for teams to create detailed and useful documentation with ease.": "Bookstack es una wiki gratuita y de código abierto diseñada para crear documentación cuidada. Con un editor WYSIWYG sencillo pero potente, permite a los equipos crear con facilidad documentación detallada y útil.", "Boot Disk": "Disco de arranque", @@ -689,6 +704,7 @@ "Build and install the gasket and apex kernel modules (DKMS)": "Compilar e instalar los módulos del kernel gasket y apex (DKMS)", "Build dependencies installed.": "Construya dependencias instaladas.", "Build your personal knowledge base with TriliumNext Notes": "Crea tu base de conocimiento personal con TriliumNext Notes", + "Bulk generation requires GITHUB_TOKEN to obtain an immutable revision per application": "La generación masiva requiere GITHUB_TOKEN para obtener una revisión inmutable por aplicación", "Business & ERP": "Business & ERP", "CDC Data": "Datos CDC", "CHANGES APPLIED SUCCESSFULLY": "CAMBIOS APLICADOS CORRECTAMENTE", @@ -708,6 +724,7 @@ "CLUSTER UPGRADE NOTES:": "NOTAS DE ACTUALIZACIÓN DEL CLÚSTER:", "CONFIGURED INTERFACES": "INTERFACES CONFIGURADAS", "CONFIRM FORMAT": "CONFIRMAR FORMATO", + "CORE COUNT": "NÚMERO DE NÚCLEOS", "CPU": "CPU", "CPU Cores": "Núcleos de CPU", "CPU MODEL": "MODELO DE CPU", @@ -719,7 +736,11 @@ "CRITICAL: The selected disk is referenced by a RUNNING VM or CT.": "CRÍTICO: El disco seleccionado tiene referencia a una VM o CT EN EJECUCIÓN.", "CT": "LXC", "CT started successfully.": "El LXC se inició con éxito.", + "CT {vmid} ({name}) could not be kept running; it is left stopped": "No se pudo mantener en ejecución el CT {vmid} ({name}); se deja detenido", + "CT {vmid} ({name}) stopped on its own; starting it again (attempt {attempt})": "El CT {vmid} ({name}) se ha detenido por sí solo; se vuelve a iniciar (intento {attempt})", "CT {vmid} is a host monitor and had a rule in the host firewall. Allow TCP port {port} from {subnet} through the firewall of this host? Existing firewall rules are not changed.": "El CT {vmid} es un monitor del host y tenía una regla en el firewall del host. ¿Permitir el puerto TCP {port} desde {subnet} en el firewall de este host? Las reglas existentes no se modifican.", + "CT {vmid} is one of the {count} containers of {application}.": "El CT {vmid} es uno de los {count} contenedores de {application}.", + "CT {vmid}: DHCP client of {name} (IPv{version}) started again": "CT {vmid}: el cliente DHCP de {name} (IPv{version}) se ha iniciado de nuevo", "CUDA requires a working NVIDIA driver": "CUDA requires un controlador NVIDIA de trabajo", "CUDA requires the NVIDIA Container Toolkit on the host": "CUDA requiere el NVIDIA Container Toolkit en el host", "Calculate all kinds of statistics from your (local) Emby or Jellyfin server": "Calcula todo tipo de estadísticas de tu servidor (local) Emby o Jellyfin", @@ -736,6 +757,7 @@ "Cannot continue": "no puedo continuar", "Cannot create:": "No se puede crear:", "Cannot detect filesystem on": "No se puede detectar el sistema de archivos en", + "Cannot determine installed systemd-zram-generator version": "No se puede determinar la versión instalada de systemd-zram-generator", "Cannot find": "No se encuentra", "Cannot identify the vendor of the device:": "No se puede identificar el proveedor del dispositivo:", "Cannot inspect current swap configuration": "No se puede inspeccionar la configuración actual de swap", @@ -870,8 +892,11 @@ "Checklist post-upgrade finished. Warnings:": "Lista de verificación posterior a la actualización finalizada. Advertencias:", "Checklist pre-check finished. Warnings:": "Verificación previa de la lista de verificación finalizada. Advertencias:", "Checks for LVM and storage issues": "Comprueba si hay problemas de almacenamiento y LVM", + "Choose": "Elige", + "Choose BIOS Type": "Elige el tipo de BIOS", "Choose BIOS type": "Elige el tipo de BIOS", "Choose No to abort and roll back to the legacy refuse behaviour.": "Elige No para cancelar y volver al comportamiento de rechazo heredado.", + "Choose Type": "Elige el tipo", "Choose ZimaOS image option:": "Elige la opción de imagen de ZimaOS:", "Choose a Samba server:": "Elige un servidor Samba:", "Choose a Windows ISO to use:": "Elige una ISO de Windows para usar:", @@ -971,10 +996,12 @@ "Cluster configuration (advanced)": "Configuración de clúster (avanzada)", "Cluster data will be applied automatically at next boot.": "Los datos del clúster se aplicarán automáticamente en el próximo inicio.", "Cluster upgrade mode": "Modo de actualización del clúster", + "Code": "Código", "Code-server is VS Code running on a remote server, accessible through the browser.": "Code-server es VS Code ejecutándose en un servidor remoto, accesible desde el navegador.", "CodeProject.AI Server": "CodeProject.AI Server", "Command": "Comando", "Command failed": "El comando ha fallado", + "Command not found.": "Comando no encontrado.", "Command override for an unknown service:": "Anulación de comando para un servicio desconocido:", "Commenting any residual Bookworm lines in *.list...": "Comentando cualquier línea residual de Bookworm en *.list...", "Commenting legacy PVE 8 repository .list files (if any)...": "Comentando archivos .list del repositorio PVE 8 heredado (si los hay)...", @@ -1017,8 +1044,11 @@ "Component:": "Componente:", "Components to uninstall (manual for now):": "Componentes para desinstalar (manual por ahora):", "Compose capabilities validated in the LXC user namespace:": "Configurar capacidades validadas en el espacio de nombres de usuario de LXC:", + "Compose environment must be a list or a mapping.": "El entorno de Compose debe ser una lista o un mapeo.", "Compose file of the application": "Archivo Compose de la aplicación", "Compose file of this host": "Archivo Compose de este host", + "Compose ports must be a list.": "Los puertos de Compose deben ser una lista.", + "Compose volumes must be a list.": "Los volúmenes de Compose deben ser una lista.", "Compressed size:": "Tamaño comprimido:", "Compressing": "Comprimiendo", "Compression": "Compresión", @@ -1057,6 +1087,7 @@ "Configure Proxmox APT repositories": "Configurar repositorios APT de Proxmox", "Configure Samba Client in LXC (only privileged)": "Configurar cliente Samba en LXC (solo privilegiado)", "Configure Samba Server in LXC (only privileged)": "Configurar servidor Samba en LXC (solo privilegiado)", + "Configure and install an application": "Configurar e instalar una aplicación", "Configure as guest (no authentication)": "Configurar como invitado (sin autenticación)", "Configure backup destinations": "Configurar destinos de backup", "Configure backup destinations (PBS, Borg, local)": "Configurar destinos de backup (PBS, Borg, local)", @@ -1065,7 +1096,12 @@ "Configure the remote in the Rclone Web UI first. Checking its name may start a stopped CT, even in a dry run. Applying the mount restarts the CT and attempts to publish two FUSE views on the host; a dry run does not publish them.": "Configura primero el remoto en la interfaz web de Rclone. Comprobar su nombre puede arrancar un CT detenido, incluso en una simulación. Aplicar el montaje reinicia el CT e intenta publicar dos vistas FUSE en el host; una simulación no las publica.", "Configure with username and password": "Configurar con nombre de usuario y contraseña", "Configured Ports": "Puertos configurados", + "Configured VM description": "Descripción de la VM configurada", "Configured but doesn't exist": "Configurado pero no existe", + "Configured controller/NVMe as hostpci%s: %s": "Controlador/NVMe configurado como hostpci%s: %s", + "Configured import disk %s as %s": "Disco importado %s configurado como %s", + "Configured loader disk as ide0": "Disco del cargador configurado como ide0", + "Configured virtual disk as %s, %sGB on %s": "Disco virtual configurado como %s, %sGB en %s", "Configuring AMD GPU passthrough...": "Configurando el passthrough de GPU AMD...", "Configuring AMD softdep...": "Configurando el software AMD...", "Configuring APT to skip downloading additional languages": "Configurar APT para omitir la descarga de idiomas adicionales", @@ -1086,6 +1122,7 @@ "Configuring Proxmox APT repositories...": "Configurando repositorios Proxmox APT...", "Configuring Proxmox filter...": "Configurando el filtro Proxmox...", "Configuring Proxmox jail...": "Configurando la cárcel de Proxmox...", + "Configuring Serial Port:": "Configurando el puerto serie:", "Configuring TCP optimizations...": "Configurando optimizaciones de TCP...", "Configuring TPM device": "Configurar el dispositivo TPM", "Configuring Unpackerr...": "Configuración de Unpackerr...", @@ -1161,6 +1198,7 @@ "Consider security implications for production environments": "Considera las implicaciones de seguridad para los entornos de producción", "Consider visiting the repository and supporting the project.": "Considera visitar el repositorio y apoyar el proyecto.", "Console log:": "Log de la consola:", + "Consume/export": "Consumo/exportación", "Container": "Contenedor", "Container — LXC root directories": "Contenedor — directorios raíz de LXC", "Container ID": "ID del contenedor", @@ -1245,6 +1283,7 @@ "Controller + NVMe passthrough requires machine type q35. Skipping controller assignment.": "El passthrough de controlador + NVMe requiere el tipo de máquina q35. Se omite la asignación del controlador.", "Controller/NVMe Conflict Policy": "Política de conflictos entre controlador y NVMe", "Controller/NVMe already present in VM config": "Controlador/NVMe ya presente en la configuración de VM", + "Controller/NVMe already present in VM config (%s)": "El controlador/NVMe ya está en la configuración de la VM (%s)", "Controller/NVMe assigned": "Controlador/NVMe asignado", "Controller/NVMe is in use by running VM": "El controlador/NVMe está en uso al ejecutar VM", "Controller/NVMe passthrough requires IOMMU enabled in BIOS/UEFI and kernel.": "El passthrough de controlador/NVMe requiere IOMMU habilitado en BIOS/UEFI y en el kernel.", @@ -1311,6 +1350,7 @@ "Core packages": "Paquetes principales", "Cores": "Núcleos", "Corrupted gzip layer": "Capa gzip corrupta", + "Could not activate dev-zram0.swap": "No se pudo activar dev-zram0.swap", "Could not add": "No se pudo añadir", "Could not add disk": "No se pudo añadir el disco", "Could not add the confirmed host firewall rule": "No se pudo añadir la regla confirmada al cortafuegos del host", @@ -1327,12 +1367,14 @@ "Could not change VM virtual display to vga: std": "No se pudo cambiar la pantalla virtual de VM a vga: estándar", "Could not check the NVIDIA GPU": "No podía comprobar la GPU NVIDIA", "Could not clone any gasket-driver repository. Check your internet connection and": "No se pudo clonar ningún repositorio de gasket-driver. Comprueba la conexión a Internet y", + "Could not complete or verify the repository switch; changes may be partial and repository state is unknown. Inspect {ui} before retrying; no automatic rollback was attempted.": "No se pudo completar ni verificar el cambio de repositorio; los cambios pueden ser parciales y el estado del repositorio es desconocido. Revisa {ui} antes de volver a intentarlo; no se ha intentado ninguna reversión automática.", "Could not complete private network release:": "No se pudo completar la liberación de la red privada:", "Could not configure IOMMU kernel parameters automatically. Configure manually and reboot.": "No se pudieron configurar los parámetros del kernel IOMMU automáticamente. Configura manualmente y reinicia.", "Could not convert the OCI rootfs to privileged": "No podía convertir los rootfs OCI a privilegiados", "Could not copy the PVE keyfile into place. Check permissions on:": "No se pudo copiar el archivo de claves PVE en su lugar. Comprueba los permisos en:", "Could not copy the keyfile into place.": "no se pudo copiar el archivo de claves en su lugar.", "Could not copy the keyfile into place. Check permissions on:": "no se pudo copiar el archivo de claves en su lugar. Comprueba los permisos en:", + "Could not create ZRAM generator directory": "No se pudo crear el directorio del generador de ZRAM", "Could not create a temporary directory for the NVIDIA Container Toolkit.": "No se pudo crear un directorio temporal para NVIDIA Container Toolkit.", "Could not create converter directory:": "No se pudo crear el directorio del convertidor:", "Could not create destination directory:": "No se pudo crear el directorio de destino:", @@ -1389,6 +1431,7 @@ "Could not push the key. Check the password and that": "No se pudo enviar la clave. Comprueba la contraseña y que", "Could not query the image registry": "No se puede consultar el registro de imágenes", "Could not reach {registry}. Check its address, DNS and network access.": "No se pudo contactar con {registry}. Comprueba su dirección, el DNS y el acceso a la red.", + "Could not reach {url} after 3 attempts: {reason}": "No se pudo acceder a {url} tras 3 intentos: {reason}", "Could not read SMART data from": "No se pudieron leer los datos SMART de", "Could not read VM configuration.": "No se pudo leer la configuración de la VM.", "Could not read the CUDA compute capability": "No podía leer la capacidad de cálculo de CUDA", @@ -1421,6 +1464,7 @@ "Could not stage pending restore. Nothing new was scheduled.": "No se pudo preparar la restauración pendiente. No se ha programado nada nuevo.", "Could not stop LXC": "No se pudo detener LXC", "Could not stop ZRAM swap; profile configuration remains": "No se pudo detener el swap de ZRAM; la configuración del perfil se mantiene", + "Could not stop existing dev-zram0.swap": "No se pudo detener el dev-zram0.swap existente", "Could not translate the Compose command/entrypoint": "No podía traducir el comando Compose/punto de entrada", "Could not unload nouveau module (may be in use). The blacklist will take effect after reboot. Installation will continue but a reboot will be required.": "No se pudo descargar el módulo nouveau (puede estar en uso). La lista negra entrará en vigor después del reinicio. La instalación continuará pero será necesario reiniciar.", "Could not unmount": "No se pudo desmontar", @@ -1429,6 +1473,8 @@ "Could not unmount — disk may be busy. Removing fstab entry anyway.": "No se pudo desmontar: es posible que el disco esté ocupado. Eliminando la entrada fstab de todos modos.", "Could not update config file.": "No se pudo actualizar el archivo de configuración.", "Could not verify removal of the managed host firewall rule.": "No se pudo verificar la eliminación de la regla del cortafuegos del host gestionada por ProxMenux.", + "Could not write ZRAM generator configuration": "No se pudo escribir la configuración del generador de ZRAM", + "Could not write ZRAM package ownership state": "No se pudo escribir el estado de propiedad de los paquetes de ZRAM", "Could not write to:": "No se pudo escribir a:", "Crafty Controller default login": "Acceso predeterminado de Crafty Controller", "Create Directory": "Crear directorio", @@ -1447,6 +1493,7 @@ "Create VM System Windows": "Crear VM con Windows", "Create VM System macOS (OSX-PROXMOX)": "Crear VM con macOS (OSX-PROXMOX)", "Create VM from template or script": "Crear VM a partir de una plantilla o script", + "Create a %s": "Crear una %s", "Create a VM first (machine type q35 + UEFI BIOS), then run this option again.": "Primero crea una máquina virtual (tipo de máquina q35 + UEFI BIOS), luego ejecuta esta opción nuevamente.", "Create a backup of the container configuration:": "Crea un backup de la configuración del contenedor:", "Create a backup of your container before proceeding": "Crea un backup de tu contenedor antes de continuar", @@ -1471,6 +1518,7 @@ "Created persistent names for": "Nombres persistentes creados para", "Created remapped user": "Usuario reasignado creado", "Created sharedfiles group (GID: 101000)": "Grupo de archivos compartidos creado (GID: 101000)", + "Created with ProxMenuX": "Creada con ProxMenuX", "Creating APT configuration to force IPv4...": "Creando configuración APT para forzar IPv4...", "Creating Ceph repository for PVE 8 (legacy format)...": "Creando repositorio Ceph para PVE 8 (formato heredado)...", "Creating Ceph repository for PVE 9 (deb822 format)...": "Creando repositorio Ceph para PVE 9 (formato deb822)...", @@ -1480,6 +1528,8 @@ "Creating UID remapping for unprivileged container compatibility...": "Creando reasignación de UID para compatibilidad con contenedores sin privilegios...", "Creating VM with the above configuration": "Creando VM con la configuración anterior", "Creating VM...": "Creando máquina virtual...", + "Creating a %s using the above advanced settings": "Creando una %s con la configuración avanzada anterior", + "Creating a %s using the above default settings": "Creando una %s con la configuración predeterminada anterior", "Creating a backup in": "Creando un backup en", "Creating a backup of": "Creando un backup de", "Creating a backup of the container...": "Creando un backup del contenedor...", @@ -1488,6 +1538,7 @@ "Creating backup of network interfaces configuration...": "Creando backup de la configuración de las interfaces de red...", "Creating compressed archive...": "Creando archivo comprimido...", "Creating export archive...": "Creando archivo de exportación...", + "Creating images directory": "Creando el directorio de imágenes", "Creating local archive...": "Creando archivo local...", "Creating mount point...": "Creando punto de montaje...", "Creating partition table and partition...": "Creando tabla de particiones y partición...", @@ -1502,6 +1553,7 @@ "Creating the initial administrator...": "Crear el administrador inicial...", "Creating the private network...": "Creando la red privada...", "Creating the temporary data container": "Creando el contenedor temporal para los datos", + "Creating virtual disk (format=raw) for %s...": "Creando el disco virtual (format=raw) para %s...", "Creative & Design": "Creative & Design", "Credential helper": "Asistente de credenciales", "Credential storage and access": "Dónde se guardan las credenciales", @@ -1562,6 +1614,8 @@ "Custom Configuration": "Configuración personalizada", "Custom Content": "Contenido personalizado", "Custom Directory": "Directorio personalizado", + "Custom Image": "Imagen personalizada", + "Custom Loader Image (from %s)": "Imagen de cargador personalizada (de %s)", "Custom Logo Instructions": "Instrucciones de logotipo personalizado", "Custom MOTD message is already configured": "El mensaje MOTD personalizado ya está configurado", "Custom Options": "Opciones personalizadas", @@ -1636,6 +1690,7 @@ "Dedicated container volume (included in backups)": "Volumen de contenedor dedicado (incluido en backups)", "Dedicated container volumes (included in backups)": "Volúmenes de contenedor dedicados (incluidos en backups)", "DeepSeek Harness “Everything is a Plugin“.": "DeepSeek Harness “Todo es un Plugin”.", + "Default": "Predeterminado", "Default ACLs applied for group inheritance.": "ACL predeterminadas aplicadas para la herencia de grupo.", "Default Credentials": "Credenciales predeterminadas", "Default Gateway": "Puerta de enlace predeterminada", @@ -1878,9 +1933,11 @@ "Do you want to update the existing export?": "¿Quiere actualizar la exportación existente?", "Do you want to update the existing share?": "¿Quieres actualizar el recurso compartido existente?", "Do you want to view the selected backup before restoring?": "¿Quiere ver el backup seleccionado antes de restaurar?", + "Do-Over": "Rehacer", "Docker Mods are only offered for compatible LinuxServer images": "Docker Mods solo se ofrecen para imágenes compatibles de LinuxServer", "Docker Volume Backup": "Docker Volume Backup", "Docker/CLI not available yet or no valid answer": "Docker/CLI aún no está disponible o no hay respuesta válida", + "Docs": "Documentación", "Documents & Notes": "Documents & Notes", "Documents volume size in GB": "Tamaño del volumen de documentos en 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 es un software de wiki de código abierto, fácil de usar y muy versátil, que no necesita base de datos. Sus usuarios lo aprecian por su sintaxis limpia y legible. La facilidad de mantenimiento, backup e integración lo convierte en el favorito de los administradores. Los controles de acceso y conectores de autenticación integrados lo hacen especialmente útil en entornos de empresa, y los numerosos plugins de su activa comunidad permiten muchos usos más allá de una wiki tradicional.", @@ -1896,6 +1953,7 @@ "Download its Compose file from an address": "Descargar su archivo Compose desde una dirección", "Download keyfile": "Descargar archivo de claves", "Download latest VirtIO ISO automatically": "Descargar la última ISO de VirtIO automáticamente", + "Downloaded %s to %s": "%s descargado en %s", "Downloaded OCI images deleted:": "Imágenes OCI descargadas eliminadas:", "Downloaded amdgpu_top": "Descargado amdgpu_top", "Downloading": "Descargando", @@ -1941,8 +1999,12 @@ "Duration": "Duración", "Duration:": "Duración:", "Dynamic NVIDIA is only validated for unprivileged containers. This profile uses static mounts and must be recreated after the host driver changes.": "NVIDIA dinámico solo está validado para contenedores sin privilegios. Este perfil usa montajes estáticos y debe recrearse cuando cambie el controlador del host.", + "EFI Disk Storage": "Almacenamiento del disco EFI", + "EFI disk created (raw) and configured on %s": "Disco EFI creado (raw) y configurado en %s", "EFI disk created and configured on": "Disco EFI creado y configurado en", + "EFI disk created and configured on %s": "Disco EFI creado y configurado en %s", "EFI storage selection cancelled.": "Se canceló la selección de almacenamiento EFI.", + "EFI storage selection failed or was cancelled.": "La selección del almacenamiento EFI falló o se canceló.", "EFI storage selection failed or was cancelled. VM creation aborted.": "La selección de almacenamiento EFI falló o se canceló. Se canceló la creación de la máquina virtual.", "EMERGENCY PROXMOX SYSTEM REPAIR": "REPARACIÓN DE EMERGENCIA SISTEMA PROXMOX", "ENABLED for restore": "HABILITADO para restaurar", @@ -1958,6 +2020,7 @@ "Edit raw CT configuration file": "Editar archivo de configuración CT sin formato", "Edit raw VM configuration file": "Editar archivo de configuración de VM sin formato", "Edit the VM machine type to q35 and try again.": "Edita el tipo de máquina VM a q35 y vuelve a intentarlo.", + "Edition:": "Edición:", "Email address for certificate expiry notices (required by ZeroSSL)": "Dirección de correo para los avisos de caducidad del certificado (obligatoria con ZeroSSL)", "Email address of the LibreDB Studio administrator": "Dirección de correo del administrador de LibreDB Studio", "Email address of the NetBox admin account": "Dirección de correo de la cuenta de administrador de NetBox", @@ -1967,6 +2030,7 @@ "Emby organizes video, music, live TV, and photos from personal media libraries and streams them to smart TVs, streaming boxes and mobile devices. This container is packaged as a standalone emby Media Server.": "Emby organiza vídeo, música, TV en directo y fotos de bibliotecas multimedia personales y los transmite a televisores inteligentes, reproductores de streaming y dispositivos móviles. Este contenedor se distribuye como un Emby Media Server independiente.", "Emergency Proxmox System Repair": "Reparación de emergencia del sistema Proxmox", "Emergency recovery:": "Recuperación de emergencia:", + "Emit numeric progress for the OCI menu": "Emitir el progreso numérico para el menú OCI", "Empowering the smart home": "Impulsando el hogar inteligente", "Empty": "Vacío", "Empty exec service check": "Comprobación de servicio de exec", @@ -1989,6 +2053,7 @@ "Enable ZFS autotrim (SSD/NVMe pools)": "Activar ZFS autotrim (pools SSD/NVMe)", "Enable ZRAM swap profile": "Activar el perfil de swap con ZRAM", "Enable a mount on an existing Rclone OCI container": "Activar un montaje en un contenedor Rclone OCI existente", + "Enable a mount on an installed Rclone OCI": "Activar un montaje en un Rclone OCI instalado", "Enable an optical drive for MakeMKV": "Activar una unidad óptica para MakeMKV", "Enable auto-sync if /var/log exceeds 90% of its size?": "¿Habilitar la sincronización automática si /var/log excede el 90% de su tamaño?", "Enable fast reboots": "Activar reinicios rápidos", @@ -2116,6 +2181,7 @@ "Enter target disk (e.g. /dev/sdX):": "Introduce el disco de destino (por ejemplo, /dev/sdX):", "Enter target storage name (e.g., local-lvm):": "Introduce el nombre del almacenamiento de destino (por ejemplo, local-lvm):", "Enter target storage:": "Introduce el almacenamiento de destino:", + "Enter temporary folder path (default: %s):": "Introduce la ruta de la carpeta temporal (predeterminada: %s):", "Enter the BORG REPOKEY passphrase for target:": "Introduce la frase de contraseña de BORG REPOKEY para el destino:", "Enter the Samba username:": "Introduce el nombre de usuario de Samba:", "Enter the VMID for the new VM:": "Introduce el VMID para la nueva VM:", @@ -2142,6 +2208,7 @@ "Enterprise repository present": "Repositorio empresarial presente", "Enterprise repository returned 401 Unauthorized (no valid subscription). Switch to the no-subscription repository and retry?": "El repositorio empresarial devolvió 401 No autorizado (sin suscripción válida). ¿Cambiar al repositorio sin suscripción y volver a intentarlo?", "Enterprise repository unauthorized and fallback declined by user": "Repositorio enterprise no autorizado y alternativa rechazada por el usuario", + "Enterprise shares an APT stanza with other components. Split it in the Proxmox repository UI; no repository changed.": "Enterprise comparte una entrada de APT con otros componentes. Sepárala en la interfaz de repositorios de Proxmox; no se ha modificado ningún repositorio.", "Entropy generation optimization removed": "Se eliminó la optimización de la generación de entropía", "Environment entry without an explicit value": "Entrada de entorno sin un valor explícito", "Environment override for an unknown service:": "Anulación de entorno para un servicio desconocido:", @@ -2151,6 +2218,7 @@ "Error": "Error", "Error applying patch. Backups preserved at": "Error al aplicar el parche. Backups conservados en", "Error details:": "Detalles del error:", + "Error generating UUP download list.": "Error al generar la lista de descarga de UUP.", "Error installing": "Error al instalar", "Error installing build dependencies. Check": "Error al instalar las dependencias de compilación. Controlar", "Error:": "Error:", @@ -2194,6 +2262,7 @@ "Execution engine for Index-TTS": "Motor de ejecución para Index-TTS", "Existing Groups": "Grupos existentes", "Existing TLS certificate reused:": "Certificado TLS existente reutilizado:", + "Existing ZRAM profile is active but does not match its configuration": "El perfil de ZRAM existente está activo pero no coincide con su configuración", "Existing file, re-downloading...": "Archivo existente, volviendo a descargar...", "Existing filesystem:": "Sistema de archivos existente:", "Existing hostpci entries detected — they will be reused": "Se detectaron entradas de hostpci existentes: se reutilizarán", @@ -2203,6 +2272,7 @@ "Exit": "Volver", "Exit and repair manually": "Salir y reparar manualmente", "Exit the container terminal:": "Salir de la terminal de contenedores:", + "Exit-Script": "Salir", "Exit: Stop to create backup manually": "Salir: detener para crear un backup manualmente", "Exiting for manual repair...": "Saliendo para reparación manual...", "Expected /tmp/gasket-driver/src not found. The clone seems incomplete or uses an unknown layout.": "No se encontró /tmp/gasket-driver/src. El clon parece incompleto o utiliza una estructura desconocida.", @@ -2279,7 +2349,11 @@ "Failed to add bind mount:": "No se pudo añadir el montaje de enlace:", "Failed to add iSCSI storage to Proxmox.": "No se pudo añadir almacenamiento iSCSI a Proxmox.", "Failed to add storage to Proxmox.": "No se pudo añadir almacenamiento a Proxmox.", + "Failed to allocate virtual disk %s": "No se pudo asignar el disco virtual %s", "Failed to assign Controller/NVMe": "No se pudo asignar el controlador/NVMe", + "Failed to assign disk %s (%s) on %s": "No se pudo asignar el disco %s (%s) en %s", + "Failed to assign loader disk": "No se pudo asignar el disco del cargador", + "Failed to assign loader disk to ide0": "No se pudo asignar el disco del cargador a ide0", "Failed to assign virtual disk": "No se pudo asignar el disco virtual", "Failed to clone Lynis from GitHub": "No se pudo clonar Lynis desde GitHub", "Failed to clone log2ram repository. Check /tmp/log2ram_install.log": "No se pudo clonar el repositorio log2ram. Comprueba /tmp/log2ram_install.log", @@ -2288,8 +2362,11 @@ "Failed to configure Proxmox Backup Server repositories": "No se han podido configurar los repositorios de Proxmox Backup Server", "Failed to configure Proxmox repositories": "No se pudieron configurar los repositorios de Proxmox", "Failed to configure TPM device in VM": "No se pudo configurar el dispositivo TPM en VM", + "Failed to configure controller/NVMe: %s": "No se pudo configurar el controlador/NVMe: %s", + "Failed to configure import disk %s as %s": "No se pudo configurar el disco importado %s como %s", "Failed to configure repositories.": "No se pudieron configurar los repositorios.", "Failed to configure repositories. Installation aborted.": "No se pudieron configurar los repositorios. Instalación cancelada.", + "Failed to configure virtual disk as %s": "No se pudo configurar el disco virtual como %s", "Failed to connect to": "No se pudo conectar a", "Failed to connect to server.": "No se pudo conectar al servidor.", "Failed to copy sources into": "No se pudieron copiar las fuentes en", @@ -2363,7 +2440,9 @@ "Failed to install intel-gpu-tools": "No se pudo instalar Intel-gpu-tools", "Failed to install libedgetpu1-std. Check": "No se pudo instalar libedgetpu1-std. Controlar", "Failed to install pigz": "No se pudo instalar pigz", + "Failed to install unzip": "No se pudo instalar unzip", "Failed to install zfs-auto-snapshot": "No se pudo instalar zfs-auto-snapshot", + "Failed to install:": "No se pudo instalar:", "Failed to migrate the existing ProxMenux Bash configuration.": "No se pudo migrar la configuración de Bash ProxMenux existente.", "Failed to mount CIFS share on host.": "No se pudo montar el recurso compartido CIFS en el host.", "Failed to mount NFS share on host.": "No se pudo montar el recurso compartido NFS en el host.", @@ -2547,6 +2626,7 @@ "Full path": "Ruta completa", "Full report — complete SMART data (scrollable)": "Informe completo — datos SMART completos (desplazable)", "Full system upgrade, including dependencies": "Actualización completa del sistema, incluidas las dependencias", + "Function '%s' is not defined in the %s flow.": "La función '%s' no está definida en el flujo %s.", "Function Level Reset (FLR) not available": "Restablecimiento del nivel de función (FLR) no disponible", "GID already in use:": "GID ya en uso:", "GID in CT": "GID en TC", @@ -2625,6 +2705,7 @@ "Generated Paperless administrator": "Administrador de Paperless generado", "Generated Tandoor administrator": "Administrador de Tandoor generado", "Generated administrator login": "Acceso de administrador generado", + "Generated: {generated}; failed: {failed}; family: {provider}": "Generadas: {generated}; fallidas: {failed}; familia: {provider}", "Generating OVF descriptor...": "Generando descriptor OVF...", "Generating dkms.conf...": "Generando dkms.conf...", "Generating manifest...": "Generando manifiesto...", @@ -2636,6 +2717,9 @@ "Get the container's storage information:": "Obtenga la información de almacenamiento del contenedor:", "Get up and running with large language models locally": "Pon en marcha modelos de lenguaje grandes en local", "Git installed": "Git instalado", + "GitHub returned HTTP 403 for {url}. Set GITHUB_TOKEN to raise the API rate limit.": "GitHub devolvió HTTP 403 para {url}. Define GITHUB_TOKEN para aumentar el límite de peticiones de la API.", + "GitHub returned HTTP {status} for {url}.": "GitHub devolvió HTTP {status} para {url}.", + "GitHub returned a truncated tree for the CasaOS catalogue": "GitHub devolvió un árbol truncado para el catálogo de CasaOS", "GitQlient is a multi-platform Git client originally forked from QGit. Nowadays it goes beyond of just a fork and adds a lot of new functionality.": "GitQlient es un cliente Git multiplataforma, originalmente un fork de QGit. Hoy va más allá de un simple fork y añade muchas funciones nuevas.", "Github Desktop is an open source Electron-based GitHub app. It is written in TypeScript and uses React.": "Github Desktop es una aplicación de GitHub de código abierto basada en Electron. Está escrita en TypeScript y usa React.", "Global settings and SSH jail configured": "Configuración global y cárcel SSH configurada", @@ -2688,6 +2772,7 @@ "HAOS One is a community image that runs Docker inside the container. The LXC stays unprivileged, but the inner AppArmor profiles may not be available. The first start downloads Home Assistant Core and its add-ons. If the check fails, the CT and /mnt/data are kept for diagnosis.": "HAOS One es una imagen comunitaria que ejecuta Docker dentro del contenedor. El LXC permanece sin privilegios, pero los perfiles internos de AppArmor pueden no estar disponibles. El primer inicio descarga Home Assistant Core y sus complementos. Si la comprobación falla, el CT y /mnt/data se conservan para el diagnóstico.", "HAOS One profile declined": "Perfil HAOS One rechazado", "HAOS One requires an unprivileged unmanaged LXC with nesting and keyctl, 2 cores, 2048 MB RAM, rootfs of at least 12 GB and /mnt/data of at least 16 GB on a container volume included in backups": "HAOS One requiere un LXC no gestionado y sin privilegios con nesting y keyctl, 2 núcleos, 2048 MB de RAM, rootfs de al menos 12 GB y /mnt/data de al menos 16 GB en un volumen del contenedor incluido en los backups", + "HOSTNAME": "NOMBRE DE HOST", "HTML5 Network Speed Test Server.": "Servidor de prueba de velocidad de red HTML5.", "HTTP service check without a saved URL": "Control de servicio HTTP sin una URL guardada", "Habridge emulates Philips Hue API to other home automation gateways such as an Amazon Echo/Dot Gen 1 (gen 2 has issues discovering ha-bridge) or other systems that support Philips Hue. The Bridge handles basic commands such as On, Off and brightness commands of the hue protocol. This bridge can control most devices that have a distinct API.": "Habridge emula la API de Philips Hue ante otras pasarelas de domótica, como un Amazon Echo/Dot Gen 1 (el gen 2 tiene problemas para descubrir ha-bridge) u otros sistemas compatibles con Philips Hue. El puente gestiona órdenes básicas del protocolo hue como encender, apagar y brillo, y puede controlar la mayoría de dispositivos que tengan una API propia.", @@ -2783,6 +2868,7 @@ "Host device node": "Nodo de dispositivo host", "Host directories are not included in the backup and are not reverted by a recovery.": "Los directorios host no están incluidos en el backup y no son revertidos por una recuperación.", "Host directories are not included in the backups and are not reverted by a recovery.": "Los directorios hosts no están incluidos en los backups y no son revertidos por una recuperación.", + "Host directories are not reverted by the backup (confirmed beforehand)": "El backup no revierte los directorios del host (confirmado de antemano)", "Host directories cannot be included in vzdump": "Los directorios del host no pueden incluirse en vzdump", "Host directories cannot be part of the vzdump backup": "Los directorios de host no pueden ser parte del backup de vzdump", "Host directories that are kept, with their content:": "Directorios del host que se mantienen, con su contenido:", @@ -2806,6 +2892,7 @@ "Host fstab NFS mounts (not registered with pvesm):": "Montajes host fstab NFS (no registrados con pvesm):", "Host fstab NFS mounts:": "Montajes NFS del host fstab:", "Host fstab mounts (not registered as Proxmox storage):": "Montajes de host fstab (no registrados como almacenamiento Proxmox):", + "Host has an active subscription but no active {short} repository. Configure its Enterprise source in {ui}; no repository changed.": "El host tiene una suscripción activa pero ningún repositorio {short} activo. Configura su fuente Enterprise en {ui}; no se ha modificado ningún repositorio.", "Host identity (hostname, hosts)": "Identidad del host (nombre de host, hosts)", "Host kernel module loaded:": "Módulo host kernel cargado:", "Host monitor configured: shared PID and network namespaces, LXCFS disabled in this container": "Monitor de host configurado: PID compartido y espacios de red, LXCFS deshabilitado en este contenedor", @@ -2835,6 +2922,7 @@ "Htpcmanager is a front end for many htpc related applications.": "Htpcmanager es un front-end para muchas aplicaciones relacionadas con HTPC.", "I have read this": "He leído esto", "I/O priority configured": "Prioridad de E/S configurada", + "ID %s is already in use": "El ID %s ya está en uso", "ID already in use. Please choose another.": "ID ya en uso. Por favor, elige otro.", "IGDB": "IGDB", "IGDB Client ID": "Client ID de IGDB", @@ -2888,6 +2976,7 @@ "ISO image — installation images": "Imagen ISO — imágenes de instalación", "ISO image downloaded": "Imagen ISO descargada", "ISO not found to mount on device": "ISO no encontrado para montar en el dispositivo", + "Icons resolved: {resolved}; cleared: {cleared}; unchanged: {unchanged}; with a theme variant: {themed}": "Iconos resueltos: {resolved}; borrados: {cleared}; sin cambios: {unchanged}; con variante de tema: {themed}", "Identical:": "Idéntico:", "Identify candidate disk (never use system disk):": "Identifica el disco candidato (nunca uses el disco del sistema):", "Identify persistent disk paths": "Identificar rutas de disco persistentes", @@ -2895,6 +2984,7 @@ "If Code 43 error appears, KVM hiding is already configured.": "Si aparece el error Código 43, la ocultación de KVM ya está configurada.", "If GUI does not load:": "Si la GUI no se carga:", "If ZFS errors occur:": "Si se producen errores de ZFS:", + "If a newer application image is available, the container is stopped and backed up, and the backup integrity is verified. The container is then updated using the new image.\n\nIf the update fails after the container was changed, ProxMenux attempts to restore the previous installation from the backup. If the operation remains incomplete, select the application in OCI management and choose \"Recover the previous installation\".\n\nHost directories mounted in the container are not restored by the container backup.": "Si hay una imagen más reciente de la aplicación, el contenedor se detiene, se hace un backup y se verifica su integridad. Después, el contenedor se actualiza con la nueva imagen.\n\nSi la actualización falla después de modificar el contenedor, ProxMenux intenta restaurar la instalación anterior desde el backup. Si la operación queda incompleta, selecciona la aplicación en la gestión OCI y elige \"Recuperar la instalación anterior\".\n\nEl backup del contenedor no restaura los directorios del host montados en el contenedor.", "If booting in EFI mode with root on LVM: install GRUB for EFI": "Si arranca en modo EFI con root en LVM: instala GRUB para EFI", "If config issues occur:": "Si ocurren problemas de configuración:", "If container won't start:": "Si el contenedor no se inicia:", @@ -2951,6 +3041,7 @@ "Image selection was cancelled": "Se canceló la selección de la imagen", "Image that is not in the catalog": "Imagen que no está en el catálogo", "Image:": "Imagen:", + "Images directory created: %s": "Directorio de imágenes creado: %s", "Images to import:": "Imágenes para importar:", "Imaging": "Imagen", "Immich CUDA requires NVIDIA driver 545 or later": "Immich CUDA requiere controlador NVIDIA 545 o posterior", @@ -2983,6 +3074,7 @@ "Imported:": "Importado:", "Importing": "Importador", "Importing disk": "Importando disco", + "Importing loader disk:": "Importando el disco del cargador:", "Importing:": "Importador:", "Improve log rotation and limit log size to save space and extend disk life": "Mejorar la rotación de logs y limitar su tamaño para ahorrar espacio y alargar la vida del disco", "In an LXC": "En un LXC", @@ -3037,6 +3129,7 @@ "Independent LXC applications installed": "Aplicaciones LXC independientes instaladas", "Independent LXCs: no main container or hookscript. Each one keeps its own Start with Proxmox setting.": "LXC independientes: sin contenedor principal ni hookscript. Cada uno mantiene su propio ajuste de Inicio con Proxmox.", "Independent applications, without a main container.": "Aplicaciones independientes, sin un contenedor principal.", + "Index updated: {count} candidate applications": "Índice actualizado: {count} aplicaciones candidatas", "Indexers and quality profiles still need to be configured.": "Los índices y perfiles de calidad todavía necesitan ser configurados.", "Inherited retention:": "Retención heredada:", "Inherited schedule:": "Horario heredado:", @@ -3107,7 +3200,10 @@ "Install with: apt-get install open-iscsi": "Instalar con: apt-get install open-iscsi", "Install/Update Coral TPU on Host": "Instalar/actualizar Coral TPU en el host", "Install/Update NVIDIA Drivers (Host + LXC)": "Instalar/actualizar controladores NVIDIA (Host + LXC)", + "Install? [y/N]:": "¿Instalar? [y/N]:", "Installation Complete": "Instalación completa", + "Installation blocked:": "Instalación bloqueada:", + "Installation cancelled.": "Instalación cancelada.", "Installation completed": "Instalación terminada", "Installation completed.": "Instalación completada.", "Installation completed. Please reboot the server manually as soon as possible.": "Instalación completada. Reinicia el servidor manualmente lo antes posible.", @@ -3121,6 +3217,7 @@ "Installed": "Instalado", "Installed at:": "Instalado en:", "Installed components:": "Componentes instalados:", + "Installed unzip successfully.": "unzip se ha instalado correctamente.", "Installed:": "Instalado:", "Installer already downloaded and verified.": "Instalador ya descargado y verificado.", "Installer copied to container.": "Instalador copiado al contenedor.", @@ -3162,6 +3259,7 @@ "Installing and configuring Figurine...": "Instalando y configurando Figurine...", "Installing and configuring ZFS auto-snapshot...": "Instalando y configurando el snapshot automático de ZFS...", "Installing build dependencies...": "Instalando dependencias de compilación...", + "Installing dependencies:": "Instalando dependencias:", "Installing dependency:": "Instalación de dependencia:", "Installing essential Proxmox packages...": "Instalando paquetes esenciales de Proxmox...", "Installing gawk (required for OVF parsing)...": "Instalando gawk (requerido para el análisis de OVF)...", @@ -3184,9 +3282,11 @@ "Installing the new image...": "Instalando la nueva imagen...", "Installing the new image:": "Instalando la nueva imagen:", "Installing the stack startup hook...": "Instalando el hook de arranque de la pila...", + "Installing unzip...": "Instalando unzip...", "Installing zfs-auto-snapshot package...": "Instalando el paquete zfs-auto-snapshot...", "Installs essential packages if missing": "Instala paquetes esenciales si faltan", "Insufficient Disk Space": "Espacio en disco insuficiente", + "Insufficient disk space. Available:": "Espacio en disco insuficiente. Disponible:", "Insufficient disk space. Skipping LXC": "Espacio en disco insuficiente. Saltarse LXC", "Insufficient memory. NVIDIA install aborted.": "Memoria insuficiente. Instalación de NVIDIA cancelada.", "Insufficient memory. Skipping LXC": "Memoria insuficiente. Saltarse LXC", @@ -3222,12 +3322,15 @@ "Interfaces to Remove": "Interfaces para eliminar", "Internal error: NVIDIA installer path is empty or file not found.": "Error interno: la ruta del instalador de NVIDIA está vacía o no se encuentra el archivo.", "Internal error: missing arguments in pmx_prepare_host_shared_dir": "Error interno: faltan argumentos en pmx_prepare_host_shared_dir", + "Internal installer operation; not legacy adoption": "Operación interna del instalador; no es una adopción heredada", "Internal subnet of the tunnel (change it only if it clashes)": "Subred interna del túnel (cámbiala solo si entra en conflicto)", "Interrupted operation": "Operación interrumpida", "Interrupted operation:": "Operación interrumpida:", "Interrupted stack operation found": "Se ha encontrado una operación de pila interrumpida", "Invalid 'proxmox-ve' candidate (not 9.x or none). Please verify your repository configuration and network, then retry.": "Candidato 'proxmox-ve' no válido (ni 9.x ni ninguno). Comprueba la configuración y la red de tu repositorio y luego vuelve a intentarlo.", "Invalid ALLOWED_HOSTS value": "Valor inválido ALLOWED_HOSTS", + "Invalid Compose port:": "Puerto de Compose no válido:", + "Invalid Compose volume path:": "Ruta de volumen de Compose no válida:", "Invalid Home Assistant OS check timeout": "Inválido Home Assistant OS check timeout", "Invalid ID": "ID no válida", "Invalid IPv4 address": "Dirección IPv4 no válida", @@ -3263,6 +3366,7 @@ "Invalid action": "Acción no válida", "Invalid administrator email": "Correo electrónico del administrador inválido", "Invalid administrator user name": "Nombre del usuario del administrador inválido", + "Invalid application identifier:": "Identificador de aplicación no válido:", "Invalid base VMID": "Base inválida VMID", "Invalid bridge": "Puente no válido", "Invalid check package:": "Paquete de comprobación inválido:", @@ -3394,7 +3498,9 @@ "JSON output for scripts": "Salida JSON para scripts", "Jackett works as a proxy server: it translates queries from apps (Sonarr, SickRage, CouchPotato, Mylar, etc) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software. This allows for getting recent uploads (like RSS) and performing searches. Jackett is a single repository of maintained indexer scraping & translation logic - removing the burden from other apps.": "Jackett funciona como un servidor proxy: traduce las consultas de aplicaciones (Sonarr, SickRage, CouchPotato, Mylar, etc.) en consultas http específicas de cada tracker, analiza la respuesta html y devuelve los resultados al software que las pidió. Así se obtienen las subidas recientes (como RSS) y se hacen búsquedas. Jackett es un único repositorio con la lógica de scraping y traducción de indexadores, lo que libera de esa carga a las demás aplicaciones.", "Jellyfin WebUI": "Jellyfin WebUI", + "Jellyfin configuration already applied:": "Configuración de Jellyfin ya aplicada:", "Jellyfin configuration applied:": "Configuración Jellyfin aplicada:", + "Jellyfin configuration updated:": "Configuración de Jellyfin actualizada:", "Jellyfin did not create encoding.xml before the timeout": "Jellyfin no creó encoding.xml antes del timeout", "Jellyfin has not created encoding.xml in any declared path": "Jellyfin no ha creado encoding.xml en ningún camino declarado", "Jellyseerr is a free and open source software application for managing requests for your media library.": "Jellyseerr es una aplicación gratuita y de código abierto para gestionar las solicitudes de tu biblioteca multimedia.", @@ -3437,6 +3543,7 @@ "Keep current version (N)": "Mantener la versión actual (N)", "Keep current version (N) if modified": "Mantener la versión actual (N) si se modifica", "Keep in source VM(s) + disable onboot + add to target VM": "Mantener en las VM de origen + desactivar el inicio + añadir a la VM de destino", + "Keep the backup taken before the update in this Proxmox storage": "Conservar en este almacenamiento de Proxmox el backup realizado antes de la actualización", "Keeping GPU in source VM config": "Mantener la GPU en la configuración de la VM de origen", "Keeping the settings changed in Proxmox:": "Mantener la configuración cambiada en Proxmox:", "Kept sharedfiles group (has regular users assigned).": "Se mantiene el grupo de archivos compartidos (tiene usuarios habituales asignados).", @@ -3503,6 +3610,7 @@ "Language Change": "Cambio de idioma", "Language changed to": "Idioma cambiado a", "Language/locale (e.g. es_ES.UTF-8; translation of every application is not guaranteed)": "Idioma/locale (p. ej. es_ES.UTF-8; no se garantiza la traducción de todas las aplicaciones)", + "Language:": "Idioma:", "Last 50 kernel log lines": "Últimas 50 líneas de log del kernel", "Last run:": "Última ejecución:", "Last system boot time": "Hora del último arranque del sistema", @@ -3521,6 +3629,7 @@ "Let's review your current network configuration.": "Revisemos su configuración de red actual.", "Liberate your videos and unleash infinite possibilities.": "Libera tus vídeos y desata infinitas posibilidades.", "Libraries: /data/media/movies, /data/media/series and /data/media/music. Select them in the media server.": "Bibliotecas: /data/media/movies, /data/media/series y /data/media/music. Selecciónalas en el servidor multimedia.", + "Library": "Biblioteca", "Library size in GB": "Tamaño de la biblioteca en GB", "LibreDB Studio": "LibreDB Studio", "LibreOffice is a free and powerful office suite, and a successor to OpenOffice.org (commonly known as OpenOffice). Its clean interface and feature-rich tools help you unleash your creativity and enhance your productivity.": "LibreOffice es una suite ofimática gratuita y potente, sucesora de OpenOffice.org (conocida como OpenOffice). Su interfaz limpia y sus completas herramientas te ayudan a dar rienda suelta a tu creatividad y a mejorar tu productividad.", @@ -3549,6 +3658,7 @@ "List all containers to identify the privileged one:": "Enumere todos los contenedores para identificar el privilegiado:", "List all containers to identify the unprivileged one:": "Enumere todos los contenedores para identificar el que no tiene privilegios:", "List all virtual machines": "Listar todas las máquinas virtuales", + "List applications": "Listar aplicaciones", "List backups in a specific storage": "Listar backups en un almacenamiento específico", "List block devices and partitions": "Listar dispositivos de bloque y particiones", "List configured storages:": "Lista de almacenamientos configurados:", @@ -3564,6 +3674,13 @@ "Listening ports:": "Puertos de escucha:", "Listing relevant CT users and their mapped UID/GID on host...": "Listado de usuarios CT relevantes y su UID/GID asignado en el host...", "Load and verify the WireGuard module on the Proxmox host": "Cargar y verificar el módulo WireGuard en el host Proxmox", + "Loader": "Cargador", + "Loader configured as boot device.": "Cargador configurado como dispositivo de arranque.", + "Loader import failed. No disk detected in config.": "Falló la importación del cargador. No se detectó ningún disco en la configuración.", + "Loader import failed. No disk detected.": "Falló la importación del cargador. No se detectó ningún disco.", + "Loader imported successfully to %s": "Cargador importado correctamente en %s", + "Loader storage selection failed or was cancelled.": "La selección del almacenamiento del cargador falló o se canceló.", + "Loader:": "Cargador:", "Loading modules...": "Cargando módulos...", "Loading the Helper-Scripts catalog...": "Cargando el catálogo de Helper-Scripts...", "Loading the host kernel module:": "Carga el módulo del kernel host:", @@ -3627,16 +3744,20 @@ "Lyrion Music Server is a streaming audio server for Squeezebox audio players.": "Lyrion Music Server es un servidor de streaming de audio para reproductores Squeezebox.", "M.2 / PCIe devices:": "Dispositivos M.2/PCIe:", "M3U proxy server": "Servidor proxy M3U", + "MAC ADDRESS": "DIRECCIÓN MAC", "MAC Address": "Dirección MAC", "MAC address": "Dirección MAC", "MACHINE TYPE": "TIPO DE MÁQUINA", "MAME is a free and open-source emulator designed to emulate the hardware of arcade games, video game consoles, old computers and other systems in software on modern personal computers.": "MAME es un emulador gratuito y de código abierto que reproduce por software, en ordenadores personales modernos, el hardware de máquinas arcade, videoconsolas, ordenadores antiguos y otros sistemas.", "MOTD configuration updated successfully": "Configuración de MOTD actualizada con éxito", "MOTD configuration was already up to date": "La configuración de MOTD ya estaba actualizada", + "MTU SIZE": "TAMAÑO DE MTU", "Machine Type": "Tipo de máquina", - "Machine learning": "Aprendizaje automático", + "Machine i440fx": "Máquina i440fx", + "Machine learning": "Machine learning", "Machine learning container prepared": "Contenedor Machine learning preparado", "Machine learning profile not implemented; it is not replaced by CPU:": "Perfil de Machine learning no implementado; no se sustituye por CPU:", + "Machine q35": "Máquina q35", "Machine type: q35": "Tipo de máquina: q35", "Machine: q35": "Máquina: q35", "Main endpoint not yet defined": "Punto final principal aún no definido", @@ -4082,6 +4203,7 @@ "No Changes Needed": "No se necesitan cambios", "No Cleanup Needed": "No se necesita limpieza", "No Compose file was given": "No se dio ningún archivo Compose", + "No Compose files were found in the CasaOS catalogue": "No se encontraron archivos Compose en el catálogo de CasaOS", "No Controller/NVMe selected for now.": "No se ha seleccionado ningún controlador/NVMe por ahora.", "No Coral Detected": "No se ha detectado Coral", "No Coral TPU device was found on this host (neither PCIe/M.2 nor USB).": "No se encontró ningún dispositivo Coral TPU en este host (ni PCIe/M.2 ni USB).", @@ -4174,6 +4296,7 @@ "No accessible Samba servers found.": "No se encontraron servidores Samba accesibles.", "No accessible exports found.": "No se encontraron exportaciones accesibles.", "No accessible shares found.": "No se encontraron recursos compartidos accesibles.", + "No active Debian base repository for this suite; configure it in the Proxmox repository UI before continuing.": "No hay ningún repositorio base de Debian activo para esta suite; configúralo en la interfaz de repositorios de Proxmox antes de continuar.", "No active Proxmox storage accepts OCI template archives.": "Ningún almacenamiento activo de Proxmox acepta archivos de plantilla OCI.", "No active exports or showmount not available": "No hay exportaciones activas o showmount no disponible", "No active session": "Ninguna sesión activa", @@ -4203,12 +4326,14 @@ "No compatible GPUs were detected on this host.": "No se detectaron GPU compatibles en este host.", "No compatible PVE jobs": "No hay tareas PVE compatibles", "No compatible disk images found in:": "No se encontraron imágenes de disco compatibles en:", + "No compatible images found in %s\n\nSupported formats: .img, .iso, .qcow2, .vmdk\n\nPlease add some images and try again.": "No se encontraron imágenes compatibles en %s\n\nFormatos admitidos: .img, .iso, .qcow2, .vmdk\n\nAñade algunas imágenes y vuelve a intentarlo.", "No configuration issues found": "No se encontraron problemas de configuración", "No container of the stack was modified.": "No se modificó ningún contenedor de la pila.", "No container runtime available.": "No hay tiempo de ejecución de contenedor disponible.", "No container selected. Exiting.": "No se seleccionó ningún contenedor. Saliendo.", "No controller/NVMe selected.": "No se seleccionó ningún controlador/NVMe.", "No controllers remaining after conflict resolution.": "No quedan controladores después de la resolución del conflicto.", + "No custom image selected": "No se ha seleccionado ninguna imagen personalizada", "No custom key (rely on default SSH config)": "Sin clave personalizada (confía en la configuración SSH predeterminada)", "No custom logos were found in /usr/local/share/fastfetch/logos/.\n\nPlease add a logo and try again.": "No se encontraron logotipos personalizados en /usr/local/share/fastfetch/logos/.\n\nAñade un logotipo e inténtalo nuevamente.", "No desktop UI backup found, will reinstall packages": "No se encontró ningún backup de la interfaz de escritorio; se reinstalarán los paquetes", @@ -4221,6 +4346,7 @@ "No disks were added.": "No se añadieron discos.", "No disks were configured for processing.": "No se configuró ningún disco para el procesamiento.", "No disks were selected.": "No se seleccionaron discos.", + "No disks/controllers configured.": "No hay discos/controladores configurados.", "No docker run command was given": "No se indicó ningún comando docker run", "No duplicate IP addresses": "Sin direcciones IP duplicadas", "No duplicate repositories found": "No se encontraron repositorios duplicados", @@ -4326,6 +4452,7 @@ "No supported NVIDIA versions found for this GPU": "No se encontraron versiones de NVIDIA compatibles para esta GPU", "No sysfs ROM entry — trying ACPI VFCT table...": "No hay entrada de ROM sysfs: probando la tabla ACPI VFCT...", "No target configured.": "No hay destino configurado.", + "No template is available for '{app_id}'": "No hay ninguna plantilla disponible para '{app_id}'", "No test currently running": "No hay ninguna prueba actualmente en ejecución", "No unambiguous loader download found in release metadata.": "Los metadatos de la versión no indican una única descarga del cargador.", "No uninstaller found for:": "No se encontró ningún desinstalador para:", @@ -4464,6 +4591,7 @@ "Only one service at a time can be installed this way.": "De esta forma solo se puede instalar un servicio cada vez.", "Only removes storage definition, not remote data.": "Solo elimina la definición de almacenamiento, no los datos remotos.", "Only run this if you used LVM (step 6b):": "Ejecuta esto solo si usaste LVM (paso 6b):", + "Only the applications that need no question: the ones the cluster keeps a record of": "Solo las aplicaciones que no necesitan ninguna pregunta: aquellas de las que el clúster guarda un registro", "Only the host backup hook is removed — PVE vzdump jobs targeting this storage stay intact.": "Solo se elimina el hook de backup del host — los trabajos vzdump de PVE que usan este almacenamiento quedan intactos.", "Only the image reference, with no Compose file": "Solo la referencia de la imagen, sin archivo Compose", "Only the update of the image runs unattended.": "Solo la actualización de la imagen se ejecuta de forma desatendida.", @@ -4477,6 +4605,7 @@ "Open the VM console and wait for the loader to boot": "Abre la consola VM y espera a que se inicie el cargador", "Open the dashboard from this host on port 8008 to create a new admin account.": "Abre el panel de este host en el puerto 8008 para crear una nueva cuenta de administrador.", "Open the dashboard to create a new admin account:": "Abre el panel para crear una nueva cuenta de administrador:", + "Open the page of an application in the menu": "Abrir la página de una aplicación en el menú", "Open-source AI-powered coding assistant": "Asistente de programación con IA de código abierto", "Open-source UI for building and debugging multi-agent and RAG applications": "Interfaz de código abierto para crear y depurar aplicaciones multiagente y RAG", "Open-source self-hosted SQL IDE.": "IDE de SQL autoalojado y de código abierto.", @@ -4794,6 +4923,7 @@ "Press ENTER to continue...": "Pulsa Intro para continuar...", "Press ENTER to return to the menu...": "Pulsa Intro para volver al menú...", "Press ENTER to return...": "Pulsa Intro para volver...", + "Press Enter to close this terminal...": "Pulsa Intro para cerrar este terminal...", "Press Enter to close...": "Pulsa Intro para cerrar...", "Press Enter to continue": "Pulsa Intro para continuar", "Press Enter to continue...": "Pulsa Intro para continuar...", @@ -4875,6 +5005,7 @@ "ProxMenux Monitor protection": "Protección del ProxMenux Monitor", "ProxMenux Monitor unit repaired and restarted": "Unidad de ProxMenux Monitor reparada y reiniciada", "ProxMenux Monitor → Backups tab (live progress card with estimated time, logs, rollback delta)": "ProxMenux Monitor → pestaña Backups (tarjeta de progreso en vivo con tiempo estimado, logs, delta de rollback)", + "ProxMenux OCI manager Apps (Technology Preview)": "ProxMenux OCI manager Apps (Technology Preview)", "ProxMenux attaches directories, not single files, so this image cannot be installed yet.": "ProxMenux adjunta directorios, no archivos individuales, por lo que esta imagen no se puede instalar todavía.", "ProxMenux can apply open permissions on this NFS directory from the host so the container can read and write:": "ProxMenux puede aplicar permisos de apertura en este directorio NFS desde el host para que el contenedor pueda leer y escribir:", "ProxMenux can remount it with open permissions so any LXC can read and write.": "ProxMenux puede volver a montarlo con permisos abiertos para que cualquier LXC pueda leer y escribir.", @@ -4894,9 +5025,13 @@ "Proxmology logo applied": "Logotipo de Proxmology aplicado", "Proxmox 9 system update allready": "Actualización del sistema Proxmox 9 ya", "Proxmox APT repositories configured": "Repositorios Proxmox APT configurados", + "Proxmox APT repository inventory is invalid or reports parse errors. Fix sources in {ui}; no repository changed.": "El inventario de repositorios APT de Proxmox no es válido o informa de errores de análisis. Corrige las fuentes en {ui}; no se ha modificado ningún repositorio.", "Proxmox Backup Server": "Proxmox Backup Server", "Proxmox Backup Server (PBS) destinations": "Destinos de Proxmox Backup Server (PBS)", "Proxmox Backup Server APT repositories configured": "Repositorios APT de Proxmox Backup Server configurados", + "Proxmox Backup Server Microcode": "Proxmox Backup Server Microcode", + "Proxmox Backup Server Post Install": "Post-Install de Proxmox Backup Server", + "Proxmox Backup Server Subscription Banner Removal": "Eliminación del banner de suscripción de Proxmox Backup Server", "Proxmox Backup Server Update": "Actualización de Proxmox Backup Server", "Proxmox Backup Server update completed.": "Actualización de Proxmox Backup Server completada.", "Proxmox CIFS Storage Status:": "Estado de almacenamiento CIFS de Proxmox:", @@ -4918,6 +5053,7 @@ "Proxmox iSCSI Storage Status:": "Estado de almacenamiento Proxmox iSCSI:", "Proxmox jail configured": "Cárcel de Proxmox configurada", "Proxmox local storages:": "Almacenamientos locales de Proxmox:", + "Proxmox no-subscription standard repository handle unavailable; no repository changed.": "El identificador del repositorio estándar sin suscripción de Proxmox no está disponible; no se ha modificado ningún repositorio.", "Proxmox repository": "Repositorio de Proxmox", "Proxmox repository OK (candidate is 9.x)": "Repositorio de Proxmox OK (el candidato es 9.x)", "Proxmox repository configuration completed": "Configuración del repositorio Proxmox completada", @@ -4985,6 +5121,7 @@ "Rclone mount needs a privileged LXC with FUSE access. The container is dedicated to Rclone and its web UI must not be exposed to untrusted networks.": "Rclone mount necesita un LXC privilegiado con acceso FUSE. El contenedor está dedicado a Rclone y su interfaz de usuario web no debe estar expuesto a redes no confiadas.", "Rclone mount requires a privileged LXC with FUSE access. Use this profile only on a trusted node and network.": "Rclone mount necesita un LXC privilegiado con acceso a FUSE. Usa este perfil solo en un nodo y una red de confianza.", "Rclone mount requires a privileged container": "Rclone mount requiere un contenedor privilegiado", + "Rclone remote": "Remoto de Rclone", "Re-enter the BORG REPOKEY passphrase to confirm:": "Vuelve a introducir la frase de contraseña de BORG REPOKEY para confirmar:", "Re-running pre-check after repairs...": "Volviendo a ejecutar la verificación previa después de las reparaciones...", "Reachable": "Accesible", @@ -5008,6 +5145,7 @@ "Reading SMART self-test log...": "Leyendo el log de autoprueba SMART...", "Reading full SMART report...": "Leyendo el informe SMART completo...", "Reading image metadata. Please wait...": "Leyendo los metadatos de la imagen. Espera...", + "Ready to create a %s?": "¿Listo para crear una %s?", "Real-time Performance Monitoring": "Monitorización del rendimiento en tiempo real", "Real-time bandwidth usage (press q to exit)": "Uso de ancho de banda en tiempo real (pulsa q para salir)", "Real-time collaborative document editor": "Editor colaborativo de documentos en tiempo real", @@ -5083,15 +5221,19 @@ "Recreating the container:": "Recreando el contenedor:", "Refresh APT index and verify repositories:": "Actualizar el índice APT y verificar los repositorios:", "Refresh the configured APT repositories and review the PBS package upgrade? Repository files will be preserved.": "¿Actualizar los índices de los repositorios de APT configurados y revisar la actualización de paquetes de PBS? Se conservarán los archivos de los repositorios.", + "Refresh the index from the image sources": "Actualizar el índice desde las fuentes de imágenes", "Refresh token of the connector, from the Twingate admin console": "Token de renovación del conector, de la consola de administración de Twingate", "Refresh your browser (Ctrl+Shift+R) to see changes": "Actualiza tu navegador (Ctrl+Shift+R) para ver los cambios", "Refresh your browser to see changes (server restart may be required)": "Actualiza tu navegador para ver los cambios (es posible que sea necesario reiniciar el servidor)", "Refreshing apt cache...": "Actualizando caché de apt...", "Refreshing the NVIDIA runtime...": "Refrescando el tiempo de ejecución de NVIDIA...", "Refusing an unexpected rootfs path:": "Refusing an inesperado rootfs path:", + "Regenerate the catalog templates": "Regenerar las plantillas del catálogo", + "Regenerate the template of one application": "Regenerar la plantilla de una aplicación", "Regenerating PVE package cache...": "Regenerando caché de paquetes PVE...", "Regenerating boot artifacts for the merged kernel-agnostic changes...": "Regenerando artefactos de arranque para los cambios fusionados independientes del kernel...", "Regenerating certificates and restarting services...": "Regenerando certificados y reiniciando servicios...", + "Register again the OCI applications restored from a backup": "Registrar de nuevo las aplicaciones OCI restauradas desde un backup", "Register mount path in Proxmox:": "Registre la ruta de montaje en Proxmox:", "Registering disk as Proxmox storage...": "Registrando disco como almacenamiento en Proxmox...", "Registering module with DKMS...": "Registrando módulo con DKMS...", @@ -5278,6 +5420,7 @@ "Resetting time synchronization...": "Restableciendo la sincronización horaria...", "Residual Bookworm entries commented where applicable": "Entradas residuales de Bookworm comentadas cuando corresponda", "Resilio-sync (formerly BitTorrent Sync) uses the BitTorrent protocol to sync files and folders between all of your devices. There are both free and paid versions, this container supports both. There is an official sync image but we created this one as it supports user mapping to simplify permissions for volumes.": "Resilio-sync (antes BitTorrent Sync) usa el protocolo BitTorrent para sincronizar archivos y carpetas entre todos tus dispositivos. Hay versiones gratuita y de pago, y este contenedor admite ambas. Existe una imagen oficial de sync, pero creamos esta porque admite el mapeo de usuarios, que simplifica los permisos de los volúmenes.", + "Resolve catalog icons against the jsdelivr icon sets": "Resolver los iconos del catálogo con los conjuntos de iconos de jsdelivr", "Resolve package conflicts": "Resolver conflictos de paquetes", "Resources": "Recursos", "Restart Network": "Reiniciar la red", @@ -5336,6 +5479,7 @@ "Results:": "Resultados:", "Retention": "Retención", "Retention policy (prune-backups syntax).": "Política de retención (sintaxis de prune-backups).", + "Retrieving the URL for the %s loader": "Obteniendo la URL del cargador %s", "RetroArch is a frontend for emulators, game engines and media players. It enables you to run classic games on a wide range of computers and consoles through its slick graphical interface.": "RetroArch es un frontend para emuladores, motores de juego y reproductores multimedia. Permite ejecutar juegos clásicos en una gran variedad de ordenadores y consolas con una interfaz gráfica muy cuidada.", "Return": "Volver", "Return to Main Menu": "Volver al menú principal", @@ -5415,6 +5559,9 @@ "SCSI (recommended for Linux)": "SCSI (recomendado para Linux)", "SECURITY CONSIDERATIONS:": "CONSIDERACIONES DE SEGURIDAD:", "SECURITY WARNING:": "ADVERTENCIA DE SEGURIDAD:", + "SELECT CUSTOM IMAGE": "SELECCIONAR IMAGEN PERSONALIZADA", + "SELECT LOADER": "SELECCIONAR CARGADOR", + "SETTINGS": "CONFIGURACIÓN", "SMART Action": "Acción SMART", "SMART Disk Health & Test": "Estado y Test SMART del disco", "SMART health status: PASSED": "Estado SMART: CORRECTO", @@ -5440,6 +5587,7 @@ "SSH protection (aggressive mode)": "Protección SSH (modo agresivo)", "STEP 6: Choose commands based on your storage type": "PASO 6: Elige comandos según el tipo de almacenamiento", "STEP 9: Cleanup (LVM only)": "PASO 9: Limpieza (solo LVM)", + "STORAGE PLAN": "PLAN DE ALMACENAMIENTO", "STORAGE TYPE IDENTIFICATION:": "IDENTIFICACIÓN DEL TIPO DE ALMACENAMIENTO:", "SUGGESTION FOR": "SUGERENCIA PARA", "SWAG serves HTTPS on port 443. Plain HTTP on port 80 is disabled in /config/nginx/site-confs/default.conf.": "SWAG sirve HTTPS en el puerto 443. El HTTP sin cifrar del puerto 80 está desactivado en /config/nginx/site-confs/default.conf.", @@ -5520,6 +5668,7 @@ "Scheduled backup job created": "Trabajo de backup programado creado", "Scheduled backup jobs": "Trabajos de backup programados", "Scheduled backups and retention policies": "Backups programados y políticas de retención", + "Scheduled run: no questions; stops where a person has to decide": "Ejecución programada: sin preguntas; se detiene donde una persona tenga que decidir", "Scheduled tasks (cron)": "Tareas programadas (cron)", "Scheduler script not found:": "Script del programador no encontrado:", "ScreenScraper": "ScreenScraper", @@ -5529,6 +5678,7 @@ "Script not found:": "Script no encontrado:", "Scripts in": "Scripts en", "ScummVM is a program which allows you to run certain classic graphical adventure and role-playing games, provided you already have their data files. The clever part about this: ScummVM just replaces the executables shipped with the games, allowing you to play them on systems for which they were never designed! ScummVM is a complete rewrite of these games' executables and is not an emulator.": "ScummVM es un programa que permite ejecutar ciertas aventuras gráficas y juegos de rol clásicos, siempre que ya tengas sus archivos de datos. Lo ingenioso es que ScummVM sustituye los ejecutables de los juegos, de modo que puedes jugarlos en sistemas para los que nunca se diseñaron. ScummVM es una reescritura completa de esos ejecutables y no es un emulador.", + "SeaBIOS (Legacy)": "SeaBIOS (heredado)", "Sealskin is a self-hosted, client-server platform that enables users to run powerful, containerized desktop applications streamed directly to a web browser. It uses a browser extension to intercept user actions—such as clicking a link or downloading a file and redirects them to a secure, isolated application environment running on a remote server.": "Sealskin es una plataforma cliente-servidor autoalojada que permite ejecutar potentes aplicaciones de escritorio en contenedores transmitidas directamente al navegador. Usa una extensión del navegador para interceptar acciones del usuario, como hacer clic en un enlace o descargar un archivo, y redirigirlas a un entorno de aplicación seguro y aislado en un servidor remoto.", "Search": "Buscar", "Search Results for:": "Resultados de búsqueda para:", @@ -5714,6 +5864,7 @@ "Selected GPU(s)": "GPU seleccionadas", "Selected GPU(s):": "GPU seleccionadas:", "Selected LXC action": "Acción LXC seleccionada", + "Selected Loader:": "Cargador seleccionado:", "Selected VM": "Máquina virtual seleccionada", "Selected VM action": "Acción de VM seleccionada", "Selected bridge:": "Bridge seleccionado:", @@ -5879,6 +6030,7 @@ "Show standard exclude patterns": "Mostrar patrones de exclusión estándar", "Show status of all storage pools": "Mostrar el estado de todos los grupos de almacenamiento", "Show the QR code of a peer again with: pct exec -- /app/show-peer 1": "Vuelve a mostrar el código QR de un peer con: pct exec -- /app/show-peer 1", + "Show the summary of a template": "Mostrar el resumen de una plantilla", "Show traffic statistics per interface": "Mostrar estadísticas de tráfico por interfaz", "Show vzdump backup configuration": "Mostrar configuración de backup de vzdump", "Shows status and type (nfs/cifs/dir/iscsi...).": "Muestra el estado y el tipo (nfs/cifs/dir/iscsi...).", @@ -5986,6 +6138,7 @@ "Start VM": "Iniciar máquina virtual", "Start VM after creation": "Iniciar VM después de la creación", "Start VM after creation?": "¿Iniciar VM después de la creación?", + "Start VM when completed:": "Iniciar la VM al terminar:", "Start a container. Use the correct ": "Iniciar un contenedor. Usa el correcto", "Start a virtual machine. Use the correct ": "Iniciar una VM. Usa el correcto", "Start each LXC with Proxmox (no coordinated startup)": "Iniciar cada LXC con Proxmox (sin arranque coordinado)", @@ -6015,6 +6168,7 @@ "Starting": "Iniciando", "Starting Borg backup...": "Iniciando el backup de Borg...", "Starting CT": "Iniciando el CT", + "Starting ISO conversion...": "Iniciando la conversión a ISO...", "Starting LXC Privileged to Unprivileged conversion process...": "Iniciando el proceso de conversión de LXC privilegiado a no privilegiado...", "Starting LXC Unprivileged to Privileged conversion process...": "Iniciando el proceso de conversión de LXC sin privilegios a privilegiados...", "Starting NVIDIA installer. This may take several minutes...": "Iniciando el instalador de NVIDIA. Esto puede tardar varios minutos...", @@ -6122,6 +6276,7 @@ "Subscription banner removal failed": "Error al eliminar el banner de suscripción", "Subscription banner removed successfully": "El banner de suscripción se eliminó correctamente", "Subscription banner restored successfully (desktop and mobile)": "El banner de suscripción se restauró correctamente (escritorio y móvil)", + "Subscription status is not unambiguously active, notfound or expired. Check proxmox-backup-manager subscription get locally; no repository changed.": "El estado de la suscripción no es claramente active, notfound ni expired. Compruébalo localmente con proxmox-backup-manager subscription get; no se ha modificado ningún repositorio.", "Success": "Éxito", "Successful": "Exitoso", "Supervisor does not confirm healthy and supported yet": "Supervisor no confirma sano y apoyado aún", @@ -6149,6 +6304,7 @@ "Synchronize time automatically": "Sincronizar la hora automáticamente", "Synclounge is a third party tool that allows you to watch Plex in sync with your friends/family, wherever you are.": "Synclounge es una herramienta de terceros que te permite ver Plex en sincronía con tus amigos o familia, estés donde estés.", "Syncthing replaces proprietary sync and cloud services with something open, trustworthy and decentralized. Your data is your data alone and you deserve to choose where it is stored, if it is shared with some third party and how it's transmitted over the Internet.": "Syncthing sustituye los servicios propietarios de sincronización y nube por algo abierto, fiable y descentralizado. Tus datos son solo tuyos y mereces decidir dónde se guardan, si se comparten con terceros y cómo viajan por Internet.", + "Synology VM Creator": "Creador de VM Synology", "Sysctl not namespaced or not valid:": "Sysctl no namespaced or not valid:", "System": "Sistema", "System CLI Tools": "Herramientas CLI del sistema", @@ -6170,6 +6326,7 @@ "System path mounts are not yet supported": "Los montajes de la ruta del sistema aún no están soportados", "System reboot required": "Es necesario reiniciar el sistema", "System upgrade completed": "Actualización del sistema completada", + "System upgrade failed. Check log:": "Falló la actualización del sistema. Revisa el log:", "System uptime": "Tiempo de actividad del sistema", "Systemd ulimits set": "Ulimites de Systemd establecidos", "TCP BBR configuration created successfully": "Configuración TCP BBR creada correctamente", @@ -6234,10 +6391,13 @@ "The Bookmark Everything App": "La aplicación para guardar todo en marcadores", "The Brave browser is a fast, private and secure web browser for PC, Mac and mobile.": "El navegador Brave es un navegador web rápido, privado y seguro para PC, Mac y móvil.", "The CT already exists:": "El CT ya existe:", + "The Compose document must be a mapping.": "El documento Compose debe ser un mapeo.", "The Compose file declares no service": "El archivo Compose no declara servicio", "The Compose file describes several images:": "El archivo Compose describe varias imágenes:", "The Compose file describes several services:": "El archivo Compose describe varios servicios:", "The Compose file does not contain a Compose document": "El archivo Compose no contiene un documento Compose", + "The Compose file has no services.": "El archivo Compose no tiene servicios.", + "The Compose file has no x-casaos metadata.": "El archivo Compose no tiene metadatos x-casaos.", "The Compose file is not valid YAML:": "El archivo Compose no es YAML válido:", "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.": "El Compose ofrece una relajación opcional de AppArmor o seccomp; seguirá desactivada salvo que el usuario la seleccione. Continúa solo si confías en la imagen y aceptas este riesgo.", "The Compose value must be text or a list:": "El valor Compose debe ser texto o lista:", @@ -6287,9 +6447,11 @@ "The PostgreSQL volume needs at least 4 GB": "El volumen de PostgreSQL necesita al menos 4 GB", "The PostgreSQL volume needs at least 8 GB": "El volumen de PostgreSQL necesita al menos 8 GB", "The ProxMenux Monitor update checker is not available. Start or update ProxMenux Monitor and try again.": "El comprobador de actualizaciones de ProxMenux Monitor no está disponible. Inicia o actualiza ProxMenux Monitor e inténtalo de nuevo.", + "The ProxMenux application catalogue is not a list": "El catálogo de aplicaciones de ProxMenux no es una lista", "The Proxmox VE 8 update did not finish. The upgrade to Proxmox VE 9 was not started.": "La actualización de Proxmox VE 8 no ha terminado. No se ha iniciado la actualización a Proxmox VE 9.", "The Proxmox archive keyring is missing; Ceph installation cannot continue safely": "Falta el conjunto de claves de archivo Proxmox; La instalación de Ceph no puede continuar de forma segura", "The Proxmox inventory and the local configurations differ": "El inventario de Proxmox y las configuraciones locales difieren", + "The README has no recognisable docker-compose section": "El README no tiene ninguna sección docker-compose reconocible", "The ROCm image has no support for the AMD GPU of this host:": "La imagen de ROCm no tiene soporte para la GPU AMD de este host:", "The ROCm image of this application has no support for the AMD GPU of this host:": "La imagen de ROCm de esta aplicación no tiene soporte para la GPU AMD de este host:", "The Rclone configuration needs at least 1 GB": "La configuración Rclone necesita al menos 1 GB", @@ -6326,6 +6488,8 @@ "The administrator email is not valid": "El correo electrónico del administrador no es válido", "The administrator user contains characters that are not allowed": "El usuario administrador contiene caracteres que no se permiten", "The all-in-one AI application.": "La aplicación de IA todo en uno.", + "The application '{app_id}' does not come from LinuxServer": "La aplicación '{app_id}' no procede de LinuxServer", + "The application '{app_id}' is not in the index": "La aplicación '{app_id}' no está en el índice", "The application configuration needs a first start to complete.": "La configuración de la aplicación necesita un primer arranque para completarse.", "The application could not be modified:": "No se pudo modificar la aplicación:", "The application could not be recovered:": "No se pudo recuperar la aplicación:", @@ -6353,6 +6517,7 @@ "The backup was taken on a different PVE or kernel major.minor. These paths will be SKIPPED to keep the boot safe:": "El backup se hizo en un PVE o kernel major.minor distinto. Estas rutas se OMITIRÁN para mantener el arranque seguro:", "The bind mount target escapes the rootfs:": "El destino del bind mount sale del rootfs:", "The block device does not exist:": "El dispositivo bloque no existe:", + "The block found does not look like a Docker Compose file": "El bloque encontrado no parece un archivo Docker Compose", "The build could not be checked beforehand; continuing without that check.": "La compilación no se pudo comprobar de antemano; se continúa sin esa comprobación.", "The cached image does not match the current digest": "La imagen en caché no coincide con el digest actual", "The cached image is damaged; it will be downloaded again.": "La imagen en caché está dañada; se descargará de nuevo.", @@ -6436,6 +6601,8 @@ "The disk size cannot be reproduced": "El tamaño del disco no se puede reproducir", "The disk usage of the container could not be read": "El uso del disco del contenedor no se podía leer", "The disks of the failed attempt could not be removed and stay in the temporary container:": "Los discos del intento fallido no se pudieron eliminar y siguen en el contenedor temporal:", + "The docker-compose block is not closed": "El bloque docker-compose no está cerrado", + "The docker-compose section contains no code block": "La sección docker-compose no contiene ningún bloque de código", "The domain must resolve to the public address of this network before the certificate can be issued.": "El dominio debe resolver a la dirección pública de esta red antes de poder emitir el certificado.", "The download client still needs to be configured.": "El cliente de descarga todavía necesita ser configurado.", "The download stopped progressing; cancelling this attempt.": "La descarga dejó de progresar; cancelando este intento.", @@ -6469,6 +6636,7 @@ "The fstab entry will still be removed; reboot or manual umount needed.": "La entrada fstab seguirá siendo eliminada; Es necesario reiniciar o desmontar manualmente.", "The gateway must be another usable address in the same subnet.": "La puerta de enlace debe ser otra dirección utilizable de la misma subred.", "The gateway should appear in your Tailscale admin console shortly.": "La puerta de enlace debería aparecer en su consola de administración de Tailscale en breve.", + "The generated template does not match the schema:": "La plantilla generada no coincide con el esquema:", "The guest access test did not succeed.": "La prueba de acceso de invitados no tuvo éxito.", "The healthcheck cannot run without an IP address": "El control de salud no puede funcionar sin una dirección IP", "The host NVIDIA driver is not responding correctly": "El controlador NVIDIA host no está respondiendo correctamente", @@ -6544,6 +6712,8 @@ "The local storage does not accept snippets": "El almacenamiento local no admite snippets", "The long test runs directly on the disk hardware.": "La prueba larga se ejecuta directamente en el hardware del disco.", "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.": "El contenedor Machine learning se reconstruye con la imagen de la nueva opción. Se conservan su caché de modelos, la biblioteca y la base de datos. Toda la aplicación se detiene y se actualiza, como en una actualización. Si la operación falla después de modificar un contenedor, se restauran los contenedores y la opción anteriores. Una operación que se queda a medias se recupera desde el menú de gestión OCI.", + "The main Compose service cannot be identified unambiguously": "No se puede identificar sin ambigüedad el servicio principal de Compose", + "The main Compose service has no image.": "El servicio principal de Compose no tiene imagen.", "The main container of this application is not on this host. Restore it too.": "El contenedor principal de esta aplicación no está en este host. Restáuralo también.", "The main member must stop first and start last": "El miembro principal debe parar primero y comenzar el último", "The main member of the stack is missing": "Falta el miembro principal de la pila", @@ -6852,6 +7022,7 @@ "This guarantees that device nodes are available before applying LXC GPU config.": "Esto garantiza que los nodos del dispositivo estén disponibles antes de aplicar la configuración de GPU LXC.", "This host architecture is not supported by the OCI image importer.": "El importador de imágenes OCI no admite la arquitectura de este host.", "This host has no active subscription, switch to the no-subscription repository? The inaccessible Enterprise PVE source will be disabled. Enterprise Ceph sources, if present, will be disabled without choosing a replacement Ceph channel; configure Ceph separately if needed.": "Este host no tiene una suscripción activa, ¿cambiar al repositorio sin suscripción? La fuente Enterprise de PVE, que no es accesible, se desactivará. Las fuentes Enterprise de Ceph, si existen, se desactivarán sin elegir un canal de Ceph que las sustituya; configura Ceph por separado si lo necesitas.", + "This host runs {name} on {suite}, but these {name} repositories are for another suite: {details}. Disable or remove them in {ui} and run the update again; no repository changed.": "Este host ejecuta {name} en {suite}, pero estos repositorios de {name} son de otra suite: {details}. Desactívalos o elimínalos en {ui} y vuelve a ejecutar la actualización; no se ha modificado ningún repositorio.", "This image cannot be installed as it is described:": "Esta imagen no se puede instalar como se describe:", "This image has no compatible Linux image for this host ({architecture}).": "Esta imagen no tiene una versión Linux compatible con este host ({architecture}).", "This image requires the host module": "Esta imagen requiere el módulo host", @@ -6922,6 +7093,7 @@ "This will add the mount to /etc/fstab so it persists after reboot.": "Esto añadirá el montaje a /etc/fstab para que persista después del reinicio.", "This will completely remove Fail2Ban and its configuration. Continue?": "Esto eliminará por completo Fail2Ban y su configuración. ¿Continuar?", "This will completely remove Lynis from the system. Continue?": "Esto eliminará completamente a Lynis del sistema. ¿Continuar?", + "This will create a New %s. Proceed?": "Se creará una nueva %s. ¿Continuar?", "This will create a new VM": "Esto creará una nueva máquina virtual", "This will deploy a Tailscale VPN gateway for secure remote access.": "Esto implementará una puerta de enlace VPN Tailscale para un acceso remoto seguro.", "This will install and configure Fail2Ban with:": "Esto instalará y configurará Fail2Ban con:", @@ -7028,6 +7200,8 @@ "Umbrel OS installer script by Helper Scripts\n\nVisit the GitHub repo to learn more, contribute, or support the project:\n\nhttps://community-scripts.github.io/ProxmoxVE/scripts?id=umbrel-os-vm": "Script de instalación del sistema operativo Umbrel de Helper Scripts\n\nVisite el repositorio de GitHub para obtener más información, contribuir o apoyar el proyecto:\n\nhttps://community-scripts.github.io/ProxmoxVE/scripts?id=umbrel-os-vm", "Unable to detect Proxmox version": "No se puede detectar la versión de Proxmox", "Unable to detect Proxmox version.": "No se puede detectar la versión de Proxmox.", + "Unable to detect a valid storage location for EFI disk.": "No se puede detectar una ubicación de almacenamiento válida para el disco EFI.", + "Unable to detect a valid storage location.": "No se puede detectar una ubicación de almacenamiento válida.", "Unable to determine the installed memory.": "No se puede determinar la memoria instalada.", "Unable to identify the root filesystem. Aborting.": "No se pudo identificar el sistema de archivos raíz. Se cancela.", "Unable to resolve system ZFS pool disks. Aborting.": "No se pudieron resolver los discos del pool ZFS del sistema. Se cancela.", @@ -7131,6 +7305,7 @@ "Unsupported OCI digest:": "Digest OCI no admitido:", "Unsupported OCI-LXC AppArmor profile:": "Perfil OCI-LXC sin soporte:", "Unsupported OCI-LXC seccomp profile:": "Perfil sin soporte OCI-LXC seccomp:", + "Unsupported Proxmox suite; no repository changed.": "Suite de Proxmox no compatible; no se ha modificado ningún repositorio.", "Unsupported Terminal": "Terminal no compatible", "Unsupported architecture for Figurine:": "Arquitectura no compatible con Figurine:", "Unsupported architecture:": "Arquitectura sin soporte:", @@ -7142,6 +7317,7 @@ "Unsupported device type:": "Tipo de dispositivo sin soporte:", "Unsupported dynamic NVIDIA capabilities:": "Capacidades dinámicas de NVIDIA sin apoyo:", "Unsupported format. Only .ova and .ovf files are supported.": "Formato no compatible. Solo se admiten archivos .ova y .ovf.", + "Unsupported host architecture:": "Arquitectura del host no compatible:", "Unsupported kept setting:": "Ajuste conservado no admitido:", "Unsupported media storage mode:": "Modo de almacenamiento multimedia sin soporte:", "Unsupported mount options": "Opciones de montaje no admitidas", @@ -7187,6 +7363,8 @@ "Update completed. Press Enter to continue...": "Actualización completada. Pulsa Intro para continuar...", "Update credentials": "Actualizar las credenciales", "Update every container of the application": "Actualizar cada contenedor de la aplicación", + "Update for %s completed.": "Actualización de %s completada.", + "Update for %s exited with status %s.": "La actualización de %s terminó con el estado %s.", "Update kernel to compatible version": "Actualizar el kernel a una versión compatible", "Update now?": "¿Actualizar ahora?", "Update package index:": "Actualizar índice del paquete:", @@ -7195,6 +7373,7 @@ "Update system to latest PVE 8.4+ (if not done already):": "Actualiza el sistema a la última versión de PVE 8.4+ (si aún no lo has hecho):", "Update the image with the saved configuration": "Actualizar la imagen con la configuración guardada", "Update the whole stack?": "¿Actualizar toda la pila?", + "Update, modify or recreate one installed OCI instance": "Actualizar, modificar o recrear una instancia OCI instalada", "Updated": "Actualizado", "Updated sharedfiles group to GID: 101000": "Grupo de archivos compartidos actualizado a GID: 101000", "Updated stack checked": "Pila actualizada comprobada", @@ -7206,6 +7385,7 @@ "Updates available": "Actualizaciones disponibles", "Updates file is empty or unreadable.": "El archivo de actualizaciones está vacío o es ilegible.", "Updating": "Actualizando", + "Updating %s (running %s from %s flow)...": "Actualizando %s (ejecutando %s del flujo %s)...", "Updating APT package lists...": "Actualizando listas de paquetes APT...", "Updating Debian Bookworm → Trixie in sources.list...": "Actualizando Debian Bookworm → Trixie en sources.list...", "Updating Figurine binary...": "Actualizando el binario de Figurine...", @@ -7306,7 +7486,20 @@ "Username on the Borg server that runs \"borg serve\" (typically \"borg\"). This is NOT the admin/root user of the server — that one is asked later only if you choose \"Generate a new key and authorize it\".": "Nombre de usuario en el servidor Borg que ejecuta \"borg serve\" (normalmente \"borg\"). NO es el usuario administrador/root del servidor — ese se pide más tarde solo si elige \"Generar una nueva clave y autorizarla\".", "Username:": "Nombre de usuario:", "Users:": "Usuarios:", + "Using Advanced Settings": "Usando configuración avanzada", + "Using BIOS Type:": "Usando tipo de BIOS:", + "Using Bridge:": "Usando puente:", + "Using CPU Model:": "Usando modelo de CPU:", + "Using Custom Image:": "Usando imagen personalizada:", + "Using Default Settings": "Usando configuración predeterminada", + "Using Hostname:": "Usando nombre de host:", + "Using Interface MTU Size:": "Usando tamaño de MTU de la interfaz:", + "Using MAC Address:": "Usando dirección MAC:", + "Using Machine Type:": "Usando tipo de máquina:", "Using UUID is recommended over /dev/sdX.": "Se recomienda usar UUID en lugar de /dev/sdX.", + "Using VLAN:": "Usando VLAN:", + "Using Virtual Machine ID:": "Usando ID de máquina virtual:", + "Using Vlan:": "Usando VLAN:", "Using advanced configuration": "Usando configuración avanzada", "Using default Proxmox logo...": "Usando el logotipo predeterminado de Proxmox...", "Using existing encryption key:": "Usando la clave de cifrado existente:", @@ -7330,6 +7523,8 @@ "VFIO orphans cleared and initramfs rebuilt — next boot will free the GPU.": "VFIO huérfano eliminado e initramfs reconstruido; el próximo arranque liberará la GPU.", "VFIO orphans cleared but initramfs rebuild failed; check /var/log/proxmenux logs.": "Los huérfanos de VFIO se limpiaron, pero la reconstrucción de initramfs falló; revisa los logs en /var/log/proxmenux.", "VFS cache mode": "Modo de caché VFS", + "VIRTUAL DISK": "DISCO VIRTUAL", + "VIRTUAL MACHINE ID": "ID DE MÁQUINA VIRTUAL", "VLAN": "VLAN", "VLC Media Player is a free and open source cross-platform multimedia player and framework that delivers dependable performance across multiple devices.": "VLC Media Player es un reproductor y framework multimedia gratuito, de código abierto y multiplataforma que ofrece un rendimiento fiable en múltiples dispositivos.", "VM": "VM", @@ -7341,6 +7536,7 @@ "VM Storage (images, backup)": "Discos de VM (images, backup)", "VM and CT Management Commands": "Comandos de gestión de VM y CT", "VM and CT backup jobs (Datacenter > Backup)": "Trabajos de backup de VM y CT (Datacenter > Backup)", + "VM created with errors. Check configuration.": "VM creada con errores. Revisa la configuración.", "VM creation cancelled before disk planning.": "La creación de VM se canceló antes de la planificación del disco.", "VM creation cancelled by user.": "Creación de VM cancelada por el usuario.", "VM creation completed": "Creación de VM completada", @@ -7436,6 +7632,7 @@ "Virtual Function": "Función Virtual", "Virtual Function (parent PF:": "Función virtual (PF principal:", "Virtual Machine ID": "ID de máquina virtual", + "Virtual Machine ID:": "ID de máquina virtual:", "Virtual disk": "Disco virtual", "Virtual disks": "Discos virtuales", "Virtual display already set to": "Pantalla virtual ya configurada en", @@ -7452,6 +7649,7 @@ "Volume configuration cancelled": "Configuración de volumen cancelada", "Volume options are not yet supported": "Todavía no se admiten opciones de volumen", "Volume size in GB": "Tamaño del volumen en GB", + "Volumes": "Volúmenes", "Volumes attached": "Volumen adjunto", "Volumes prepared for the first start:": "Volúmenes preparados para el primer arranque:", "Volumes shared between services are not yet supported": "Todavía no se admiten volúmenes compartidos entre los servicios", @@ -7651,6 +7849,7 @@ "ZRAM profile removed, but package purge failed": "Se eliminó el perfil de ZRAM, pero falló la purga del paquete", "ZRAM still holds pages; configuration was preserved": "ZRAM todavía contiene páginas; se conservó la configuración", "ZRAM still holds pages; profile remains active": "ZRAM todavía contiene páginas; el perfil sigue activo", + "ZRAM swap profile": "Perfil de swap con ZRAM", "ZRAM swap profile enabled": "Perfil de swap con ZRAM activado", "ZRAM swap profile removed": "Perfil de swap con ZRAM eliminado", "ZSTD - fast, good ratio (recommended)": "ZSTD - rápido, buena compresión (recomendado)", @@ -7717,6 +7916,7 @@ "chmod 1777 + setfacl o::rwx (applied on the NFS share from this host)": "chmod 1777 + setfacl o::rwx (aplicado en el recurso compartido NFS de este host)", "chmod failed — NFS server may be restricting changes from root": "chmod falló: el servidor NFS puede estar restringiendo los cambios desde la raíz", "chown/chmod failed — likely unprivileged CT against host bind mount. Falling back to ACL.": "chown/chmod falló: probablemente CT sin privilegios contra el montaje de enlace del host. Regresando a ACL.", + "clone source mount tree": "clonar el árbol de montaje de origen", "containers": "contenedores", "containers of": "contenedores de", "content:": "contenido:", @@ -7756,6 +7956,7 @@ "driver:": "controlador:", "e.g.": "por ejemplo", "empty = generate": "vacío = generar", + "enter container namespace": "entrar en el espacio de nombres del contenedor", "exFAT (portable: Windows/Linux/macOS)": "exFAT (portátil: Windows/Linux/macOS)", "exFAT tools installed successfully.": "Herramientas exFAT instaladas correctamente.", "experimental on this GPU": "experimental en esta GPU", @@ -7788,10 +7989,12 @@ "fstab entry exists": "la entrada fstab existe", "fstab line:": "línea fstab:", "fstab references UUIDs/devices not present on this host:": "fstab hace referencia a UUID/dispositivos que no están presentes en este host:", + "function '%s' is not defined in the %s flow.": "la función '%s' no está definida en el flujo %s.", "gasket DKMS entries removed.": "Entradas de gasket eliminadas de DKMS.", "gasket-dkms has been fully removed from this system.": "gasket-dkms se ha eliminado por completo del sistema.", "gasket-dkms is still reported by dpkg in state:": "dpkg todavía muestra gasket-dkms con el estado:", "gawk installed": "gawk instalado", + "genisoimage/mkisofs not found.": "No se encontró genisoimage/mkisofs.", "go2rtc WebUI": "go2rtc WebUI", "google/gasket-driver cloned (fallback — will apply local patches).": "google/gasket-driver clonado (alternativa; se aplicarán parches locales).", "gpg not found; trying apt-key fallback": "gpg no encontrado; se prueba la alternativa apt-key", @@ -7834,6 +8037,7 @@ "individual template is blocked": "la plantilla individual está bloqueada", "initramfs updated": "initramfs actualizado", "initramfs updated.": "initramfs actualizado.", + "installable": "instalable", "installed": "instalado", "installed but command not immediately available": "instalado pero el comando no está disponible inmediatamente", "installed correctly and available": "instalado correctamente y disponible", @@ -7850,6 +8054,7 @@ "intel_iommu/amd_iommu is set in cmdline but no IOMMU groups exist — IOMMU appears disabled in BIOS. Enable VT-d / AMD-Vi in firmware before continuing.": "intel_iommu/amd_iommu está configurado en cmdline pero no existen grupos IOMMU; IOMMU aparece deshabilitado en BIOS. Activa VT-d/AMD-Vi en el firmware antes de continuar.", "interfaces": "interfaces", "into an LXC.": "en un LXC.", + "invalid source '%s' (must be 'auto', 'custom', or 'detected')": "origen no válido '%s' (debe ser 'auto', 'custom' o 'detected')", "iperf3 - Bandwidth test": "iperf3 - Prueba de ancho de banda", "iperf3 - Bandwidth test (Client mode)": "iperf3 - Prueba de ancho de banda (modo cliente)", "iperf3 - Bandwidth test (Server mode)": "iperf3 - Prueba de ancho de banda (modo servidor)", @@ -7876,9 +8081,12 @@ "is one of the": "es uno de los", "is referenced in the following stopped VM(s)/CT(s):": "se hace referencia en las siguientes VM/CT detenidas:", "it asks for the network of the host; the container gets its own address instead": "pide la red del host; el contenedor obtiene su propia dirección en su lugar", + "it asks for two different memory limits": "pide dos límites de memoria distintos", "it could not be started:": "no se pudo iniciar:", + "it describes more than one image": "describe más de una imagen", "it is locked or its disk could not be mounted": "está bloqueado o no se pudo montar su disco", "it publishes no other architecture": "no publica ninguna otra arquitectura", + "it uses Compose configs, which have no equivalent here": "usa configs de Compose, que aquí no tienen equivalente", "it uses an NVIDIA GPU and this host has no working NVIDIA driver and Container Toolkit. Install them and run the recovery again.": "usa una GPU NVIDIA y este host no tiene el driver de NVIDIA y el Container Toolkit en funcionamiento. Instálalos y vuelve a lanzar la recuperación.", "it uses the Compose option": "utiliza la opción Compose", "its NVIDIA runtime could not be rebuilt for the driver of this host; the container will not start until it is installed again:": "no se pudo reconstruir su runtime de NVIDIA para el driver de este host; el contenedor no arrancará hasta que se instale de nuevo:", @@ -7886,10 +8094,13 @@ "its Rclone mount is published by a host script that a backup does not include. Enable the mount again from the Rclone entry of the catalog before starting it.": "su montaje de Rclone lo publica un script del host que un backup no incluye. Activa de nuevo el montaje desde la entrada de Rclone del catálogo antes de iniciarlo.", "its backup was made before ProxMenux kept the record inside the container": "su backup es anterior a que ProxMenux guardara el registro dentro del contenedor", "its configuration could not be read": "no se pudo leer su configuración", + "its health check is not written in a way that can be read": "su comprobación de estado no está escrita de una forma que se pueda leer", "its hookscript does not exist on this host:": "su hookscript no existe en este host:", "its host firewall rule was not added:": "no se añadió su regla del firewall del host:", "its include exists with other content:": "su include existe con otro contenido:", "its record is missing and it was not found among the restored containers": "falta su registro y no está entre los contenedores restaurados", + "its shared memory size is not written in a way that can be read": "su tamaño de memoria compartida no está escrito de una forma que se pueda leer", + "its stop timeout is not written in a way that can be read": "su tiempo de espera de parada no está escrito de una forma que se pueda leer", "journald MaxLevelStore is adequate for auth logging": "journald MaxLevelStore es adecuado para registrar la autenticación", "journald drop-in created: /etc/systemd/journald.conf.d/proxmenux-loglevel.conf": "drop-in de diario creado: /etc/systemd/journald.conf.d/proxmenux-loglevel.conf", "journald log level restored": "Nivel de log de journald restaurado", @@ -7905,6 +8116,7 @@ "keep-weekly (0 disables)": "mantener semanal (0 inhabilitaciones)", "keep-yearly (0 disables)": "mantener anual (0 inhabilitaciones)", "keeping current settings": "manteniendo la configuración actual", + "kernel": "kernel", "kexec configured successfully. Use the command: reboot-quick": "kexec configurado correctamente. Utiliza el comando: reboot-quick", "kexec-pve service enabled": "servicio kexec-pve habilitado", "kexec-pve service file created": "archivo de servicio kexec-pve creado", @@ -7917,12 +8129,15 @@ "layers": "capas", "legacy .link file(s) to the ProxMenux-managed format": "archivo(s) .link antiguos al formato gestionado por ProxMenux", "log2ram completely removed from system": "log2ram completamente eliminado del sistema", + "main container of the application": "contenedor principal de la aplicación", + "make cloned mount tree read-only": "hacer de solo lectura el árbol de montaje clonado", "manually inside the container before starting it.": "manualmente dentro del contenedor antes de ponerlo en marcha.", "manually inside the container.": "manualmente dentro del contenedor.", "maximum performance": "máximo rendimiento", "may be closed — trying discovery anyway...": "puede estar cerrado; intentando el descubrimiento de todos modos...", "melonDS aims at providing fast and accurate Nintendo DS emulation.": "melonDS busca ofrecer una emulación de Nintendo DS rápida y precisa.", "members:": "miembros:", + "memory": "memoria", "minimum": "mínimo", "missing": "faltan", "mkfs.btrfs not found. Install btrfs-progs and retry.": "mkfs.btrfs no encontrado. Instala btrfs-progs y vuelve a intentarlo.", @@ -7937,6 +8152,7 @@ "needs a relaxed AppArmor or seccomp profile": "necesita un perfil de AppArmor o seccomp relajado", "needs stack review": "necesita revisión de pila", "needs these external services, already running:": "necesita estos servicios externos, ya en funcionamiento:", + "network": "red", "never": "nunca", "next free": "siguiente libre", "next free block": "siguiente bloque libre", @@ -7947,11 +8163,14 @@ "no declarative value": "sin valor declarativo", "no passphrase": "sin frase de contraseña", "no password": "sin contraseña", + "no-subscription repository": "repositorio sin suscripción", "no_root_squash": "no_root_squash", "non-ProxMenux .tar archive(s) in this path": "archivo(s) .tar que no son de ProxMenux en esta ruta", + "none": "ninguno", "not available yet": "aún no disponible", "not changed": "sin cambios", "not found.": "extraviado.", + "not generated": "sin generar", "not installed": "no instalado", "not reliable on this hardware due to the following limitations": "no es fiable en este hardware por las siguientes limitaciones", "nouveau driver has been blacklisted.": "El controlador nouveau se ha puesto en la lista negra.", @@ -7991,6 +8210,7 @@ "pct exec authorization failed": "Ha fallado la autorización de pct exec", "pct push failed. Check log:": "pct push falló. Revisa el log:", "pending (reboot required to enumerate full group)": "pendiente (es necesario reiniciar para enumerar el grupo completo)", + "pending adaptation": "pendiente de adaptación", "phpMyAdmin is installed with arbitrary server connections enabled: the login page has a Server field where the address of the MySQL or MariaDB server is entered, together with its user and password.": "phpMyAdmin se instala con conexiones de servidor arbitrarias habilitadas: la página de inicio de sesión tiene un campo Server donde se introduce la dirección del servidor MySQL o MariaDB, junto con su usuario y contraseña.", "pigz configuration completed": "configuración de pigz completada", "pigz enabled in vzdump configuration": "pigz habilitado en la configuración de vzdump", @@ -8000,10 +8220,13 @@ "playit.gg has to claim this agent before it forwards anything. The agent prints a one-time claim link on the container console and keeps it there until the link is opened.": "playit.gg tiene que reclamar este agente antes de redirigir nada. El agente muestra un enlace de reclamación de un solo uso en la consola del contenedor y lo mantiene hasta que se abre el enlace.", "port": "puerto", "portmapper/rpcbind has been disabled": "portmapper/rpcbind ha sido deshabilitado", + "print the estimated unpacked size in MiB (0 when unknown)": "mostrar el tamaño estimado descomprimido en MiB (0 si se desconoce)", "private network assigned automatically": "red privada asignada automáticamente", "privileged LXC": "LXC privilegiado", + "provide either SOURCE_TYPE+FUNCTION_NAME (single mode) or FUNCTIONS_BATCH (batch mode).": "indica SOURCE_TYPE+FUNCTION_NAME (modo único) o FUNCTIONS_BATCH (modo por lotes).", "proxmox-backup-client reported:": "proxmox-backup-client informó:", "proxmox-boot-tool refreshed": "herramienta de arranque proxmox actualizada", + "publish mount tree": "publicar el árbol de montaje", "pve-enterprise.list update skipped (no change)": "Actualización de pve-enterprise.list omitida (sin cambios)", "pve-enterprise.list updated to Trixie": "pve-enterprise.list actualizado a Trixie", "pvecm command not found (might not be in a cluster)": "No se encontró el comando pvecm (puede que no esté en un clúster)", @@ -8016,6 +8239,7 @@ "pvesm status failed": "Ha fallado pvesm status", "pyLoad is a Free and Open Source download manager written in Python and designed to be extremely lightweight, easily extensible and fully manageable via web.": "pyLoad es un gestor de descargas libre y de código abierto escrito en Python, diseñado para ser muy ligero, fácil de ampliar y totalmente gestionable por web.", "pyLoad web interface": "Interfaz web de pyLoad", + "python3-jsonschema is required to generate templates": "Se necesita python3-jsonschema para generar plantillas", "qBittorrent WebUI password (user: admin)": "contraseña de qBittorrent WebUI (usuario: admin)", "qBittorrent already has a configuration; it is not overwritten": "qBittorrent ya tiene una configuración; no está sobrescrito", "qBittorrent configured": "qBittorrent configurado", @@ -8037,12 +8261,14 @@ "removed from Proxmox": "eliminado de Proxmox", "removed in Proxmox": "eliminada en Proxmox", "removed successfully from Proxmox.": "eliminado correctamente de Proxmox.", + "removed unused image archive: {path} ({size} bytes)": "archivo de imagen sin usar eliminado: {path} ({size} bytes)", "requires running the official installer, which restarts the Monitor service.": "requiere ejecutar el instalador oficial, que reinicia el servicio del Monitor.", "requires the package": "requiere el paquete", "restarted successfully": "reiniciado correctamente", "restoring /etc/network would lose connectivity": "restaurar /etc/network perdería conectividad", "restoring on:": "restaurar en:", "retries": "reintentos", + "return to host namespace": "volver al espacio de nombres del host", "reverse proxy": "proxy inverso", "root and real users only": "Solo root y usuarios reales", "rpcbind could not be disabled completely": "rpcbind no se pudo desactivar por completo", @@ -8087,6 +8313,7 @@ "storage yet.": "almacenamiento todavía.", "storage(s) from backup exist on target": "los almacenamientos del backup existen en el destino", "storage.": "almacenamiento.", + "subscription banner": "banner de suscripción", "successfully formatted with": "formateado correctamente con", "suggested:": "sugerido:", "switch_gpu_mode.sh was not found.": "No se encontró switch_gpu_mode.sh.", @@ -8095,18 +8322,22 @@ "systemctl restart networking failed:": "systemctl restart networking falló:", "systemd OnCalendar expression": "expresión systemd OnCalendar", "the API key was not generated on the first start": "la clave de API no se generó en el primer arranque", + "the GPU did not answer in time": "la GPU no respondió a tiempo", "the NVIDIA hook of the container is not available:": "el hook de NVIDIA del contenedor no está disponible:", "the bridge does not exist on this host:": "el bridge no existe en este host:", "the bridge exists on this host with another network:": "el bridge existe en este host con otra red:", "the container has its own address, so the port Docker published on the host is not needed": "el contenedor tiene su propia dirección, por lo que el puerto Docker publicado en el host no es necesario", "the containers do not agree on the private network of": "los contenedores no coinciden en la red privada de", "the device does not exist on this host:": "el dispositivo no existe en este host:", + "the devices it asks for are not written in a way that can be read": "los dispositivos que pide no están escritos de una forma que se pueda leer", "the host directory does not exist:": "el directorio del host no existe:", "the host firewall rule of the installation is not added again; allow its port in the firewall of this host if you use it.": "la regla del firewall del host de la instalación no se vuelve a añadir; permite su puerto en el firewall de este host si lo usas.", + "the memory limit it asks for cannot be applied": "no se puede aplicar el límite de memoria que pide", "the minimum number of characters is": "el número mínimo de caracteres es", "the qBittorrent schema is not available": "el esquema qBittorrent no está disponible", "the record it carries does not belong to this container": "el registro que lleva no pertenece a este contenedor", "the record of the application does not list this container": "el registro de la aplicación no incluye este contenedor", + "the resource limits it asks for cannot be applied": "no se pueden aplicar los límites de recursos que pide", "the settings of its include are not in the record:": "los ajustes de su include no están en el registro:", "the start order of its dependencies is not in the record": "el orden de arranque de sus dependencias no está en el registro", "this configuration needs the device": "esta configuración necesita el dispositivo", @@ -8131,6 +8362,7 @@ "unsupported dependency condition": "condición de dependencia no admitida", "unsupported external credential or boolean": "credencial externa o booleano no admitidos", "unsupported variable": "variable no admitida", + "update for %s exited with status %s.": "la actualización de %s terminó con el estado %s.", "updating": "actualizando", "updating NVIDIA userspace libs": "actualizando las bibliotecas del espacio de usuario de NVIDIA", "user packages missing — will be installed automatically:": "faltan paquetes de usuario; se instalarán automáticamente:", @@ -8159,6 +8391,7 @@ "with Proxmox": "con Proxmox", "with prefix, e.g.": "con prefijo, por ejemplo", "with the password you provided.": "con la contraseña que proporcionaste.", + "x-casaos.main must name an existing service.": "x-casaos.main debe indicar un servicio existente.", "xemu is a free and open-source application that emulates the original Microsoft Xbox game console, enabling people to play their original Xbox games on Windows, macOS, and Linux systems.": "xemu es una aplicación gratuita y de código abierto que emula la consola Xbox original de Microsoft y permite jugar a sus juegos en Windows, macOS y Linux.", "xfs — Proxmox dir storage (large files and VMs)": "xfs — dir de Proxmox (archivos grandes y VM)", "xfs — better for large files": "xfs — mejor para archivos grandes", @@ -8174,6 +8407,7 @@ "zfs-auto-snapshot removed (existing snapshots preserved on the pool)": "zfs-auto-snapshot eliminado (los snapshots existentes se conservan en el pool)", "zpool command not found. Install zfsutils-linux and retry.": "Comando zpool no encontrado. Instala zfsutils-linux y vuelve a intentarlo.", "zpool not found. Install zfsutils-linux and retry.": "zpool no encontrado. Instala zfsutils-linux y vuelve a intentarlo.", + "{application} runs in {count} containers.": "{application} se ejecuta en {count} contenedores.", "{count} saved account.": "{count} cuenta guardada.", "{count} saved accounts.": "{count} cuentas guardadas.", "{path} already exists and belongs to another user of the host, so {app} cannot write to it.\n\nProxMenux can add access rules (ACL) to this directory, to everything inside it and to what is created there later, for the users and groups {app} runs as on the host (IDs {ids}). The owner of the files does not change and whatever reads or writes them today keeps doing so; the owner of the directory also gets access to the files {app} creates.\n\nGrant {app} access to this directory?": "{path} ya existe y pertenece a otro usuario del host, así que {app} no puede escribir en él.\n\nProxMenux puede añadir reglas de acceso (ACL) a este directorio, a todo lo que contiene y a lo que se cree en él después, para los usuarios y grupos con los que {app} se ejecuta en el host (ID {ids}). El propietario de los archivos no cambia y lo que hoy los lee o escribe lo sigue haciendo; el propietario del directorio también tiene acceso a los archivos que cree {app}.\n\n¿Dar acceso a {app} a este directorio?", diff --git a/lang/fr.json b/lang/fr.json index ea6652cd..437ed1a4 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -1,6 +1,9 @@ { "# Alternative if you prefer screen": "# Alternative si vous préférez l'écran", "# Recommended: avoids disconnection during upgrade": "# Recommandé : évite la déconnexion lors de la mise à niveau", + "%s of %s updates failed — see the messages above.": "%s mises à jour sur %s ont échoué — consultez les messages ci-dessus.", + "%s of %s updates failed.": "%s mises à jour sur %s ont échoué.", + "'auto'/'local', or root@IP for development": "'auto'/'local', ou root@IP pour le développement", "(Checked entries will be removed. Uncheck to keep in VM.)": "(Les entrées cochées seront supprimées. Décochez pour conserver dans la VM.)", "(Import is selected by default — required for disk image imports)": "(L'importation est sélectionnée par défaut - requise pour les importations d'images disque)", "(Only the host directory is modified. Nothing inside the container is changed.": "(Seul le répertoire hôte est modifié. Rien à l’intérieur du conteneur n’est modifié.", @@ -163,6 +166,7 @@ "APT configured to skip additional languages": "APT configuré pour ignorer les langues supplémentaires", "APT configured to skip downloading additional languages": "APT configuré pour ignorer le téléchargement de langues supplémentaires", "APT configured to use IPv4": "APT configuré pour utiliser IPv4", + "APT hook syntax issue, removing...": "Problème de syntaxe du hook APT, suppression...", "APT index update failed after switching to no-subscription. See log:": "La mise à jour de l'index APT a échoué après le passage en mode sans abonnement. Voir le journal :", "APT index update failed. See log:": "La mise à jour de l'index APT a échoué. Voir le journal :", "APT indexes updated for Trixie": "Index APT mis à jour pour Trixie", @@ -210,6 +214,7 @@ "Activate ProxMenux Monitor": "Activer le ProxMenux Monitor", "Active": "Actif", "Active Connections": "Connexions actives", + "Active ZRAM algorithm, capacity or swap sources did not match the profile": "L'algorithme, la capacité ou les sources d'échange ZRAM actifs ne correspondaient pas au profil", "Active exports:": "Exportations actives :", "Active session:": "Séance active :", "Actual device path on the host": "Chemin réel du périphérique sur l'hôte", @@ -263,6 +268,7 @@ "Add or remove extra paths and devices": "Ajouter ou supprimer des chemins et des appareils supplémentaires", "Add physical disk to VM via": "Ajouter un disque physique à la VM via", "Add share block in /etc/samba/smb.conf:": "Ajoutez un bloc de partage dans /etc/samba/smb.conf :", + "Add the host firewall rule of this container; one option for each confirmed rule": "Ajouter la règle de pare-feu de l'hôte de ce conteneur ; une option par règle confirmée", "Add unprivileged flag to container configuration:": "Ajoutez un indicateur sans privilèges à la configuration du conteneur :", "Add virtual disk": "Ajouter un disque virtuel", "Add: Mount Host Directory into LXC": "Ajouter : Monter le répertoire hôte dans LXC", @@ -337,6 +343,7 @@ "Aliases added to .bashrc": "Alias ajoutés à .bashrc", "Alist Sync web interface": "Alist Interface web Sync", "All": "Tous", + "All %s update(s) completed successfully.": "%s mise(s) à jour terminée(s) avec succès.", "All Available Scripts": "Tous les scripts disponibles", "All GPUs Already Assigned": "Tous les GPU déjà attribués", "All ProxMenux optimizations are up to date.": "Toutes les optimisations de ProxMenux sont à jour.", @@ -367,6 +374,9 @@ "All {count} containers of the application will be recreated from their saved image digests (main CT: {vmid}). The stack is stopped, every container is backed up and replaced, then checked. If the operation fails after a container was changed, the backups are restored. An operation that stops halfway is recovered from the OCI management menu.": "Les {count} conteneurs de l'application seront recréés à partir de leurs digests d'image enregistrés (CT principal : {vmid}). La pile est arrêtée, chaque conteneur est sauvegardé et remplacé, puis vérifié. Si l'opération échoue après le changement d'un conteneur, les sauvegardes sont restaurées. Une opération qui s'arrête à mi-chemin est récupérée depuis le menu de gestion OCI.", "Allocate CPU Cores": "Allouer des cœurs de processeur", "Allocate RAM in MiB": "Allouer de la RAM en MiB", + "Allocated Cores:": "Cœurs alloués :", + "Allocated RAM:": "RAM allouée :", + "Allocating virtual disk for %s...": "Allocation du disque virtuel pour %s...", "Allow TCP port {port} from {subnet} through the host firewall? Existing firewall rules are not changed.": "Autoriser le port TCP {port} de {subnet} via le pare-feu hôte ?Les règles de pare-feu existantes ne sont pas modifiées.", "Allowed hosts (comma separated; * allows access through the assigned IP)": "Hôtes autorisés (comma séparé ; * permet l'accès via l'IP assigné)", "Allowed source subnet:": "Sous-réseau source autorisé :", @@ -407,6 +417,7 @@ "Analyzing selected disks...": "Analyse des disques sélectionnés...", "Analyzing system for available PCIe storage devices...": "Système d'analyse des périphériques de stockage PCIe disponibles...", "Another OCI operation is using the instance registry": "Un autre OCI operation utilise le registre d'instance", + "Another OCI operation is using the instance registry.": "Une autre opération OCI utilise le registre des instances.", "Another OCI operation is using the instance registry. Wait for it to finish and open this menu again; no container is modified.": "Un autre OCI operation utilise le registre des instances. Attendez qu'il finisse et ouvrez à nouveau ce menu; aucun conteneur n'est modifié.", "Another OCI operation is using the instance registry. Wait for it to finish.": "Une autre opération OCI utilise le registre d'instance. Attendez que ça se termine.", "Another OCI operation is using the registry. This operation was not started.": "Un autre OCI operation utilise le registre. Ce opera n'a pas commencé.", @@ -421,6 +432,7 @@ "Another registry account operation is running. Try again when it finishes.": "Une autre opération de compte de registre est en cours. Réessayez une fois terminé.", "Another stack operation is pending": "Une autre pile operation est en attente", "Application": "Demande", + "Application data": "Données de l'application", "Application registered on this host:": "Application enregistrée sur cet hôte :", "Application responding:": "Réponse à la demande :", "Application responding; checking its stability...": "Application répondant; contrôle de sa stabilité...", @@ -566,6 +578,7 @@ "BIOS from": "BIOS de", "BIOS: OVMF (UEFI)": "BIOS : OVMF (UEFI)", "BOINC is a platform for high-throughput computing on a large scale (thousands or millions of computers). It can be used for volunteer computing (using consumer devices) or grid computing (using organizational resources). It supports virtualized, parallel, and GPU-based applications.": "BOINC est une plateforme de calcul à haut débit à grande échelle (en milliers ou en millions d'ordinateurs). Il peut être utilisé pour l'informatique bénévole (à l'aide d'appareils grand public) ou l'informatique par grille (à l'aide de ressources organisationnelles). Il prend en charge les applications virtualisées, parallèles et GPU.", + "BRIDGE": "PONT", "BRIDGE CONFIGURATION ANALYSIS": "ANALYSE DE LA CONFIGURATION DU PONT", "BTRFS:": "BTRFS :", "Baby Buddy web interface": "Interface web Baby Buddy", @@ -628,6 +641,7 @@ "Bandwidth limit configured": "Limite de bande passante configurée", "Bandwidth test (iperf3)": "Test de bande passante (iperf3)", "Bandwidth test completed successfully": "Test de bande passante terminé avec succès", + "Banner removal cancelled by user.": "Suppression de la bannière annulée par l'utilisateur.", "Base VM created with ID": "VM de base créée avec l'ID", "Base VMID": "VMID de base", "Base VMID (empty = next free block)": "VMID de base (vide = prochain bloc libre)", @@ -657,6 +671,7 @@ "Blocked GPU ID for VM Mode": "ID GPU bloqué pour le mode VM", "Blocked device(s)": "Appareil(s) bloqué(s)", "Blocked device(s):": "Appareil(s) bloqué(s) :", + "Blockers": "Blocages", "BookStack web interface": "Interface web BookStack", "Bookstack is a free and open source Wiki designed for creating beautiful documentation. Featuring a simple, but powerful WYSIWYG editor it allows for teams to create detailed and useful documentation with ease.": "Bookstack est un Wiki libre et open source conçu pour créer une belle documentation. Doté d'un éditeur WYSIWYG simple mais puissant, il permet aux équipes de créer facilement une documentation détaillée et utile.", "Boot Disk": "Disque de démarrage", @@ -691,6 +706,7 @@ "Build and install the gasket and apex kernel modules (DKMS)": "Compiler et installer les modules noyau gasket et apex (DKMS)", "Build dependencies installed.": "Dépendances de build installées.", "Build your personal knowledge base with TriliumNext Notes": "Construisez votre base de connaissances personnelles avec TriliumNext Notes", + "Bulk generation requires GITHUB_TOKEN to obtain an immutable revision per application": "La génération en masse nécessite GITHUB_TOKEN pour obtenir une révision immuable par application", "Business & ERP": "Entreprise et ERP", "CHANGES APPLIED SUCCESSFULLY": "MODIFICATIONS APPLIQUÉES AVEC SUCCÈS", "CIFS Client Tools: AVAILABLE": "Outils clients CIFS : DISPONIBLES", @@ -709,6 +725,7 @@ "CLUSTER UPGRADE NOTES:": "REMARQUES SUR LA MISE À NIVEAU DU CLUSTER :", "CONFIGURED INTERFACES": "INTERFACES CONFIGURÉES", "CONFIRM FORMAT": "CONFIRMER LE FORMAT", + "CORE COUNT": "NOMBRE DE CŒURS", "CPU": "CPU", "CPU Cores": "Cœurs de processeur", "CPU MODEL": "MODÈLE DE CPU", @@ -720,7 +737,11 @@ "CRITICAL: The selected disk is referenced by a RUNNING VM or CT.": "CRITIQUE : le disque sélectionné est référencé par une VM ou un CT en cours d'exécution.", "CT": "CT", "CT started successfully.": "CT a démarré avec succès.", + "CT {vmid} ({name}) could not be kept running; it is left stopped": "Le CT {vmid} ({name}) n'a pas pu être maintenu en marche ; il reste arrêté", + "CT {vmid} ({name}) stopped on its own; starting it again (attempt {attempt})": "Le CT {vmid} ({name}) s'est arrêté de lui-même ; nouveau démarrage (tentative {attempt})", "CT {vmid} is a host monitor and had a rule in the host firewall. Allow TCP port {port} from {subnet} through the firewall of this host? Existing firewall rules are not changed.": "CT {vmid} est un moniteur de l'hôte et avait une règle dans le pare-feu de l'hôte. Autoriser le port TCP {port} depuis {subnet} dans le pare-feu de cet hôte ? Les règles de pare-feu existantes ne sont pas modifiées.", + "CT {vmid} is one of the {count} containers of {application}.": "Le CT {vmid} est l'un des {count} conteneurs de {application}.", + "CT {vmid}: DHCP client of {name} (IPv{version}) started again": "CT {vmid} : client DHCP de {name} (IPv{version}) redémarré", "CUDA requires a working NVIDIA driver": "CUDA requires un pilote NVIDIA fonctionnant", "CUDA requires the NVIDIA Container Toolkit on the host": "CUDA requires la boîte à outils de conteneur NVIDIA sur l'hôte", "Calculate all kinds of statistics from your (local) Emby or Jellyfin server": "Calculez toutes sortes de statistiques à partir de votre serveur (local) Emby ou Jellyfin", @@ -737,6 +758,7 @@ "Cannot continue": "Impossible de continuer", "Cannot create:": "Impossible de créer :", "Cannot detect filesystem on": "Impossible de détecter le système de fichiers sur", + "Cannot determine installed systemd-zram-generator version": "Impossible de déterminer la version installée de systemd-zram-generator", "Cannot find": "Impossible de trouver", "Cannot identify the vendor of the device:": "Impossible d'identifier le fournisseur de l'appareil :", "Cannot inspect current swap configuration": "Impossible d'inspecter la configuration actuelle du swap", @@ -871,8 +893,11 @@ "Checklist post-upgrade finished. Warnings:": "Liste de contrôle après la mise à niveau terminée. Avertissements :", "Checklist pre-check finished. Warnings:": "Pré-vérification de la liste de contrôle terminée. Avertissements :", "Checks for LVM and storage issues": "Vérifie les problèmes de LVM et de stockage", + "Choose": "Choisissez", + "Choose BIOS Type": "Choisissez le type de BIOS", "Choose BIOS type": "Choisissez le type de BIOS", "Choose No to abort and roll back to the legacy refuse behaviour.": "Choisissez Non pour abandonner et revenir au comportement de refus hérité.", + "Choose Type": "Choisissez le type", "Choose ZimaOS image option:": "Choisissez l'option d'image ZimaOS :", "Choose a Samba server:": "Choisissez un serveur Samba :", "Choose a Windows ISO to use:": "Choisissez un ISO Windows à utiliser :", @@ -972,10 +997,12 @@ "Cluster configuration (advanced)": "Configuration du cluster (avancé)", "Cluster data will be applied automatically at next boot.": "les données du cluster seront appliquées automatiquement au prochain démarrage.", "Cluster upgrade mode": "Mode de mise à niveau du cluster", + "Code": "Code", "Code-server is VS Code running on a remote server, accessible through the browser.": "Code-serveur est VS Code fonctionnant sur un serveur distant, accessible par le navigateur.", "CodeProject.AI Server": "CodeProject. AI Server", "Command": "Commande", "Command failed": "Échec de la commande", + "Command not found.": "Commande introuvable.", "Command override for an unknown service:": "Dépassement de commande pour un service inconnu :", "Commenting any residual Bookworm lines in *.list...": "Commenter les lignes résiduelles de Bookworm dans *.list...", "Commenting legacy PVE 8 repository .list files (if any)...": "Commentaire des anciens fichiers .list du référentiel PVE 8 (le cas échéant)...", @@ -1017,8 +1044,11 @@ "Component:": "Composant :", "Components to uninstall (manual for now):": "Composants à désinstaller (manuel pour l'instant) :", "Compose capabilities validated in the LXC user namespace:": "Composez les capacités validées dans l'espace de noms d'utilisateur LXC :", + "Compose environment must be a list or a mapping.": "L'environnement Compose doit être une liste ou un mappage.", "Compose file of the application": "Composer le dossier de la demande", "Compose file of this host": "Composez le fichier de cet hôte", + "Compose ports must be a list.": "Les ports Compose doivent être une liste.", + "Compose volumes must be a list.": "Les volumes Compose doivent être une liste.", "Compressed size:": "Taille compressée :", "Compressing": "Compression", "Compression": "Compression", @@ -1057,6 +1087,7 @@ "Configure Proxmox APT repositories": "Configurer les référentiels Proxmox APT", "Configure Samba Client in LXC (only privileged)": "Configurer le client Samba dans LXC (uniquement privilégié)", "Configure Samba Server in LXC (only privileged)": "Configurer le serveur Samba dans LXC (uniquement privilégié)", + "Configure and install an application": "Configurer et installer une application", "Configure as guest (no authentication)": "Configurer en tant qu'invité (pas d'authentification)", "Configure backup destinations": "Configurer les destinations de sauvegarde", "Configure backup destinations (PBS, Borg, local)": "Configurer les destinations de sauvegarde (PBS, Borg, local)", @@ -1065,7 +1096,12 @@ "Configure the remote in the Rclone Web UI first. Checking its name may start a stopped CT, even in a dry run. Applying the mount restarts the CT and attempts to publish two FUSE views on the host; a dry run does not publish them.": "configurez d'abord la télécommande dans l'interface utilisateur Web Rclone. La vérification de son nom peut démarrer un CT arrêté, même lors d'un essai à blanc. L'application du montage redémarre le CT et tente de publier deux vues FUSE sur l'hôte ;un essai à sec ne les publie pas.", "Configure with username and password": "Configurer avec nom d'utilisateur et mot de passe", "Configured Ports": "Ports configurés", + "Configured VM description": "Description de la VM configurée", "Configured but doesn't exist": "Configuré mais n'existe pas", + "Configured controller/NVMe as hostpci%s: %s": "Contrôleur/NVMe configuré en tant que hostpci%s : %s", + "Configured import disk %s as %s": "Disque d'importation %s configuré en tant que %s", + "Configured loader disk as ide0": "Disque du chargeur configuré en tant que ide0", + "Configured virtual disk as %s, %sGB on %s": "Disque virtuel configuré en tant que %s, %sGB sur %s", "Configuring AMD GPU passthrough...": "Configuration du relais GPU AMD...", "Configuring AMD softdep...": "Configuration du logiciel AMD...", "Configuring APT to skip downloading additional languages": "Configurer APT pour ignorer le téléchargement de langues supplémentaires", @@ -1086,6 +1122,7 @@ "Configuring Proxmox APT repositories...": "Configuration des référentiels Proxmox APT...", "Configuring Proxmox filter...": "Configuration du filtre Proxmox...", "Configuring Proxmox jail...": "Configuration de la prison Proxmox...", + "Configuring Serial Port:": "Configuration du port série :", "Configuring TCP optimizations...": "Configuration des optimisations TCP...", "Configuring TPM device": "Configuration du périphérique TPM", "Configuring Unpackerr...": "Configuration de Unpackerr...", @@ -1161,6 +1198,7 @@ "Consider security implications for production environments": "Tenir compte des implications en matière de sécurité pour les environnements de production", "Consider visiting the repository and supporting the project.": "pensez à visiter le référentiel et à soutenir le projet.", "Console log:": "Registre de la console & #160;:", + "Consume/export": "Consommation/export", "Container": "Conteneur", "Container — LXC root directories": "Conteneur — Répertoires racine LXC", "Container ID": "ID du conteneur", @@ -1247,6 +1285,7 @@ "Controller + NVMe passthrough requires machine type q35. Skipping controller assignment.": "Le contrôleur + le relais NVMe nécessite une machine de type q35. Ignorer l'affectation du contrôleur.", "Controller/NVMe Conflict Policy": "Politique de conflit contrôleur/NVMe", "Controller/NVMe already present in VM config": "Contrôleur/NVMe déjà présent dans la configuration de la VM", + "Controller/NVMe already present in VM config (%s)": "Contrôleur/NVMe déjà présent dans la configuration de la VM (%s)", "Controller/NVMe assigned": "Contrôleur/NVMe attribué", "Controller/NVMe is in use by running VM": "Le contrôleur/NVMe est utilisé en exécutant la VM", "Controller/NVMe passthrough requires IOMMU enabled in BIOS/UEFI and kernel.": "Le relais contrôleur/NVMe nécessite l’activation d’IOMMU dans le BIOS/UEFI et le noyau.", @@ -1313,6 +1352,7 @@ "Core packages": "Forfaits de base", "Cores": "Noyaux", "Corrupted gzip layer": "Couche gzip corrompue", + "Could not activate dev-zram0.swap": "Impossible d'activer dev-zram0.swap", "Could not add": "Impossible d'ajouter", "Could not add disk": "Impossible d'ajouter un disque", "Could not add the confirmed host firewall rule": "Impossible d'ajouter la règle de pare-feu hôte confirmée", @@ -1329,12 +1369,14 @@ "Could not change VM virtual display to vga: std": "Impossible de changer l'affichage virtuel de la VM en VGA : std", "Could not check the NVIDIA GPU": "Impossible de vérifier le GPU NVIDIA", "Could not clone any gasket-driver repository. Check your internet connection and": "Impossible de cloner un dépôt gasket-driver. Vérifiez votre connexion Internet et", + "Could not complete or verify the repository switch; changes may be partial and repository state is unknown. Inspect {ui} before retrying; no automatic rollback was attempted.": "Impossible de terminer ou de vérifier le changement de référentiel ; les modifications peuvent être partielles et l'état des référentiels est inconnu. Inspectez {ui} avant de réessayer ; aucun retour arrière automatique n'a été tenté.", "Could not complete private network release:": "Impossible de terminer la version du réseau privé :", "Could not configure IOMMU kernel parameters automatically. Configure manually and reboot.": "Impossible de configurer automatiquement les paramètres du noyau IOMMU. Configurez manuellement et redémarrez.", "Could not convert the OCI rootfs to privileged": "Impossible de convertir les roofs de l'OCI en privilégiés", "Could not copy the PVE keyfile into place. Check permissions on:": "Impossible de copier le fichier de clés PVE.Vérifiez les autorisations sur :", "Could not copy the keyfile into place.": "Impossible de copier le fichier de clés.", "Could not copy the keyfile into place. Check permissions on:": "Impossible de copier le fichier de clés. Vérifiez les autorisations sur :", + "Could not create ZRAM generator directory": "Impossible de créer le répertoire du générateur ZRAM", "Could not create a temporary directory for the NVIDIA Container Toolkit.": "Impossible de créer un répertoire temporaire pour NVIDIA Container Toolkit.", "Could not create converter directory:": "Impossible de créer le répertoire du convertisseur :", "Could not create destination directory:": "Impossible de créer le répertoire de destination :", @@ -1391,6 +1433,7 @@ "Could not push the key. Check the password and that": "Impossible d'appuyer sur la clé. Vérifiez le mot de passe et cela", "Could not query the image registry": "Impossible d'interroger le registre d'images", "Could not reach {registry}. Check its address, DNS and network access.": "Impossible d'atteindre {registry}. Vérifiez son adresse, son DNS et son accès au réseau.", + "Could not reach {url} after 3 attempts: {reason}": "Impossible de joindre {url} après 3 tentatives : {reason}", "Could not read SMART data from": "Impossible de lire les données SMART de", "Could not read VM configuration.": "Impossible de lire la configuration de la VM.", "Could not read the CUDA compute capability": "Impossible de lire la capacité de calcul CUDA", @@ -1423,6 +1466,7 @@ "Could not stage pending restore. Nothing new was scheduled.": "Impossible d’effectuer la restauration en attente. Rien de nouveau n'était prévu.", "Could not stop LXC": "Impossible d'arrêter LXC", "Could not stop ZRAM swap; profile configuration remains": "Impossible d'arrêter l'échange de ZRAM ; la configuration du profil reste", + "Could not stop existing dev-zram0.swap": "Impossible d'arrêter le dev-zram0.swap existant", "Could not translate the Compose command/entrypoint": "Impossible de traduire la commande/point d'entrée Compose", "Could not unload nouveau module (may be in use). The blacklist will take effect after reboot. Installation will continue but a reboot will be required.": "Impossible de décharger le nouveau module (peut-être en cours d'utilisation). La liste noire prendra effet après le redémarrage. L'installation continuera mais un redémarrage sera nécessaire.", "Could not unmount": "Impossible de démonter", @@ -1431,6 +1475,8 @@ "Could not unmount — disk may be busy. Removing fstab entry anyway.": "Impossible de démonter : le disque est peut-être occupé. Suppression de l'entrée fstab de toute façon.", "Could not update config file.": "Impossible de mettre à jour le fichier de configuration.", "Could not verify removal of the managed host firewall rule.": "Impossible de vérifier la suppression de la règle de pare-feu de l'hôte géré.", + "Could not write ZRAM generator configuration": "Impossible d'écrire la configuration du générateur ZRAM", + "Could not write ZRAM package ownership state": "Impossible d'écrire l'état de propriété des paquets ZRAM", "Could not write to:": "impossible d'écrire vers :", "Crafty Controller default login": "Connexion par défaut du contrôleur Crafty", "Create Directory": "Créer un répertoire", @@ -1449,6 +1495,7 @@ "Create VM System Windows": "Créer une VM Windows", "Create VM System macOS (OSX-PROXMOX)": "Créer une VM macOS (OSX-PROXMOX)", "Create VM from template or script": "Créer une VM à partir d'un modèle ou d'un script", + "Create a %s": "Créer une %s", "Create a VM first (machine type q35 + UEFI BIOS), then run this option again.": "Créez d’abord une VM (type de machine q35 + BIOS UEFI), puis réexécutez cette option.", "Create a backup of the container configuration:": "Créez une sauvegarde de la configuration du conteneur :", "Create a backup of your container before proceeding": "Créez une sauvegarde de votre conteneur avant de continuer", @@ -1473,6 +1520,7 @@ "Created persistent names for": "Création de noms persistants pour", "Created remapped user": "Utilisateur remappé créé", "Created sharedfiles group (GID: 101000)": "Groupe de fichiers partagés créé (GID : 101000)", + "Created with ProxMenuX": "Créé avec ProxMenuX", "Creating APT configuration to force IPv4...": "Création d'une configuration APT pour forcer IPv4...", "Creating Ceph repository for PVE 8 (legacy format)...": "Création du référentiel Ceph pour PVE 8 (format hérité)...", "Creating Ceph repository for PVE 9 (deb822 format)...": "Création du référentiel Ceph pour PVE 9 (format deb822)...", @@ -1482,6 +1530,8 @@ "Creating UID remapping for unprivileged container compatibility...": "Création d'un remappage UID pour une compatibilité de conteneurs non privilégiés...", "Creating VM with the above configuration": "Création d'une VM avec la configuration ci-dessus", "Creating VM...": "Création d'une VM...", + "Creating a %s using the above advanced settings": "Création d'une %s avec les paramètres avancés ci-dessus", + "Creating a %s using the above default settings": "Création d'une %s avec les paramètres par défaut ci-dessus", "Creating a backup in": "Créer une sauvegarde dans", "Creating a backup of": "Créer une sauvegarde de", "Creating a backup of the container...": "Création d'une sauvegarde du conteneur...", @@ -1490,6 +1540,7 @@ "Creating backup of network interfaces configuration...": "Création d'une sauvegarde de la configuration des interfaces réseau...", "Creating compressed archive...": "Création d'une archive compressée...", "Creating export archive...": "Création d'une archive d'exportation...", + "Creating images directory": "Création du répertoire des images", "Creating local archive...": "Création d'archives locales...", "Creating mount point...": "Création du point de montage...", "Creating partition table and partition...": "Création d'une table de partition et d'une partition...", @@ -1504,6 +1555,7 @@ "Creating the initial administrator...": "Création de l'administrateur initial...", "Creating the private network...": "Création du réseau privé...", "Creating the temporary data container": "Création du conteneur temporaire de données", + "Creating virtual disk (format=raw) for %s...": "Création du disque virtuel (format=raw) pour %s...", "Creative & Design": "Création et design", "Credential helper": "Assistant d'identification", "Credential storage and access": "Stockage et accès des informations d’identification", @@ -1564,6 +1616,8 @@ "Custom Configuration": "Configuration personnalisée", "Custom Content": "Contenu personnalisé", "Custom Directory": "Répertoire personnalisé", + "Custom Image": "Image personnalisée", + "Custom Loader Image (from %s)": "Image de chargeur personnalisée (depuis %s)", "Custom Logo Instructions": "Instructions pour le logo personnalisé", "Custom MOTD message is already configured": "le message MOTD personnalisé est déjà configuré", "Custom Options": "Options personnalisées", @@ -1638,6 +1692,7 @@ "Dedicated container volume (included in backups)": "Volume du conteneur dédié (inclus dans les sauvegardes)", "Dedicated container volumes (included in backups)": "Volumes de conteneurs dédiés (inclus dans les sauvegardes)", "DeepSeek Harness “Everything is a Plugin“.": "Harnais DeepSeek Tout est un Plugin.", + "Default": "Par défaut", "Default ACLs applied for group inheritance.": "ACL par défaut appliquées pour l’héritage de groupe.", "Default Credentials": "Informations d'identification par défaut", "Default Gateway": "Passerelle par défaut", @@ -1880,9 +1935,11 @@ "Do you want to update the existing export?": "Voulez-vous mettre à jour l’export existant ?", "Do you want to update the existing share?": "Voulez-vous mettre à jour le partage existant ?", "Do you want to view the selected backup before restoring?": "Voulez-vous afficher la sauvegarde sélectionnée avant de la restaurer ?", + "Do-Over": "Recommencer", "Docker Mods are only offered for compatible LinuxServer images": "Les mods Docker sont proposés uniquement pour les images LinuxServer compatibles", "Docker Volume Backup": "Docker Volume Backup", "Docker/CLI not available yet or no valid answer": "Docker/CLI pas encore disponible ou pas de réponse valide", + "Docs": "Docs", "Documents & Notes": "Documents et notes", "Documents volume size in GB": "Volume des documents en 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 est un logiciel wiki Open Source simple à utiliser et très polyvalent qui ne require une base de données. Il est aimé par les utilisateurs pour sa syntaxe propre et lisible. La facilité de maintenance, de sauvegarde et d'intégration en fait le favori d'un administrateur. Construit dans les contrôles d'accès et les connecteurs d'authentification font DokuWiki particulièrement utile dans le contexte de l'entreprise et le grand nombre de plugins fournis par sa communauté dynamique permettent une large gamme de cas d'utilisation au-delà d'un wiki traditionnel.", @@ -1898,6 +1955,7 @@ "Download its Compose file from an address": "Télécharger son fichier Composer depuis une adresse", "Download keyfile": "Télécharger le fichier clé", "Download latest VirtIO ISO automatically": "Téléchargez automatiquement la dernière version ISO de VirtIO", + "Downloaded %s to %s": "%s téléchargé dans %s", "Downloaded OCI images deleted:": "Images téléchargées OCI supprimées:", "Downloaded amdgpu_top": "Téléchargé amdgpu_top", "Downloading": "Téléchargement", @@ -1943,8 +2001,12 @@ "Duration": "Durée", "Duration:": "Durée:", "Dynamic NVIDIA is only validated for unprivileged containers. This profile uses static mounts and must be recreated after the host driver changes.": "Dynamic NVIDIA n'est validé que pour les conteneurs non privilégiés. Ce profil utilise des montures statiques et doit être recréé après que le pilote hôte change.", + "EFI Disk Storage": "Stockage du disque EFI", + "EFI disk created (raw) and configured on %s": "Disque EFI créé (raw) et configuré sur %s", "EFI disk created and configured on": "Disque EFI créé et configuré sur", + "EFI disk created and configured on %s": "Disque EFI créé et configuré sur %s", "EFI storage selection cancelled.": "Sélection de stockage EFI annulée.", + "EFI storage selection failed or was cancelled.": "La sélection du stockage EFI a échoué ou a été annulée.", "EFI storage selection failed or was cancelled. VM creation aborted.": "La sélection du stockage EFI a échoué ou a été annulée. Création de VM abandonnée.", "EMERGENCY PROXMOX SYSTEM REPAIR": "RÉPARATION D'URGENCE DU SYSTÈME PROXMOX", "ENABLED for restore": "ACTIVÉ pour la restauration", @@ -1960,6 +2022,7 @@ "Edit raw CT configuration file": "Modifier le fichier de configuration CT brut", "Edit raw VM configuration file": "Modifier le fichier de configuration brut de la VM", "Edit the VM machine type to q35 and try again.": "Modifiez le type de machine virtuelle en q35 et réessayez.", + "Edition:": "Édition :", "Email address for certificate expiry notices (required by ZeroSSL)": "Adresse électronique des avis d'expiration du certificat (required by ZeroSSL)", "Email address of the LibreDB Studio administrator": "Adresse électronique de l'administrateur LibreDB Studio", "Email address of the NetBox admin account": "Adresse électronique du compte administrateur NetBox", @@ -1969,6 +2032,7 @@ "Emby organizes video, music, live TV, and photos from personal media libraries and streams them to smart TVs, streaming boxes and mobile devices. This container is packaged as a standalone emby Media Server.": "Emby organise la vidéo, la musique, la télévision en direct et les photos des bibliothèques de médias personnels et les diffuse vers des téléviseurs intelligents, des boîtes de streaming et des appareils mobiles. Ce conteneur est emballé comme un serveur multimédia autonome emby.", "Emergency Proxmox System Repair": "Réparation d'urgence du système Proxmox", "Emergency recovery:": "Récupération d'urgence :", + "Emit numeric progress for the OCI menu": "Émettre une progression numérique pour le menu OCI", "Empowering the smart home": "Autonomiser la maison intelligente", "Empty": "Vide", "Empty exec service check": "Vérification du service exec vide", @@ -1991,6 +2055,7 @@ "Enable ZFS autotrim (SSD/NVMe pools)": "Activer le réglage automatique ZFS (pools SSD/NVMe)", "Enable ZRAM swap profile": "Activer le profil d'échange ZRAM", "Enable a mount on an existing Rclone OCI container": "Activer un montage sur un conteneur existant Rclone OCI", + "Enable a mount on an installed Rclone OCI": "Activer un montage sur un conteneur OCI Rclone installé", "Enable an optical drive for MakeMKV": "Activer un lecteur optique pour MakeMKV", "Enable auto-sync if /var/log exceeds 90% of its size?": "Activer la synchronisation automatique si /var/log dépasse 90 % de sa taille ?", "Enable fast reboots": "Activer les redémarrages rapides", @@ -2118,6 +2183,7 @@ "Enter target disk (e.g. /dev/sdX):": "Entrez le disque cible (par exemple /dev/sdX) :", "Enter target storage name (e.g., local-lvm):": "Entrez le nom du stockage cible (par exemple, local-lvm) :", "Enter target storage:": "Entrez le stockage cible :", + "Enter temporary folder path (default: %s):": "Saisissez le chemin du dossier temporaire (par défaut : %s) :", "Enter the BORG REPOKEY passphrase for target:": "saisissez la phrase secrète BORG REPOKEY pour la cible :", "Enter the Samba username:": "Entrez le nom d'utilisateur Samba :", "Enter the VMID for the new VM:": "Saisissez le VMID de la nouvelle VM :", @@ -2144,6 +2210,7 @@ "Enterprise repository present": "Référentiel d'entreprise présent", "Enterprise repository returned 401 Unauthorized (no valid subscription). Switch to the no-subscription repository and retry?": "Le référentiel d'entreprise a renvoyé 401 non autorisé (pas d'abonnement valide). Passer au référentiel sans abonnement et réessayer ?", "Enterprise repository unauthorized and fallback declined by user": "Dépôt d'entreprise non autorisé et solution de secours refusée par l'utilisateur", + "Enterprise shares an APT stanza with other components. Split it in the Proxmox repository UI; no repository changed.": "Enterprise partage un bloc APT avec d'autres composants. Séparez-le dans l'interface des référentiels Proxmox ; aucun référentiel n'a été modifié.", "Entropy generation optimization removed": "Optimisation de la génération d'entropie supprimée", "Environment entry without an explicit value": "Entrée environnement sans valeur explicite", "Environment override for an unknown service:": "Dépassement de l'environnement pour un service inconnu :", @@ -2153,6 +2220,7 @@ "Error": "Erreur", "Error applying patch. Backups preserved at": "Erreur lors de l'application du correctif. Sauvegardes conservées à", "Error details:": "Détails de l'erreur :", + "Error generating UUP download list.": "Erreur lors de la génération de la liste de téléchargement UUP.", "Error installing": "Erreur d'installation", "Error installing build dependencies. Check": "Erreur lors de l'installation des dépendances de build. Vérifier", "Error:": "Erreur:", @@ -2197,6 +2265,7 @@ "Execution engine for Index-TTS": "Moteur d'exécution pour Index-TTS", "Existing Groups": "Groupes existants", "Existing TLS certificate reused:": "Certificat TLS existant réutilisé:", + "Existing ZRAM profile is active but does not match its configuration": "Le profil ZRAM existant est actif mais ne correspond pas à sa configuration", "Existing file, re-downloading...": "Fichier existant, retéléchargement...", "Existing filesystem:": "Système de fichiers existant :", "Existing hostpci entries detected — they will be reused": "Entrées hostpci existantes détectées : elles seront réutilisées", @@ -2206,6 +2275,7 @@ "Exit": "Sortie", "Exit and repair manually": "Quitter et réparer manuellement", "Exit the container terminal:": "Sortez du terminal à conteneurs :", + "Exit-Script": "Quitter le script", "Exit: Stop to create backup manually": "Quitter : arrêter pour créer une sauvegarde manuellement", "Exiting for manual repair...": "Sortie pour réparation manuelle...", "Expected /tmp/gasket-driver/src not found. The clone seems incomplete or uses an unknown layout.": "/tmp/gasket-driver/src attendu introuvable. Le clone semble incomplet ou utilise une mise en page inconnue.", @@ -2282,7 +2352,11 @@ "Failed to add bind mount:": "Échec de l'ajout du montage de liaison :", "Failed to add iSCSI storage to Proxmox.": "Échec de l'ajout du stockage iSCSI à Proxmox.", "Failed to add storage to Proxmox.": "Échec de l'ajout de stockage à Proxmox.", + "Failed to allocate virtual disk %s": "Échec de l'allocation du disque virtuel %s", "Failed to assign Controller/NVMe": "Échec de l'attribution du contrôleur/NVMe", + "Failed to assign disk %s (%s) on %s": "Échec de l'attribution du disque %s (%s) sur %s", + "Failed to assign loader disk": "Échec de l'attribution du disque du chargeur", + "Failed to assign loader disk to ide0": "Échec de l'attribution du disque du chargeur à ide0", "Failed to assign virtual disk": "Échec de l'attribution du disque virtuel", "Failed to clone Lynis from GitHub": "Échec du clonage de Lynis depuis GitHub", "Failed to clone log2ram repository. Check /tmp/log2ram_install.log": "Échec du clonage du référentiel log2ram. Vérifiez /tmp/log2ram_install.log", @@ -2291,8 +2365,11 @@ "Failed to configure Proxmox Backup Server repositories": "Échec de la configuration des dépôts de Proxmox Backup Server", "Failed to configure Proxmox repositories": "Échec de la configuration des référentiels Proxmox", "Failed to configure TPM device in VM": "Échec de la configuration du périphérique TPM dans la VM", + "Failed to configure controller/NVMe: %s": "Échec de la configuration du contrôleur/NVMe : %s", + "Failed to configure import disk %s as %s": "Échec de la configuration du disque d'importation %s en tant que %s", "Failed to configure repositories.": "Échec de la configuration des référentiels.", "Failed to configure repositories. Installation aborted.": "Échec de la configuration des référentiels. Installation interrompue.", + "Failed to configure virtual disk as %s": "Échec de la configuration du disque virtuel en tant que %s", "Failed to connect to": "Échec de la connexion à", "Failed to connect to server.": "Échec de la connexion au serveur.", "Failed to copy sources into": "Échec de la copie des sources dans", @@ -2366,7 +2443,9 @@ "Failed to install intel-gpu-tools": "Échec de l'installation des outils Intel-Gpu", "Failed to install libedgetpu1-std. Check": "Échec de l'installation de libedgetpu1-std. Vérifier", "Failed to install pigz": "Échec de l'installation de pigz", + "Failed to install unzip": "Échec de l'installation de unzip", "Failed to install zfs-auto-snapshot": "Échec de l'installation de zfs-auto-snapshot", + "Failed to install:": "Échec de l'installation :", "Failed to migrate the existing ProxMenux Bash configuration.": "échec de la migration de la configuration ProxMenux Bash existante.", "Failed to mount CIFS share on host.": "Échec du montage du partage CIFS sur l'hôte.", "Failed to mount NFS share on host.": "Échec du montage du partage NFS sur l'hôte.", @@ -2550,6 +2629,7 @@ "Full path": "Chemin complet", "Full report — complete SMART data (scrollable)": "Rapport complet – données SMART complètes (défilement)", "Full system upgrade, including dependencies": "Mise à niveau complète du système, y compris les dépendances", + "Function '%s' is not defined in the %s flow.": "La fonction '%s' n'est pas définie dans le flux %s.", "Function Level Reset (FLR) not available": "Réinitialisation du niveau de fonction (FLR) non disponible", "GID already in use:": "GID déjà utilisé :", "GID in CT": "GID en CT", @@ -2628,6 +2708,7 @@ "Generated Paperless administrator": "Administrateur sans papier généré", "Generated Tandoor administrator": "Administrateur Tandoor généré", "Generated administrator login": "Connexion de l'administrateur généré", + "Generated: {generated}; failed: {failed}; family: {provider}": "Générés : {generated} ; échecs : {failed} ; famille : {provider}", "Generating OVF descriptor...": "Génération du descripteur OVF...", "Generating dkms.conf...": "Génération de dkms.conf...", "Generating manifest...": "Génération du manifeste...", @@ -2639,6 +2720,9 @@ "Get the container's storage information:": "Obtenez les informations de stockage du conteneur :", "Get up and running with large language models locally": "Monter et fonctionner avec de grands modèles de langue localement", "Git installed": "Git installé", + "GitHub returned HTTP 403 for {url}. Set GITHUB_TOKEN to raise the API rate limit.": "GitHub a renvoyé HTTP 403 pour {url}. Définissez GITHUB_TOKEN pour relever la limite de requêtes de l'API.", + "GitHub returned HTTP {status} for {url}.": "GitHub a renvoyé HTTP {status} pour {url}.", + "GitHub returned a truncated tree for the CasaOS catalogue": "GitHub a renvoyé une arborescence tronquée pour le catalogue CasaOS", "GitQlient is a multi-platform Git client originally forked from QGit. Nowadays it goes beyond of just a fork and adds a lot of new functionality.": "GitQlient est une multiplateforme Client Git à l'origine fork de QGit. Aujourd'hui, il va au-delà d'un fork et ajoute beaucoup de nouvelles fonctionnalités.", "Github Desktop is an open source Electron-based GitHub app. It is written in TypeScript and uses React.": "Github Desktop est une application GitHub à source ouverte. Il est écrit dans TypeScript et utilise React.", "Global settings and SSH jail configured": "Paramètres globaux et prison SSH configurés", @@ -2691,6 +2775,7 @@ "HAOS One is a community image that runs Docker inside the container. The LXC stays unprivileged, but the inner AppArmor profiles may not be available. The first start downloads Home Assistant Core and its add-ons. If the check fails, the CT and /mnt/data are kept for diagnosis.": "HAOS One est une image communautaire qui exécute Docker à l'intérieur du conteneur. Le LXC reste non privilégié, mais les profils internes de l'AppArmor peuvent ne pas être disponibles. Le premier démarrage télécharge Home Assistant Core et ses add-ons. Si la vérification échoue, l'EC et /mnt/data sont conservés pour diagnostic.", "HAOS One profile declined": "Profil HAOS One décliné", "HAOS One requires an unprivileged unmanaged LXC with nesting and keyctl, 2 cores, 2048 MB RAM, rootfs of at least 12 GB and /mnt/data of at least 16 GB on a container volume included in backups": "HAOS One requires un LXC non géré non privilégié avec nidation et keyctl, 2 carottes, 2048 MB RAM, rootfs d'au moins 12 Go et /mnt/data d'au moins 16 Go sur un volume de conteneur inclus dans les sauvegardes", + "HOSTNAME": "NOM D'HÔTE", "HTML5 Network Speed Test Server.": "Serveur de test de vitesse réseau HTML5.", "HTTP service check without a saved URL": "Contrôle du service HTTP sans URL enregistrée", "Habridge emulates Philips Hue API to other home automation gateways such as an Amazon Echo/Dot Gen 1 (gen 2 has issues discovering ha-bridge) or other systems that support Philips Hue. The Bridge handles basic commands such as On, Off and brightness commands of the hue protocol. This bridge can control most devices that have a distinct API.": "Habridge émule Philips Hue API à d'autres passerelles de domotique comme un Amazon Echo/Dot Gen 1 (gen 2 a des problèmes de découverte ha-bridge) ou d'autres systèmes qui prennent en charge Philips Hue. Le pont gère les commandes de base comme On, Off et les commandes de luminosité du protocole de teinte. Ce pont peut contrôler la plupart des appareils qui ont une API distincte.", @@ -2786,6 +2871,7 @@ "Host device node": "Noeud du périphérique hôte", "Host directories are not included in the backup and are not reverted by a recovery.": "Les répertoires hôtes ne sont pas inclus dans la sauvegarde et ne sont pas retournés par une récupération.", "Host directories are not included in the backups and are not reverted by a recovery.": "Les répertoires hôtes ne sont pas inclus dans les sauvegardes et ne sont pas retournés par une récupération.", + "Host directories are not reverted by the backup (confirmed beforehand)": "Les répertoires de l'hôte ne sont pas restaurés par la sauvegarde (confirmé au préalable)", "Host directories cannot be included in vzdump": "Les répertoires hôtes ne peuvent pas être inclus dans vzdump", "Host directories cannot be part of the vzdump backup": "Les répertoires hôtes ne peuvent pas faire partie de la sauvegarde vzdump", "Host directories that are kept, with their content:": "Les répertoires d'accueil qui sont conservés, avec leur contenu :", @@ -2809,6 +2895,7 @@ "Host fstab NFS mounts (not registered with pvesm):": "Hôte des montages fstab NFS (non enregistrés auprès de pvesm) :", "Host fstab NFS mounts:": "Hôte des montages fstab NFS :", "Host fstab mounts (not registered as Proxmox storage):": "Montages fstab de l'hôte (non enregistrés comme stockage Proxmox) :", + "Host has an active subscription but no active {short} repository. Configure its Enterprise source in {ui}; no repository changed.": "L'hôte dispose d'un abonnement actif mais d'aucun référentiel {short} actif. Configurez sa source Enterprise dans {ui} ; aucun référentiel n'a été modifié.", "Host identity (hostname, hosts)": "Identité de l'hôte (nom d'hôte, hôtes)", "Host kernel module loaded:": "Module du noyau de l'hôte chargé :", "Host monitor configured: shared PID and network namespaces, LXCFS disabled in this container": "Moniteur d'hôte configuré : espaces de noms PID et réseau partagés, LXCFS désactivés dans ce conteneur", @@ -2838,6 +2925,7 @@ "Htpcmanager is a front end for many htpc related applications.": "Htpcmanager est une interface frontale pour de nombreuses applications liées à htpc.", "I have read this": "j'ai lu ceci", "I/O priority configured": "Priorité E/S configurée", + "ID %s is already in use": "L'ID %s est déjà utilisé", "ID already in use. Please choose another.": "ID déjà utilisé. Veuillez en choisir un autre.", "IGDB": "IGDB", "IGDB Client ID": "ID client IGDB", @@ -2891,6 +2979,7 @@ "ISO image — installation images": "Image ISO – images d'installation", "ISO image downloaded": "Image ISO téléchargée", "ISO not found to mount on device": "ISO introuvable à monter sur l'appareil", + "Icons resolved: {resolved}; cleared: {cleared}; unchanged: {unchanged}; with a theme variant: {themed}": "Icônes résolues : {resolved} ; effacées : {cleared} ; inchangées : {unchanged} ; avec une variante de thème : {themed}", "Identical:": "Identique:", "Identify candidate disk (never use system disk):": "Identifiez le disque candidat (n'utilisez jamais le disque système) :", "Identify persistent disk paths": "Identifier les chemins de disque persistants", @@ -2898,6 +2987,7 @@ "If Code 43 error appears, KVM hiding is already configured.": "Si l'erreur Code 43 apparaît, le masquage KVM est déjà configuré.", "If GUI does not load:": "Si l'interface graphique ne se charge pas :", "If ZFS errors occur:": "Si des erreurs ZFS se produisent :", + "If a newer application image is available, the container is stopped and backed up, and the backup integrity is verified. The container is then updated using the new image.\n\nIf the update fails after the container was changed, ProxMenux attempts to restore the previous installation from the backup. If the operation remains incomplete, select the application in OCI management and choose \"Recover the previous installation\".\n\nHost directories mounted in the container are not restored by the container backup.": "Si une image plus récente de l'application est disponible, le conteneur est arrêté et sauvegardé, puis l'intégrité de la sauvegarde est vérifiée. Le conteneur est ensuite mis à jour avec la nouvelle image.\n\nSi la mise à jour échoue après la modification du conteneur, ProxMenux tente de restaurer l'installation précédente à partir de la sauvegarde. Si l'opération reste incomplète, sélectionnez l'application dans la gestion OCI et choisissez « Récupérer l'installation précédente ».\n\nLes répertoires de l'hôte montés dans le conteneur ne sont pas restaurés par la sauvegarde du conteneur.", "If booting in EFI mode with root on LVM: install GRUB for EFI": "Si vous démarrez en mode EFI avec root sur LVM : installez GRUB pour EFI", "If config issues occur:": "Si des problèmes de configuration surviennent :", "If container won't start:": "Si le conteneur ne démarre pas :", @@ -2955,6 +3045,7 @@ "Image selection was cancelled": "La sélection de l'image a été annulée", "Image that is not in the catalog": "Image ne figurant pas dans le catalogue", "Image:": "Image & #160;:", + "Images directory created: %s": "Répertoire des images créé : %s", "Images to import:": "Images à importer :", "Immich CUDA requires NVIDIA driver 545 or later": "Immich CUDA requires pilote NVIDIA 545 ou plus", "Immich GPU profile not validated": "Profil GPU Immich non validé", @@ -2986,6 +3077,7 @@ "Imported:": "Importé :", "Importing": "Importation", "Importing disk": "Importer un disque", + "Importing loader disk:": "Importation du disque du chargeur :", "Importing:": "Importation :", "Improve log rotation and limit log size to save space and extend disk life": "Améliorez la rotation des journaux et limitez leur taille pour économiser de l'espace et prolonger la durée de vie du disque.", "In an LXC": "Dans un LXC", @@ -3040,6 +3132,7 @@ "Independent LXC applications installed": "Application indépendante LXC installée", "Independent LXCs: no main container or hookscript. Each one keeps its own Start with Proxmox setting.": "LXCs indépendants: pas de conteneur principal ou de hookscript. Chacun garde son propre réglage Commencer avec Proxmox.", "Independent applications, without a main container.": "Applications indépendantes, sans conteneur principal.", + "Index updated: {count} candidate applications": "Index mis à jour : {count} applications candidates", "Indexers and quality profiles still need to be configured.": "Les indexeurs et les profils de qualité doivent encore être configurés.", "Inherited retention:": "Rétention héritée :", "Inherited schedule:": "Horaire hérité :", @@ -3110,7 +3203,10 @@ "Install with: apt-get install open-iscsi": "Installer avec : apt-get install open-iscsi", "Install/Update Coral TPU on Host": "Installer/mettre à jour Coral TPU sur l'hôte", "Install/Update NVIDIA Drivers (Host + LXC)": "Installer/mettre à jour les pilotes NVIDIA (hôte + LXC)", + "Install? [y/N]:": "Installer ? [y/N] :", "Installation Complete": "Installation terminée", + "Installation blocked:": "Installation bloquée :", + "Installation cancelled.": "Installation annulée.", "Installation completed": "Installation terminée", "Installation completed.": "Installation terminée.", "Installation completed. Please reboot the server manually as soon as possible.": "Installation terminée. Veuillez redémarrer le serveur manuellement dès que possible.", @@ -3124,6 +3220,7 @@ "Installed": "Installé", "Installed at:": "Installé à :", "Installed components:": "Composants installés :", + "Installed unzip successfully.": "unzip installé avec succès.", "Installed:": "Installé:", "Installer already downloaded and verified.": "Installateur déjà téléchargé et vérifié.", "Installer copied to container.": "Programme d'installation copié dans le conteneur.", @@ -3165,6 +3262,7 @@ "Installing and configuring Figurine...": "Installation et configuration de Figurine...", "Installing and configuring ZFS auto-snapshot...": "Installation et configuration de l'instantané automatique ZFS...", "Installing build dependencies...": "Installation des dépendances de build...", + "Installing dependencies:": "Installation des dépendances :", "Installing dependency:": "Installation de la dépendance :", "Installing essential Proxmox packages...": "Installation des packages Proxmox essentiels...", "Installing gawk (required for OVF parsing)...": "Installation de gawk (requis pour l'analyse OVF)...", @@ -3187,9 +3285,11 @@ "Installing the new image...": "Installer la nouvelle image...", "Installing the new image:": "Installer la nouvelle image :", "Installing the stack startup hook...": "Installation du crochet de démarrage de la pile...", + "Installing unzip...": "Installation de unzip...", "Installing zfs-auto-snapshot package...": "Installation du package zfs-auto-snapshot...", "Installs essential packages if missing": "Installe les packages essentiels s'ils sont manquants", "Insufficient Disk Space": "Espace disque insuffisant", + "Insufficient disk space. Available:": "Espace disque insuffisant. Disponible :", "Insufficient disk space. Skipping LXC": "Espace disque insuffisant. Sauter LXC", "Insufficient memory. NVIDIA install aborted.": "Mémoire insuffisante. Installation NVIDIA abandonnée.", "Insufficient memory. Skipping LXC": "Mémoire insuffisante. Sauter LXC", @@ -3225,12 +3325,15 @@ "Interfaces to Remove": "Interfaces à supprimer", "Internal error: NVIDIA installer path is empty or file not found.": "Erreur interne : le chemin du programme d'installation NVIDIA est vide ou le fichier est introuvable.", "Internal error: missing arguments in pmx_prepare_host_shared_dir": "Erreur interne : arguments manquants dans pmx_prepare_host_shared_dir", + "Internal installer operation; not legacy adoption": "Opération interne de l'installateur ; pas une adoption d'installation héritée", "Internal subnet of the tunnel (change it only if it clashes)": "Sous-réseau interne du tunnel (ne le changer que s'il s'agit d'affrontements)", "Interrupted operation": "Interruption du opera", "Interrupted operation:": "Interruption du opera:", "Interrupted stack operation found": "Pile interrompue operation trouvée", "Invalid 'proxmox-ve' candidate (not 9.x or none). Please verify your repository configuration and network, then retry.": "Candidat 'proxmox-ve' invalide (pas 9.x ou aucun). Veuillez vérifier la configuration et le réseau de votre référentiel, puis réessayez.", "Invalid ALLOWED_HOSTS value": "Valeur ALLOWED_HOSTS invalide", + "Invalid Compose port:": "Port Compose non valide :", + "Invalid Compose volume path:": "Chemin de volume Compose non valide :", "Invalid Home Assistant OS check timeout": "Non valide Home Assistant OS check timeout", "Invalid ID": "Pièce d'identité invalide", "Invalid IPv4 address": "Adresse IPv4 non valide", @@ -3266,6 +3369,7 @@ "Invalid action": "action invalide", "Invalid administrator email": "Courriel administrateur non valide", "Invalid administrator user name": "Nom d'utilisateur non valide", + "Invalid application identifier:": "Identifiant d'application non valide :", "Invalid base VMID": "VMID de base non valide", "Invalid bridge": "Pont réseau non valide", "Invalid check package:": "Dossier de contrôle non valide:", @@ -3397,7 +3501,9 @@ "JSON output for scripts": "Sortie JSON pour les scripts", "Jackett works as a proxy server: it translates queries from apps (Sonarr, SickRage, CouchPotato, Mylar, etc) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software. This allows for getting recent uploads (like RSS) and performing searches. Jackett is a single repository of maintained indexer scraping & translation logic - removing the burden from other apps.": "Jackett fonctionne comme un serveur proxy: il traduit les requêtes des applications (Sonarr, SickRage, CouchPotato, Mylar, etc) en requêtes http spécifiques au site tracker, analyse la réponse html, puis renvoie les résultats au logiciel demandeur. Cela permet d'obtenir des téléchargements récents (comme RSS) et d'effectuer des recherches. Jackett est un dépôt unique de la logique de grattage et de traduction de l'indexeur - en supprimant le fardeau des autres applications.", "Jellyfin WebUI": "Jellyfin WebUI", + "Jellyfin configuration already applied:": "Configuration de Jellyfin déjà appliquée :", "Jellyfin configuration applied:": "Configuration Jellyfin appliquée:", + "Jellyfin configuration updated:": "Configuration de Jellyfin mise à jour :", "Jellyfin did not create encoding.xml before the timeout": "Jellyfin n'a pas créé d'encodage.xml avant l'expiration du délai", "Jellyfin has not created encoding.xml in any declared path": "Jellyfin n'a créé encoding.xml dans aucun chemin déclaré", "Jellyseerr is a free and open source software application for managing requests for your media library.": "Jellyseerr est une application gratuite et open source pour la gestion des demandes pour votre médiathèque.", @@ -3440,6 +3546,7 @@ "Keep current version (N)": "Conserver la version actuelle (N)", "Keep current version (N) if modified": "Conserver la version actuelle (N) si modifiée", "Keep in source VM(s) + disable onboot + add to target VM": "Conserver dans la ou les VM sources + désactiver le démarrage + ajouter à la VM cible", + "Keep the backup taken before the update in this Proxmox storage": "Conserver dans ce stockage Proxmox la sauvegarde effectuée avant la mise à jour", "Keeping GPU in source VM config": "Conserver le GPU dans la configuration de la VM source", "Keeping the settings changed in Proxmox:": "Garder les paramètres modifiés dans Proxmox :", "Kept sharedfiles group (has regular users assigned).": "Groupe de fichiers partagés conservé (des utilisateurs réguliers sont attribués).", @@ -3506,6 +3613,7 @@ "Language Change": "Changement de langue", "Language changed to": "La langue a été modifiée en", "Language/locale (e.g. es_ES.UTF-8; translation of every application is not guaranteed)": "Langue/locale (par exemple es ES.UTF-8; la traduction de chaque application n'est pas garantie)", + "Language:": "Langue :", "Last 50 kernel log lines": "50 dernières lignes de journal du noyau", "Last run:": "Dernière exécution :", "Last system boot time": "Heure du dernier démarrage du système", @@ -3525,6 +3633,7 @@ "Let's review your current network configuration.": "Passons en revue votre configuration réseau actuelle.", "Liberate your videos and unleash infinite possibilities.": "Libérez vos vidéos et relâchez des possibilités infinies.", "Libraries: /data/media/movies, /data/media/series and /data/media/music. Select them in the media server.": "Bibliothèques: /data/media/movies, /data/media/série et /data/media/music. Sélectionnez-les dans le serveur multimédia.", + "Library": "Bibliothèque", "Library size in GB": "Taille de la bibliothèque en GB", "LibreDB Studio": "LibreDB Studio", "LibreOffice is a free and powerful office suite, and a successor to OpenOffice.org (commonly known as OpenOffice). Its clean interface and feature-rich tools help you unleash your creativity and enhance your productivity.": "LibreOffice est une suite de bureau gratuite et puissante, et un successeur à OpenOffice.org (connu sous le nom d'OpenOffice). Son interface propre et ses outils riches en fonctionnalités vous aident à libérer votre créativité et à améliorer votre productivité.", @@ -3553,6 +3662,7 @@ "List all containers to identify the privileged one:": "Lister tous les conteneurs pour identifier celui privilégié :", "List all containers to identify the unprivileged one:": "Répertoriez tous les conteneurs pour identifier celui qui n'est pas privilégié :", "List all virtual machines": "Lister toutes les machines virtuelles", + "List applications": "Lister les applications", "List backups in a specific storage": "Répertorier les sauvegardes dans un stockage spécifique", "List block devices and partitions": "Liste des périphériques de blocage et des partitions", "List configured storages:": "Répertoriez les stockages configurés :", @@ -3568,6 +3678,13 @@ "Listening ports:": "Ports d'écoute :", "Listing relevant CT users and their mapped UID/GID on host...": "Liste des utilisateurs CT concernés et de leur UID/GID mappé sur l'hôte...", "Load and verify the WireGuard module on the Proxmox host": "Charger et vérifier le module WireGuard sur l'hôte Proxmox", + "Loader": "Chargeur", + "Loader configured as boot device.": "Chargeur configuré comme périphérique de démarrage.", + "Loader import failed. No disk detected in config.": "Échec de l'importation du chargeur. Aucun disque détecté dans la configuration.", + "Loader import failed. No disk detected.": "Échec de l'importation du chargeur. Aucun disque détecté.", + "Loader imported successfully to %s": "Chargeur importé avec succès vers %s", + "Loader storage selection failed or was cancelled.": "La sélection du stockage du chargeur a échoué ou a été annulée.", + "Loader:": "Chargeur :", "Loading modules...": "Chargement des modules...", "Loading the Helper-Scripts catalog...": "Chargement du catalogue Helper-Scripts...", "Loading the host kernel module:": "Chargement du module du noyau hôte & #160;:", @@ -3631,16 +3748,20 @@ "Lyrion Music Server is a streaming audio server for Squeezebox audio players.": "Lyrion Music Server est un serveur audio en streaming pour les lecteurs audio Squeezebox.", "M.2 / PCIe devices:": "Appareils M.2/PCIe :", "M3U proxy server": "Serveur proxy M3U", + "MAC ADDRESS": "ADRESSE MAC", "MAC Address": "Adresse MAC", "MAC address": "Adresse MAC", "MACHINE TYPE": "TYPE DE MACHINE", "MAME is a free and open-source emulator designed to emulate the hardware of arcade games, video game consoles, old computers and other systems in software on modern personal computers.": "MAME est un émulateur libre et open-source conçu pour émuler le matériel des jeux d'arcade, consoles de jeux vidéo, anciens ordinateurs et autres systèmes dans les logiciels sur les ordinateurs personnels modernes.", "MOTD configuration updated successfully": "Configuration MOTD mise à jour avec succès", "MOTD configuration was already up to date": "La configuration MOTD était déjà à jour", + "MTU SIZE": "TAILLE MTU", "Machine Type": "Type de machine", + "Machine i440fx": "Machine i440fx", "Machine learning": "Apprentissage automatique", "Machine learning container prepared": "Conteneur d'apprentissage automatique préparé", "Machine learning profile not implemented; it is not replaced by CPU:": "Profil d'apprentissage automatique non implémenté; il n'est pas remplacé par CPU:", + "Machine q35": "Machine q35", "Machine type: q35": "Type de machine : q35", "Machine: q35": "Appareil : q35", "Main endpoint not yet defined": "Objectif principal non encore défini", @@ -4086,6 +4207,7 @@ "No Changes Needed": "Aucun changement nécessaire", "No Cleanup Needed": "Aucun nettoyage nécessaire", "No Compose file was given": "Aucun fichier Compose n'a été donné", + "No Compose files were found in the CasaOS catalogue": "Aucun fichier Compose n'a été trouvé dans le catalogue CasaOS", "No Controller/NVMe selected for now.": "Aucun contrôleur/NVMe sélectionné pour l'instant.", "No Coral Detected": "Aucun Coral détecté", "No Coral TPU device was found on this host (neither PCIe/M.2 nor USB).": "Aucun périphérique Coral TPU n'a été trouvé sur cet hôte (ni PCIe/M.2 ni USB).", @@ -4179,6 +4301,7 @@ "No accessible Samba servers found.": "Aucun serveur Samba accessible trouvé.", "No accessible exports found.": "Aucune exportation accessible trouvée.", "No accessible shares found.": "Aucun partage accessible trouvé.", + "No active Debian base repository for this suite; configure it in the Proxmox repository UI before continuing.": "Aucun référentiel de base Debian actif pour cette suite ; configurez-le dans l'interface des référentiels Proxmox avant de continuer.", "No active Proxmox storage accepts OCI template archives.": "Aucun stockage Proxmox actif n'accepte les archives de modèles OCI.", "No active exports or showmount not available": "Aucune exportation active ou showmount non disponible", "No active session": "Aucune session active", @@ -4208,12 +4331,14 @@ "No compatible GPUs were detected on this host.": "Aucun GPU compatible n'a été détecté sur cet hôte.", "No compatible PVE jobs": "Aucun travail PVE compatible", "No compatible disk images found in:": "Aucune image disque compatible trouvée dans :", + "No compatible images found in %s\n\nSupported formats: .img, .iso, .qcow2, .vmdk\n\nPlease add some images and try again.": "Aucune image compatible trouvée dans %s\n\nFormats pris en charge : .img, .iso, .qcow2, .vmdk\n\nAjoutez des images et réessayez.", "No configuration issues found": "Aucun problème de configuration trouvé", "No container of the stack was modified.": "Aucun contenant de la pile n'a été modifié.", "No container runtime available.": "Aucun environnement d'exécution de conteneur disponible.", "No container selected. Exiting.": "Aucun conteneur sélectionné. Sortir.", "No controller/NVMe selected.": "Aucun contrôleur/NVMe sélectionné.", "No controllers remaining after conflict resolution.": "Il ne reste aucun contrôleur après la résolution du conflit.", + "No custom image selected": "Aucune image personnalisée sélectionnée", "No custom key (rely on default SSH config)": "Pas de clé personnalisée (comptez sur la configuration SSH par défaut)", "No custom logos were found in /usr/local/share/fastfetch/logos/.\n\nPlease add a logo and try again.": "Aucun logo personnalisé n'a été trouvé dans /usr/local/share/fastfetch/logos/.\n\nVeuillez ajouter un logo et réessayer.", "No desktop UI backup found, will reinstall packages": "Aucune sauvegarde de l'interface utilisateur du bureau trouvée, les packages seront réinstallés", @@ -4226,6 +4351,7 @@ "No disks were added.": "Aucun disque n'a été ajouté.", "No disks were configured for processing.": "Aucun disque n'a été configuré pour le traitement.", "No disks were selected.": "Aucun disque n'a été sélectionné.", + "No disks/controllers configured.": "Aucun disque/contrôleur configuré.", "No docker run command was given": "Aucune commande docker run n'a été fournie", "No duplicate IP addresses": "Pas d'adresses IP en double", "No duplicate repositories found": "Aucun référentiel en double trouvé", @@ -4331,6 +4457,7 @@ "No supported NVIDIA versions found for this GPU": "Aucune version NVIDIA prise en charge trouvée pour ce GPU", "No sysfs ROM entry — trying ACPI VFCT table...": "Aucune entrée ROM sysfs - essayez la table ACPI VFCT...", "No target configured.": "aucune cible configurée.", + "No template is available for '{app_id}'": "Aucun modèle n'est disponible pour '{app_id}'", "No test currently running": "Aucun test en cours d'exécution actuellement", "No unambiguous loader download found in release metadata.": "Aucun téléchargement de chargeur sans ambiguïté trouvé dans les métadonnées de la version.", "No uninstaller found for:": "Aucun programme de désinstallation trouvé pour :", @@ -4472,6 +4599,7 @@ "Only one service at a time can be installed this way.": "Un seul service à la fois peut être installé de cette façon.", "Only removes storage definition, not remote data.": "Supprime uniquement la définition de stockage, pas les données distantes.", "Only run this if you used LVM (step 6b):": "Exécutez-le uniquement si vous avez utilisé LVM (étape 6b) :", + "Only the applications that need no question: the ones the cluster keeps a record of": "Uniquement les applications qui ne nécessitent aucune question : celles dont le cluster conserve un enregistrement", "Only the host backup hook is removed — PVE vzdump jobs targeting this storage stay intact.": "seul le hook de sauvegarde de l'hôte est supprimé – les tâches PVE vzdump ciblant ce stockage restent intactes.", "Only the image reference, with no Compose file": "Seule la référence d'image, sans fichier Compose", "Only the update of the image runs unattended.": "Seule la mise à jour de l'image s'exécute sans surveillance.", @@ -4485,6 +4613,7 @@ "Open the VM console and wait for the loader to boot": "Ouvrez la console VM et attendez que le chargeur démarre", "Open the dashboard from this host on port 8008 to create a new admin account.": "Ouvrez le tableau de bord de cet hôte sur le port 8008 pour créer un nouveau compte administrateur.", "Open the dashboard to create a new admin account:": "Ouvrez le tableau de bord pour créer un nouveau compte administrateur :", + "Open the page of an application in the menu": "Ouvrir la page d'une application dans le menu", "Open-source AI-powered coding assistant": "Assistant de codage à source ouverte", "Open-source UI for building and debugging multi-agent and RAG applications": "UI open-source pour la construction et le débogage d'applications multi-agents et RAG", "Open-source self-hosted SQL IDE.": "IDE SQL auto-organisé open-source.", @@ -4803,6 +4932,7 @@ "Press ENTER to continue...": "Appuyez sur ENTER pour continuer...", "Press ENTER to return to the menu...": "Appuyez sur ENTER pour revenir au menu...", "Press ENTER to return...": "Appuyez sur ENTER pour revenir...", + "Press Enter to close this terminal...": "Appuyez sur Entrée pour fermer ce terminal...", "Press Enter to close...": "appuyez sur Entrée pour fermer...", "Press Enter to continue": "Appuyez sur Entrée pour continuer", "Press Enter to continue...": "Appuyez sur Entrée pour continuer...", @@ -4884,6 +5014,7 @@ "ProxMenux Monitor protection": "Protection du ProxMenux Monitor", "ProxMenux Monitor unit repaired and restarted": "Unité ProxMenux Monitor réparée et redémarrée", "ProxMenux Monitor → Backups tab (live progress card with estimated time, logs, rollback delta)": "ProxMenux Monitor → Onglet Sauvegardes (carte de progression en direct avec durée estimée, journaux, delta de restauration)", + "ProxMenux OCI manager Apps (Technology Preview)": "ProxMenux OCI manager Apps (Technology Preview)", "ProxMenux attaches directories, not single files, so this image cannot be installed yet.": "ProxMenux attache des répertoires, pas des fichiers uniques, donc cette image ne peut pas encore être installée.", "ProxMenux can apply open permissions on this NFS directory from the host so the container can read and write:": "ProxMenux peut appliquer des autorisations d'ouverture sur ce répertoire NFS depuis l'hôte afin que le conteneur puisse lire et écrire :", "ProxMenux can remount it with open permissions so any LXC can read and write.": "ProxMenux peut le remonter avec des autorisations ouvertes afin que n'importe quel LXC puisse lire et écrire.", @@ -4903,9 +5034,13 @@ "Proxmology logo applied": "Logo Proxmologie appliqué", "Proxmox 9 system update allready": "La mise à jour du système Proxmox 9 est déjà terminée", "Proxmox APT repositories configured": "Dépôts Proxmox APT configurés", + "Proxmox APT repository inventory is invalid or reports parse errors. Fix sources in {ui}; no repository changed.": "L'inventaire des référentiels APT de Proxmox n'est pas valide ou signale des erreurs d'analyse. Corrigez les sources dans {ui} ; aucun référentiel n'a été modifié.", "Proxmox Backup Server": "Proxmox Backup Server", "Proxmox Backup Server (PBS) destinations": "Destinations Proxmox Backup Server (PBS)", "Proxmox Backup Server APT repositories configured": "Dépôts APT de Proxmox Backup Server configurés", + "Proxmox Backup Server Microcode": "Proxmox Backup Server Microcode", + "Proxmox Backup Server Post Install": "Post-installation de Proxmox Backup Server", + "Proxmox Backup Server Subscription Banner Removal": "Suppression de la bannière d'abonnement de Proxmox Backup Server", "Proxmox Backup Server Update": "Mise à jour de Proxmox Backup Server", "Proxmox Backup Server update completed.": "Mise à jour de Proxmox Backup Server terminée.", "Proxmox CIFS Storage Status:": "État de stockage Proxmox CIFS :", @@ -4927,6 +5062,7 @@ "Proxmox iSCSI Storage Status:": "État du stockage Proxmox iSCSI :", "Proxmox jail configured": "Prison Proxmox configurée", "Proxmox local storages:": "Stockages locaux Proxmox :", + "Proxmox no-subscription standard repository handle unavailable; no repository changed.": "Référence du référentiel standard sans abonnement de Proxmox indisponible ; aucun référentiel n'a été modifié.", "Proxmox repository": "Référentiel Proxmox", "Proxmox repository OK (candidate is 9.x)": "Dépôt Proxmox OK (le candidat est 9.x)", "Proxmox repository configuration completed": "Configuration du référentiel Proxmox terminée", @@ -4994,6 +5130,7 @@ "Rclone mount needs a privileged LXC with FUSE access. The container is dedicated to Rclone and its web UI must not be exposed to untrusted networks.": "Le montage Rclone a besoin d'un LXC privilégié avec accès FUSE. Le conteneur est dédié à Rclone et son interface web ne doit pas être exposée à des réseaux non fiables.", "Rclone mount requires a privileged LXC with FUSE access. Use this profile only on a trusted node and network.": "Rclone monture requires un LXC privilégié avec accès FUSE. Utilisez ce profil uniquement sur un nœud et un réseau de confiance.", "Rclone mount requires a privileged container": "Rclone mount requires un conteneur privilégié", + "Rclone remote": "Remote Rclone", "Re-enter the BORG REPOKEY passphrase to confirm:": "saisissez à nouveau la phrase secrète BORG REPOKEY pour confirmer :", "Re-running pre-check after repairs...": "Nouvelle vérification préalable après réparation...", "Reachable": "Accessible", @@ -5017,6 +5154,7 @@ "Reading SMART self-test log...": "Lecture du journal d'autotest SMART...", "Reading full SMART report...": "Lecture du rapport SMART complet...", "Reading image metadata. Please wait...": "Lecture des métadonnées de l'image. S'il vous plaît, attendez...", + "Ready to create a %s?": "Prêt à créer une %s ?", "Real-time Performance Monitoring": "Surveillance du rendement en temps réel", "Real-time bandwidth usage (press q to exit)": "Utilisation de la bande passante en temps réel (appuyez sur q pour quitter)", "Real-time collaborative document editor": "Éditeur de document collaboratif en temps réel", @@ -5099,15 +5237,19 @@ "Recreation prepared": "Loisirs préparés", "Refresh APT index and verify repositories:": "Actualisez l'index APT et vérifiez les référentiels :", "Refresh the configured APT repositories and review the PBS package upgrade? Repository files will be preserved.": "Actualiser les dépôts APT configurés et examiner la mise à niveau des paquets PBS ? Les fichiers des dépôts seront conservés.", + "Refresh the index from the image sources": "Actualiser l'index à partir des sources d'images", "Refresh token of the connector, from the Twingate admin console": "Jeton d'actualisation du connecteur, depuis la console d'administration Twingate", "Refresh your browser (Ctrl+Shift+R) to see changes": "Actualisez votre navigateur (Ctrl+Shift+R) pour voir les modifications", "Refresh your browser to see changes (server restart may be required)": "Actualisez votre navigateur pour voir les modifications (un redémarrage du serveur peut être nécessaire)", "Refreshing apt cache...": "Actualisation du cache apt...", "Refreshing the NVIDIA runtime...": "Rafraîchir l'exécution NVIDIA...", "Refusing an unexpected rootfs path:": "Refuser un chemin inattendu de roofs :", + "Regenerate the catalog templates": "Régénérer les modèles du catalogue", + "Regenerate the template of one application": "Régénérer le modèle d'une application", "Regenerating PVE package cache...": "Régénération du cache des packages PVE...", "Regenerating boot artifacts for the merged kernel-agnostic changes...": "Régénération des artefacts de démarrage pour les modifications fusionnées indépendantes du noyau...", "Regenerating certificates and restarting services...": "Régénération des certificats et redémarrage des services...", + "Register again the OCI applications restored from a backup": "Enregistrer à nouveau les applications OCI restaurées à partir d'une sauvegarde", "Register mount path in Proxmox:": "Enregistrez le chemin de montage dans Proxmox :", "Registering disk as Proxmox storage...": "Enregistrement du disque en tant que stockage Proxmox...", "Registering module with DKMS...": "Module d'enregistrement avec DKMS...", @@ -5294,6 +5436,7 @@ "Resetting time synchronization...": "Réinitialisation de la synchronisation de l'heure...", "Residual Bookworm entries commented where applicable": "Entrées résiduelles de Bookworm commentées le cas échéant", "Resilio-sync (formerly BitTorrent Sync) uses the BitTorrent protocol to sync files and folders between all of your devices. There are both free and paid versions, this container supports both. There is an official sync image but we created this one as it supports user mapping to simplify permissions for volumes.": "Resilio-sync (anciennement BitTorrent Sync) utilise le protocole BitTorrent pour synchroniser les fichiers et les dossiers entre tous vos appareils. Il y a à la fois des versions gratuites et payantes, ce conteneur supporte les deux. Il y a une image de synchronisation officielle mais nous avons créé celle-ci car elle prend en charge la cartographie utilisateur pour simplifier les autorisations pour les volumes.", + "Resolve catalog icons against the jsdelivr icon sets": "Résoudre les icônes du catalogue à partir des jeux d'icônes jsdelivr", "Resolve package conflicts": "Résoudre les conflits de packages", "Resources": "Ressources", "Restart Network": "Redémarrer le réseau", @@ -5352,6 +5495,7 @@ "Results:": "Résultats :", "Retention": "Rétention", "Retention policy (prune-backups syntax).": "Politique de rétention (syntaxe prune-backups).", + "Retrieving the URL for the %s loader": "Récupération de l'URL du chargeur %s", "RetroArch is a frontend for emulators, game engines and media players. It enables you to run classic games on a wide range of computers and consoles through its slick graphical interface.": "RetroArch est une interface pour les émulateurs, les moteurs de jeu et les joueurs multimédias. Il vous permet d'exécuter des jeux classiques sur une large gamme d'ordinateurs et de consoles grâce à son interface graphique slick.", "Return": "Retour", "Return to Main Menu": "Retour au menu principal", @@ -5431,6 +5575,9 @@ "SCSI (recommended for Linux)": "SCSI (recommandé pour Linux)", "SECURITY CONSIDERATIONS:": "CONSIDÉRATIONS DE SÉCURITÉ :", "SECURITY WARNING:": "AVERTISSEMENT DE SÉCURITÉ :", + "SELECT CUSTOM IMAGE": "SÉLECTIONNER UNE IMAGE PERSONNALISÉE", + "SELECT LOADER": "SÉLECTIONNER LE CHARGEUR", + "SETTINGS": "PARAMÈTRES", "SMART Action": "Action SMART", "SMART Disk Health & Test": "Santé et test du disque SMART", "SMART health status: PASSED": "État de santé SMART : RÉUSSI", @@ -5456,6 +5603,7 @@ "SSH protection (aggressive mode)": "Protection SSH (mode agressif)", "STEP 6: Choose commands based on your storage type": "ÉTAPE 6 : Choisissez les commandes en fonction de votre type de stockage", "STEP 9: Cleanup (LVM only)": "ÉTAPE 9 : Nettoyage (LVM uniquement)", + "STORAGE PLAN": "PLAN DE STOCKAGE", "STORAGE TYPE IDENTIFICATION:": "IDENTIFICATION DU TYPE DE STOCKAGE :", "SUGGESTION FOR": "SUGGESTION POUR", "SWAG serves HTTPS on port 443. Plain HTTP on port 80 is disabled in /config/nginx/site-confs/default.conf.": "SWAG sert HTTPS sur le port 443. Un HTTP simple sur le port 80 est désactivé dans /config/nginx/site-confs/default.conf.", @@ -5536,6 +5684,7 @@ "Scheduled backup job created": "Tâche de sauvegarde planifiée créée", "Scheduled backup jobs": "Travaux de sauvegarde planifiés", "Scheduled backups and retention policies": "Sauvegardes planifiées et politiques de conservation", + "Scheduled run: no questions; stops where a person has to decide": "Exécution planifiée : aucune question ; s'arrête là où une personne doit décider", "Scheduled tasks (cron)": "Tâches planifiées (cron)", "Scheduler script not found:": "Script du planificateur introuvable :", "ScreenScraper": "Scrapeur d'écran", @@ -5545,6 +5694,7 @@ "Script not found:": "Script introuvable :", "Scripts in": "Scripts dans", "ScummVM is a program which allows you to run certain classic graphical adventure and role-playing games, provided you already have their data files. The clever part about this: ScummVM just replaces the executables shipped with the games, allowing you to play them on systems for which they were never designed! ScummVM is a complete rewrite of these games' executables and is not an emulator.": "ScummVM est un programme qui vous permet d'exécuter certaines aventures graphiques classiques et jeux de rôle, à condition que vous ayez déjà leurs fichiers de données. La partie intelligente à ce sujet: ScummVM remplace les exécutables livrés avec les jeux, vous permettant de les jouer sur des systèmes pour lesquels ils n'ont jamais été conçus! ScummVM est une réécriture complète des exécutables de ces jeux et n'est pas un émulateur.", + "SeaBIOS (Legacy)": "SeaBIOS (hérité)", "Sealskin is a self-hosted, client-server platform that enables users to run powerful, containerized desktop applications streamed directly to a web browser. It uses a browser extension to intercept user actions—such as clicking a link or downloading a file and redirects them to a secure, isolated application environment running on a remote server.": "Sealskin est une plate-forme client-serveur auto-organisé qui permet aux utilisateurs d'exécuter des applications de bureau puissantes et containerizzato diffusées directement sur un navigateur Web. Il utilise une extension de navigateur pour intercepter les actions de l'utilisateur – comme cliquer sur un lien ou télécharger un fichier et les rediriger vers un environnement d'application sécurisé et isolé fonctionnant sur un serveur distant.", "Search": "Rechercher", "Search Results for:": "Résultats de recherche pour :", @@ -5730,6 +5880,7 @@ "Selected GPU(s)": "GPU sélectionnés", "Selected GPU(s):": "GPU sélectionnés :", "Selected LXC action": "Action LXC sélectionnée", + "Selected Loader:": "Chargeur sélectionné :", "Selected VM": "VM sélectionnée", "Selected VM action": "Action de VM sélectionnée", "Selected bridge:": "Pont sélectionné :", @@ -5895,6 +6046,7 @@ "Show standard exclude patterns": "Afficher les modèles d'exclusion standard", "Show status of all storage pools": "Afficher l'état de tous les pools de stockage", "Show the QR code of a peer again with: pct exec -- /app/show-peer 1": "Afficher de nouveau le code QR d'un pair avec: pct exec -- /app/show-peer 1", + "Show the summary of a template": "Afficher le résumé d'un modèle", "Show traffic statistics per interface": "Afficher les statistiques de trafic par interface", "Show vzdump backup configuration": "Afficher la configuration de sauvegarde vzdump", "Shows status and type (nfs/cifs/dir/iscsi...).": "Affiche l'état et le type (nfs/cifs/dir/iscsi...).", @@ -6001,6 +6153,7 @@ "Start VM": "Démarrer la machine virtuelle", "Start VM after creation": "Démarrer la VM après la création", "Start VM after creation?": "Démarrer la VM après la création ?", + "Start VM when completed:": "Démarrer la VM une fois terminé :", "Start a container. Use the correct ": "Démarrez un conteneur. Utilisez le bon ", "Start a virtual machine. Use the correct ": "Démarrez une machine virtuelle. Utilisez le bon ", "Start each LXC with Proxmox (no coordinated startup)": "Démarrer chaque LXC avec Proxmox (pas de démarrage coordonné)", @@ -6030,6 +6183,7 @@ "Starting": "Début", "Starting Borg backup...": "Démarrage de la sauvegarde Borg...", "Starting CT": "Démarrage du CT", + "Starting ISO conversion...": "Démarrage de la conversion ISO...", "Starting LXC Privileged to Unprivileged conversion process...": "Démarrage du processus de conversion LXC privilégié en non privilégié...", "Starting LXC Unprivileged to Privileged conversion process...": "Démarrage du processus de conversion LXC non privilégié en privilégié...", "Starting NVIDIA installer. This may take several minutes...": "Démarrage du programme d'installation NVIDIA. Cela peut prendre plusieurs minutes...", @@ -6137,6 +6291,7 @@ "Subscription banner removal failed": "Échec de la suppression de la bannière d'abonnement", "Subscription banner removed successfully": "La bannière d'abonnement a été supprimée avec succès", "Subscription banner restored successfully (desktop and mobile)": "Bannière d'abonnement restaurée avec succès (ordinateur et mobile)", + "Subscription status is not unambiguously active, notfound or expired. Check proxmox-backup-manager subscription get locally; no repository changed.": "L'état de l'abonnement n'est pas clairement active, notfound ou expired. Vérifiez localement avec proxmox-backup-manager subscription get ; aucun référentiel n'a été modifié.", "Success": "Succès", "Successful": "Réussi", "Supervisor does not confirm healthy and supported yet": "Le superviseur ne confirme pas encore la santé et le soutien", @@ -6164,6 +6319,7 @@ "Synchronize time automatically": "Synchroniser l'heure automatiquement", "Synclounge is a third party tool that allows you to watch Plex in sync with your friends/family, wherever you are.": "Synclounge est un outil tiers qui vous permet de regarder Plex en synchronisation avec vos amis/familles, où que vous soyez.", "Syncthing replaces proprietary sync and cloud services with something open, trustworthy and decentralized. Your data is your data alone and you deserve to choose where it is stored, if it is shared with some third party and how it's transmitted over the Internet.": "Syncthing remplace les services propriétaires de synchronisation et de cloud par quelque chose d'ouvert, fiable et décentralisé. Vos données sont vos seules données et vous méritez de choisir où elles sont stockées, si elles sont partagées avec un tiers et comment elles sont transmises sur Internet.", + "Synology VM Creator": "Créateur de VM Synology", "Sysctl not namespaced or not valid:": "Sysctl n'est pas espace ou n'est pas valide:", "System": "Système", "System CLI Tools": "Outils CLI système", @@ -6185,6 +6341,7 @@ "System path mounts are not yet supported": "Les montages du chemin système ne sont pas encore pris en charge", "System reboot required": "Redémarrage du système requis", "System upgrade completed": "Mise à niveau du système terminée", + "System upgrade failed. Check log:": "La mise à niveau du système a échoué. Consultez le journal :", "System uptime": "Disponibilité du système", "Systemd ulimits set": "Ensemble de limites ulimites Systemd", "TCP BBR configuration created successfully": "Configuration TCP BBR créée avec succès", @@ -6248,10 +6405,13 @@ "The Bookmark Everything App": "L'application Tout Signet", "The Brave browser is a fast, private and secure web browser for PC, Mac and mobile.": "Le navigateur Brave est un navigateur Web rapide, privé et sécurisé pour PC, Mac et mobile.", "The CT already exists:": "Le CT existe déjà:", + "The Compose document must be a mapping.": "Le document Compose doit être un mappage.", "The Compose file declares no service": "Le fichier Compose déclare aucun service", "The Compose file describes several images:": "Le fichier Compose décrit plusieurs images :", "The Compose file describes several services:": "Le fichier Compose décrit plusieurs services :", "The Compose file does not contain a Compose document": "Le fichier Compose ne contient pas de document Compose", + "The Compose file has no services.": "Le fichier Compose n'a aucun service.", + "The Compose file has no x-casaos metadata.": "Le fichier Compose n'a pas de métadonnées x-casaos.", "The Compose file is not valid YAML:": "Le fichier Compose n'est pas valide 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.": "Le Compose offre une relaxation en option AppArmor ou seccomp ; il restera désactivé à moins que l'utilisateur le sélectionne. Continuez seulement si vous faites confiance à l'image et acceptez ce risque.", "The Compose value must be text or a list:": "La valeur Compose doit être un texte ou une liste :", @@ -6301,9 +6461,11 @@ "The PostgreSQL volume needs at least 4 GB": "Le volume PostgreSQL nécessite au moins 4 Go", "The PostgreSQL volume needs at least 8 GB": "Le volume PostgreSQL nécessite au moins 8 Go", "The ProxMenux Monitor update checker is not available. Start or update ProxMenux Monitor and try again.": "La vérification des mises à jour de ProxMenux Monitor est indisponible. Démarrez ou mettez à jour ProxMenux Monitor, puis réessayez.", + "The ProxMenux application catalogue is not a list": "Le catalogue d'applications ProxMenux n'est pas une liste", "The Proxmox VE 8 update did not finish. The upgrade to Proxmox VE 9 was not started.": "La mise à jour de Proxmox VE 8 n’a pas abouti. La mise à niveau vers Proxmox VE 9 n’a pas été lancée.", "The Proxmox archive keyring is missing; Ceph installation cannot continue safely": "Le trousseau de clés d'archive Proxmox est manquant ;L'installation de Ceph ne peut pas continuer en toute sécurité", "The Proxmox inventory and the local configurations differ": "L'inventaire Proxmox et les configurations locales diffèrent", + "The README has no recognisable docker-compose section": "Le README n'a aucune section docker-compose reconnaissable", "The ROCm image has no support for the AMD GPU of this host:": "L'image ROCm ne prend pas en charge le GPU AMD de cet hôte :", "The ROCm image of this application has no support for the AMD GPU of this host:": "L'image ROCm de cette application ne prend pas en charge le GPU AMD de cet hôte :", "The Rclone configuration needs at least 1 GB": "La configuration Rclone nécessite au moins 1 Go", @@ -6340,6 +6502,8 @@ "The administrator email is not valid": "Le courriel de l'administrateur n'est pas valide", "The administrator user contains characters that are not allowed": "L'utilisateur administrateur contient des caractères qui ne sont pas autorisés", "The all-in-one AI application.": "L'application d'IA tout-en-un.", + "The application '{app_id}' does not come from LinuxServer": "L'application '{app_id}' ne provient pas de LinuxServer", + "The application '{app_id}' is not in the index": "L'application '{app_id}' n'est pas dans l'index", "The application configuration needs a first start to complete.": "La configuration de l'application nécessite un premier démarrage à compléter.", "The application could not be modified:": "L'application n'a pas pu être modifiée :", "The application could not be recovered:": "L'application n'a pas pu être récupérée :", @@ -6369,6 +6533,7 @@ "The backup was taken on a different PVE or kernel major.minor. These paths will be SKIPPED to keep the boot safe:": "La sauvegarde a été effectuée sur un autre PVE ou noyau major.minor. Ces chemins seront SAUTÉS pour assurer la sécurité du démarrage :", "The bind mount target escapes the rootfs:": "La cible de montage de liaison échappe aux roofs:", "The block device does not exist:": "Le dispositif de blocage n'existe pas :", + "The block found does not look like a Docker Compose file": "Le bloc trouvé ne ressemble pas à un fichier Docker Compose", "The build could not be checked beforehand; continuing without that check.": "La build n'a pas pu être vérifiée au préalable ;continuer sans cette vérification.", "The cached image does not match the current digest": "L'image mise en cache ne correspond pas au digest actuel", "The cached image is damaged; it will be downloaded again.": "L'image mise en cache est endommagée ; elle sera à nouveau téléchargée.", @@ -6453,6 +6618,8 @@ "The disk size cannot be reproduced": "La taille du disque ne peut pas être reproduite", "The disk usage of the container could not be read": "L'utilisation du disque du conteneur n'a pas pu être lue", "The disks of the failed attempt could not be removed and stay in the temporary container:": "Les disques de la tentative échouée n'ont pas pu être supprimés et restent dans le conteneur temporaire :", + "The docker-compose block is not closed": "Le bloc docker-compose n'est pas fermé", + "The docker-compose section contains no code block": "La section docker-compose ne contient aucun bloc de code", "The domain must resolve to the public address of this network before the certificate can be issued.": "Le domaine doit se résoudre à l'adresse publique de ce réseau avant la délivrance du certificat.", "The download client still needs to be configured.": "Le client de téléchargement doit encore être configuré.", "The download stopped progressing; cancelling this attempt.": "Le téléchargement a cessé de progresser; annuler cette tentative.", @@ -6486,6 +6653,7 @@ "The fstab entry will still be removed; reboot or manual umount needed.": "L'entrée fstab sera toujours supprimée ; redémarrage ou démontage manuel nécessaire.", "The gateway must be another usable address in the same subnet.": "La passerelle doit être une autre adresse utilisable dans le même sous-net.", "The gateway should appear in your Tailscale admin console shortly.": "La passerelle devrait bientôt apparaître dans votre console d'administration Tailscale.", + "The generated template does not match the schema:": "Le modèle généré ne correspond pas au schéma :", "The guest access test did not succeed.": "Le test d'accès invité n'a pas réussi.", "The healthcheck cannot run without an IP address": "Le contrôle de santé ne peut pas fonctionner sans adresse IP", "The host NVIDIA driver is not responding correctly": "Le pilote NVIDIA hôte ne répond pas correctement", @@ -6563,6 +6731,8 @@ "The long test runs directly on the disk hardware.": "Le test long s'exécute directement sur le matériel du disque.", "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.": "Le conteneur d'apprentissage automatique est reconstruit avec l'image du nouveau choix. Son cache de modèles, la bibliothèque et la base de données sont conservés. L'ensemble de l'application est arrêté et mis à jour, comme lors d'une mise à jour. Si l'opération échoue après le changement d'un conteneur, les conteneurs précédents et le choix précédent sont restaurés. Une opération qui s'arrête à mi-chemin est récupérée depuis le menu de gestion 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.": "Le conteneur d'apprentissage automatique est reconstruit avec l'image du nouveau choix. Son cache de modèles, la bibliothèque et la base de données sont conservés. L'ensemble de l'application est arrêté et mis à jour, comme lors d'une mise à jour ; si quelque chose échoue, les conteneurs précédents et le choix précédent sont restaurés.", + "The main Compose service cannot be identified unambiguously": "Le service Compose principal ne peut pas être identifié sans ambiguïté", + "The main Compose service has no image.": "Le service Compose principal n'a pas d'image.", "The main container of this application is not on this host. Restore it too.": "Le conteneur principal de cette application n'est pas sur cet hôte. Restaurez-le également.", "The main member must stop first and start last": "Le membre principal doit s'arrêter en premier et commencer en dernier", "The main member of the stack is missing": "Le membre principal de la pile est manquant", @@ -6876,6 +7046,7 @@ "This guarantees that device nodes are available before applying LXC GPU config.": "Cela garantit que les nœuds de périphérique sont disponibles avant d'appliquer la configuration GPU LXC.", "This host architecture is not supported by the OCI image importer.": "Cette architecture hôte n'est pas prise en charge par l'importateur d'images OCI.", "This host has no active subscription, switch to the no-subscription repository? The inaccessible Enterprise PVE source will be disabled. Enterprise Ceph sources, if present, will be disabled without choosing a replacement Ceph channel; configure Ceph separately if needed.": "Cet hôte n'a pas d'abonnement actif, passer au référentiel sans abonnement ? La source PVE Enterprise, inaccessible, sera désactivée. Les sources Ceph Enterprise, si elles sont présentes, seront désactivées sans choisir de canal Ceph de remplacement ; configurez Ceph séparément si nécessaire.", + "This host runs {name} on {suite}, but these {name} repositories are for another suite: {details}. Disable or remove them in {ui} and run the update again; no repository changed.": "Cet hôte exécute {name} sur {suite}, mais ces référentiels {name} sont destinés à une autre suite : {details}. Désactivez-les ou supprimez-les dans {ui} et relancez la mise à jour ; aucun référentiel n'a été modifié.", "This image cannot be installed as it is described:": "Cette image ne peut pas être installée comme elle est décrite :", "This image has no compatible Linux image for this host ({architecture}).": "Cette image n'a pas d'image Linux compatible pour cet hôte ({architecture}).", "This image requires the host module": "Cette image requirese le module hôte", @@ -6946,6 +7117,7 @@ "This will add the mount to /etc/fstab so it persists after reboot.": "Cela ajoutera le montage à /etc/fstab afin qu'il persiste après le redémarrage.", "This will completely remove Fail2Ban and its configuration. Continue?": "Cela supprimera complètement Fail2Ban et sa configuration. Continuer?", "This will completely remove Lynis from the system. Continue?": "Cela supprimera complètement Lynis du système. Continuer?", + "This will create a New %s. Proceed?": "Cela va créer une nouvelle %s. Continuer ?", "This will create a new VM": "Cela créera une nouvelle VM", "This will deploy a Tailscale VPN gateway for secure remote access.": "Cela permettra de déployer une passerelle VPN Tailscale pour un accès à distance sécurisé.", "This will install and configure Fail2Ban with:": "Cela installera et configurera Fail2Ban avec :", @@ -7052,6 +7224,8 @@ "Umbrel OS installer script by Helper Scripts\n\nVisit the GitHub repo to learn more, contribute, or support the project:\n\nhttps://community-scripts.github.io/ProxmoxVE/scripts?id=umbrel-os-vm": "Script d'installation du système d'exploitation Umbrel par Helper Scripts\n\nVisitez le dépôt GitHub pour en savoir plus, contribuer ou soutenir le projet :\n\nhttps://community-scripts.github.io/ProxmoxVE/scripts?id=umbrel-os-vm", "Unable to detect Proxmox version": "Impossible de détecter la version de Proxmox", "Unable to detect Proxmox version.": "Impossible de détecter la version de Proxmox.", + "Unable to detect a valid storage location for EFI disk.": "Impossible de détecter un emplacement de stockage valide pour le disque EFI.", + "Unable to detect a valid storage location.": "Impossible de détecter un emplacement de stockage valide.", "Unable to determine the installed memory.": "Impossible de déterminer la mémoire installée.", "Unable to identify the root filesystem. Aborting.": "Impossible d'identifier le système de fichiers racine. Avorter.", "Unable to resolve system ZFS pool disks. Aborting.": "Impossible de résoudre les disques du pool système ZFS.Avorter.", @@ -7155,6 +7329,7 @@ "Unsupported OCI digest:": "Digest OCI non pris en charge:", "Unsupported OCI-LXC AppArmor profile:": "Profil OCI-LXC AppArmor non soutenu :", "Unsupported OCI-LXC seccomp profile:": "Profil de seccomp OCI-LXC non pris en charge:", + "Unsupported Proxmox suite; no repository changed.": "Suite Proxmox non prise en charge ; aucun référentiel n'a été modifié.", "Unsupported Terminal": "Terminal non pris en charge", "Unsupported architecture for Figurine:": "Architecture non prise en charge pour Figurine :", "Unsupported architecture:": "Architecture non supportée :", @@ -7166,6 +7341,7 @@ "Unsupported device type:": "Type de périphérique non pris en charge:", "Unsupported dynamic NVIDIA capabilities:": "Capacités NVIDIA dynamiques non soutenues:", "Unsupported format. Only .ova and .ovf files are supported.": "Format non pris en charge. Seuls les fichiers .ova et .ovf sont pris en charge.", + "Unsupported host architecture:": "Architecture de l'hôte non prise en charge :", "Unsupported kept setting:": "paramètre conservé non pris en charge :", "Unsupported media storage mode:": "Mode de stockage multimédia non supporté:", "Unsupported mount options": "Options de montage non prises en charge", @@ -7213,6 +7389,8 @@ "Update completed. Press Enter to continue...": "Mise à jour terminée. Appuyez sur Entrée pour continuer...", "Update credentials": "Mettre à jour les informations d'identification", "Update every container of the application": "Mettre à jour chaque conteneur de l'application", + "Update for %s completed.": "Mise à jour de %s terminée.", + "Update for %s exited with status %s.": "La mise à jour de %s s'est terminée avec le statut %s.", "Update kernel to compatible version": "Mettre à jour le noyau vers une version compatible", "Update now?": "Mise à jour ?", "Update package index:": "Index du package de mise à jour :", @@ -7221,6 +7399,7 @@ "Update system to latest PVE 8.4+ (if not done already):": "Mettre à jour le système vers la dernière version PVE 8.4+ (si ce n'est déjà fait) :", "Update the image with the saved configuration": "Mettre à jour l'image avec la configuration enregistrée", "Update the whole stack?": "Mettre à jour toute la pile ?", + "Update, modify or recreate one installed OCI instance": "Mettre à jour, modifier ou recréer une instance OCI installée", "Updated": "Mis à jour", "Updated sharedfiles group to GID: 101000": "Groupe de fichiers partagés mis à jour vers GID : 101000", "Updated stack checked": "Correction de la pile", @@ -7232,6 +7411,7 @@ "Updates available": "Mises à jour disponibles", "Updates file is empty or unreadable.": "Le fichier de mises à jour est vide ou illisible.", "Updating": "Mise à jour", + "Updating %s (running %s from %s flow)...": "Mise à jour de %s (exécution de %s depuis le flux %s)...", "Updating APT package lists...": "Mise à jour des listes de packages APT...", "Updating Debian Bookworm → Trixie in sources.list...": "Mise à jour de Debian Bookworm → Trixie dans sources.list...", "Updating Figurine binary...": "Mise à jour du binaire Figurine...", @@ -7332,7 +7512,20 @@ "Username on the Borg server that runs \"borg serve\" (typically \"borg\"). This is NOT the admin/root user of the server — that one is asked later only if you choose \"Generate a new key and authorize it\".": "nom d'utilisateur sur le serveur Borg qui exécute \"borg serve\" (généralement \"borg\").Il ne s'agit PAS de l'administrateur/utilisateur root du serveur — celui-ci n'est demandé plus tard que si vous choisissez \"Générer une nouvelle clé et l'autoriser\".", "Username:": "Nom d'utilisateur:", "Users:": "Utilisateurs :", + "Using Advanced Settings": "Utilisation des paramètres avancés", + "Using BIOS Type:": "Type de BIOS utilisé :", + "Using Bridge:": "Pont utilisé :", + "Using CPU Model:": "Modèle de CPU utilisé :", + "Using Custom Image:": "Image personnalisée utilisée :", + "Using Default Settings": "Utilisation des paramètres par défaut", + "Using Hostname:": "Nom d'hôte utilisé :", + "Using Interface MTU Size:": "Taille MTU de l'interface utilisée :", + "Using MAC Address:": "Adresse MAC utilisée :", + "Using Machine Type:": "Type de machine utilisé :", "Using UUID is recommended over /dev/sdX.": "L'utilisation de l'UUID est recommandée plutôt que /dev/sdX.", + "Using VLAN:": "VLAN utilisé :", + "Using Virtual Machine ID:": "ID de machine virtuelle utilisé :", + "Using Vlan:": "VLAN utilisé :", "Using advanced configuration": "Utilisation de la configuration avancée", "Using default Proxmox logo...": "Utilisation du logo Proxmox par défaut...", "Using existing encryption key:": "Utilisation de la clé de chiffrement existante :", @@ -7356,6 +7549,8 @@ "VFIO orphans cleared and initramfs rebuilt — next boot will free the GPU.": "les orphelins VFIO effacés et initramfs reconstruits — le prochain démarrage libérera le GPU.", "VFIO orphans cleared but initramfs rebuild failed; check /var/log/proxmenux logs.": "les orphelins VFIO ont été effacés mais la reconstruction d'initramfs a échoué ;vérifiez les journaux /var/log/proxmenux.", "VFS cache mode": "Mode cache VFS", + "VIRTUAL DISK": "DISQUE VIRTUEL", + "VIRTUAL MACHINE ID": "ID DE MACHINE VIRTUELLE", "VLAN": "VLAN", "VLC Media Player is a free and open source cross-platform multimedia player and framework that delivers dependable performance across multiple devices.": "VLC Médias Le lecteur est un lecteur multimédia multiplateforme libre et ouvert qui offre des performances fiables sur plusieurs appareils.", "VM": "VM", @@ -7367,6 +7562,7 @@ "VM Storage (images, backup)": "Stockage VM (images, sauvegarde)", "VM and CT Management Commands": "Commandes de gestion VM et CT", "VM and CT backup jobs (Datacenter > Backup)": "Tâches de sauvegarde VM et CT (Datacenter > Sauvegarde)", + "VM created with errors. Check configuration.": "VM créée avec des erreurs. Vérifiez la configuration.", "VM creation cancelled before disk planning.": "Création de VM annulée avant la planification du disque.", "VM creation cancelled by user.": "Création de VM annulée par l'utilisateur.", "VM creation completed": "Création de VM terminée", @@ -7460,6 +7656,7 @@ "Virtual Function": "Fonction virtuelle", "Virtual Function (parent PF:": "Fonction virtuelle (PF parent :", "Virtual Machine ID": "ID de machine virtuelle", + "Virtual Machine ID:": "ID de machine virtuelle :", "Virtual disk": "Disque virtuel", "Virtual disks": "Disques virtuels", "Virtual display already set to": "Affichage virtuel déjà réglé sur", @@ -7476,6 +7673,7 @@ "Volume configuration cancelled": "Configuration du volume annulée", "Volume options are not yet supported": "Les options de volume ne sont pas encore prises en charge", "Volume size in GB": "Volume en GB", + "Volumes": "Volumes", "Volumes attached": "Volumes joints", "Volumes prepared for the first start:": "Volumes préparés pour le premier départ:", "Volumes shared between services are not yet supported": "Les volumes partagés entre les services ne sont pas encore pris en charge", @@ -7676,6 +7874,7 @@ "ZRAM profile removed, but package purge failed": "Profil ZRAM supprimé, mais la purge du package a échoué", "ZRAM still holds pages; configuration was preserved": "ZRAM contient toujours des pages ; la configuration a été conservée", "ZRAM still holds pages; profile remains active": "ZRAM contient toujours des pages ; le profil reste actif", + "ZRAM swap profile": "Profil d'échange ZRAM", "ZRAM swap profile enabled": "Profil d'échange ZRAM activé", "ZRAM swap profile removed": "Profil d'échange ZRAM supprimé", "ZSTD - fast, good ratio (recommended)": "ZSTD - rapide, bon rapport (recommandé)", @@ -7742,6 +7941,7 @@ "chmod 1777 + setfacl o::rwx (applied on the NFS share from this host)": "chmod 1777 + setfacl o::rwx (appliqué sur le partage NFS de cet hôte)", "chmod failed — NFS server may be restricting changes from root": "chmod a échoué — Le serveur NFS restreint peut-être les modifications depuis la racine", "chown/chmod failed — likely unprivileged CT against host bind mount. Falling back to ACL.": "chown/chmod a échoué - CT probablement non privilégié contre le montage de liaison de l'hôte. Revenir à ACL.", + "clone source mount tree": "cloner l'arborescence de montage source", "containers": "contenants", "containers of": "contenants", "content:": "contenu:", @@ -7781,6 +7981,7 @@ "driver:": "pilote:", "e.g.": "Par exemple", "empty = generate": "vide = générer", + "enter container namespace": "entrer dans l'espace de noms du conteneur", "exFAT (portable: Windows/Linux/macOS)": "exFAT (portable : Windows/Linux/macOS)", "exFAT tools installed successfully.": "Outils exFAT installés avec succès.", "experimental on this GPU": "expérimental sur ce GPU", @@ -7813,10 +8014,12 @@ "fstab entry exists": "l'entrée fstab existe", "fstab line:": "ligne fstab :", "fstab references UUIDs/devices not present on this host:": "fstab fait référence aux UUID/périphériques non présents sur cet hôte :", + "function '%s' is not defined in the %s flow.": "la fonction '%s' n'est pas définie dans le flux %s.", "gasket DKMS entries removed.": "Les entrées DKMS de gasket ont été supprimées.", "gasket-dkms has been fully removed from this system.": "gasket-dkms a été entièrement supprimé de ce système.", "gasket-dkms is still reported by dpkg in state:": "gasket-dkms est toujours signalé par dpkg dans l'état :", "gawk installed": "bouche bée installé", + "genisoimage/mkisofs not found.": "genisoimage/mkisofs introuvable.", "go2rtc WebUI": "go2rtc WebUI", "google/gasket-driver cloned (fallback — will apply local patches).": "google/gasket-driver cloné (repli – appliquera les correctifs locaux).", "gpg not found; trying apt-key fallback": "gpg introuvable ; essayer la solution de secours apt-key", @@ -7860,6 +8063,7 @@ "individual template is blocked": "modèle individuel est bloqué", "initramfs updated": "initramfs mis à jour", "initramfs updated.": "initramfs mis à jour.", + "installable": "installable", "installed": "installé", "installed but command not immediately available": "installé mais la commande n'est pas immédiatement disponible", "installed correctly and available": "installé correctement et disponible", @@ -7876,6 +8080,7 @@ "intel_iommu/amd_iommu is set in cmdline but no IOMMU groups exist — IOMMU appears disabled in BIOS. Enable VT-d / AMD-Vi in firmware before continuing.": "intel_iommu/amd_iommu est défini dans cmdline mais aucun groupe IOMMU n'existe — IOMMU semble désactivé dans le BIOS. Activez VT-d / AMD-Vi dans le firmware avant de continuer.", "interfaces": "interfaces", "into an LXC.": "dans un LXC.", + "invalid source '%s' (must be 'auto', 'custom', or 'detected')": "source '%s' non valide (doit être 'auto', 'custom' ou 'detected')", "iperf3 - Bandwidth test": "iperf3 - Test de bande passante", "iperf3 - Bandwidth test (Client mode)": "iperf3 - Test de bande passante (mode Client)", "iperf3 - Bandwidth test (Server mode)": "iperf3 - Test de bande passante (mode serveur)", @@ -7902,9 +8107,12 @@ "is one of the": "est l'un des", "is referenced in the following stopped VM(s)/CT(s):": "est référencé dans les VM/CT arrêtés suivants :", "it asks for the network of the host; the container gets its own address instead": "il demande le réseau de l'hôte; le conteneur obtient sa propre adresse à la place", + "it asks for two different memory limits": "il demande deux limites de mémoire différentes", "it could not be started:": "il n'a pas pu être démarré :", + "it describes more than one image": "il décrit plus d'une image", "it is locked or its disk could not be mounted": "il est verrouillé ou son disque n'a pas pu être monté", "it publishes no other architecture": "il ne publie aucune autre architecture", + "it uses Compose configs, which have no equivalent here": "il utilise des configs Compose, qui n'ont pas d'équivalent ici", "it uses an NVIDIA GPU and this host has no working NVIDIA driver and Container Toolkit. Install them and run the recovery again.": "il utilise un GPU NVIDIA et cet hôte n'a pas de pilote NVIDIA fonctionnel ni de Container Toolkit. Installez-les et relancez la récupération.", "it uses the Compose option": "il utilise l'option Composer", "its NVIDIA runtime could not be rebuilt for the driver of this host; the container will not start until it is installed again:": "son runtime NVIDIA n'a pas pu être reconstruit pour le pilote de cet hôte ; le conteneur ne démarrera pas tant qu'il ne sera pas réinstallé :", @@ -7912,10 +8120,13 @@ "its Rclone mount is published by a host script that a backup does not include. Enable the mount again from the Rclone entry of the catalog before starting it.": "son montage Rclone est publié par un script hôte qu'une sauvegarde n'inclut pas. Réactivez le montage depuis l'entrée Rclone du catalogue avant de le démarrer.", "its backup was made before ProxMenux kept the record inside the container": "sa sauvegarde a été effectuée avant que ProxMenux ne conserve l'enregistrement à l'intérieur du conteneur", "its configuration could not be read": "sa configuration n'a pas pu être lue", + "its health check is not written in a way that can be read": "son contrôle de santé n'est pas écrit d'une manière lisible", "its hookscript does not exist on this host:": "son hookscript n'existe pas sur cet hôte :", "its host firewall rule was not added:": "sa règle de pare-feu hôte n'a pas été ajoutée :", "its include exists with other content:": "son include existe avec un autre contenu :", "its record is missing and it was not found among the restored containers": "son enregistrement est manquant et il n'a pas été trouvé parmi les conteneurs restaurés", + "its shared memory size is not written in a way that can be read": "sa taille de mémoire partagée n'est pas écrite d'une manière lisible", + "its stop timeout is not written in a way that can be read": "son délai d'arrêt n'est pas écrit d'une manière lisible", "journald MaxLevelStore is adequate for auth logging": "journald MaxLevelStore est adéquat pour la journalisation d'authentification", "journald drop-in created: /etc/systemd/journald.conf.d/proxmenux-loglevel.conf": "Journald drop-in créé : /etc/systemd/journald.conf.d/proxmenux-loglevel.conf", "journald log level restored": "niveau de journalisation restauré", @@ -7931,6 +8142,7 @@ "keep-weekly (0 disables)": "garder-hebdomadaire (0 désactive)", "keep-yearly (0 disables)": "conserver annuellement (0 désactive)", "keeping current settings": "conserver les paramètres actuels", + "kernel": "noyau", "kexec configured successfully. Use the command: reboot-quick": "kexec configuré avec succès. Utilisez la commande : reboot-quick", "kexec-pve service enabled": "Service kexec-pve activé", "kexec-pve service file created": "fichier de service kexec-pve créé", @@ -7943,12 +8155,15 @@ "layers": "couches", "legacy .link file(s) to the ProxMenux-managed format": "les anciens fichiers .link au format géré par ProxMenux", "log2ram completely removed from system": "log2ram complètement supprimé du système", + "main container of the application": "conteneur principal de l'application", + "make cloned mount tree read-only": "rendre l'arborescence de montage clonée en lecture seule", "manually inside the container before starting it.": "manuellement à l'intérieur du conteneur avant de le démarrer.", "manually inside the container.": "manuellement à l'intérieur du conteneur.", "maximum performance": "performances maximales", "may be closed — trying discovery anyway...": "peut être fermé — essayez quand même la découverte...", "melonDS aims at providing fast and accurate Nintendo DS emulation.": "melonDS vise à fournir une émulation rapide et accurate Nintendo DS.", "members:": "membres:", + "memory": "mémoire", "minimum": "minimum", "missing": "manquant", "mkfs.btrfs not found. Install btrfs-progs and retry.": "mkfs.btrfs introuvable. Installez btrfs-progs et réessayez.", @@ -7963,6 +8178,7 @@ "needs a relaxed AppArmor or seccomp profile": "nécessite un profil AppArmor ou seccomp détendu", "needs stack review": "examen de la pile des besoins", "needs these external services, already running:": "a besoin de ces services externes, déjà en cours d'exécution :", + "network": "réseau", "never": "jamais", "next free": "suivant gratuit", "next free block": "prochain bloc libre", @@ -7973,11 +8189,14 @@ "no declarative value": "aucune valeur déclarative", "no passphrase": "pas de phrase secrète", "no password": "pas de mot de passe", + "no-subscription repository": "référentiel sans abonnement", "no_root_squash": "no_root_squash", "non-ProxMenux .tar archive(s) in this path": "Archive(s) .tar non-ProxMenux dans ce chemin", + "none": "aucun", "not available yet": "non encore disponible", "not changed": "pas modifié", "not found.": "pas trouvé.", + "not generated": "non généré", "not installed": "non installé", "not reliable on this hardware due to the following limitations": "non fiable sur ce matériel en raison des limitations suivantes", "nouveau driver has been blacklisted.": "Le pilote nouveau a été mis sur liste noire.", @@ -8017,6 +8236,7 @@ "pct exec authorization failed": "Échec de l’autorisation pour pct exec", "pct push failed. Check log:": "Échec de pct push. Consultez le journal :", "pending (reboot required to enumerate full group)": "en attente (redémarrage requis pour énumérer le groupe complet)", + "pending adaptation": "adaptation en attente", "phpMyAdmin is installed with arbitrary server connections enabled: the login page has a Server field where the address of the MySQL or MariaDB server is entered, together with its user and password.": "phpMyAdmin est installé avec des connexions de serveur arbitraires activées : la page de connexion a un champ Serveur où l'adresse du serveur MySQL ou MariaDB est saisie, ainsi que son utilisateur et son mot de passe.", "pigz configuration completed": "configuration pigz terminée", "pigz enabled in vzdump configuration": "pigz activé dans la configuration de vzdump", @@ -8026,10 +8246,13 @@ "playit.gg has to claim this agent before it forwards anything. The agent prints a one-time claim link on the container console and keeps it there until the link is opened.": "playit.gg doit réclamer cet agent avant qu'il n'avance quoi que ce soit. L'agent imprime un lien de réclamation unique sur la console du conteneur et le garde là jusqu'à ce que le lien soit ouvert.", "port": "port", "portmapper/rpcbind has been disabled": "portmapper/rpcbind a été désactivé", + "print the estimated unpacked size in MiB (0 when unknown)": "afficher la taille estimée une fois décompressé en MiB (0 si inconnue)", "private network assigned automatically": "réseau privé attribué automatiquement", "privileged LXC": "privilégié LXC", + "provide either SOURCE_TYPE+FUNCTION_NAME (single mode) or FUNCTIONS_BATCH (batch mode).": "fournissez soit SOURCE_TYPE+FUNCTION_NAME (mode unique), soit FUNCTIONS_BATCH (mode lot).", "proxmox-backup-client reported:": "proxmox-backup-client a signalé :", "proxmox-boot-tool refreshed": "proxmox-boot-tool actualisé", + "publish mount tree": "publier l'arborescence de montage", "pve-enterprise.list update skipped (no change)": "Mise à jour de pve-enterprise.list ignorée (aucun changement)", "pve-enterprise.list updated to Trixie": "pve-enterprise.list mis à jour vers Trixie", "pvecm command not found (might not be in a cluster)": "Commande pvecm introuvable (peut-être pas dans un cluster)", @@ -8042,6 +8265,7 @@ "pvesm status failed": "Échec de pvesm status", "pyLoad is a Free and Open Source download manager written in Python and designed to be extremely lightweight, easily extensible and fully manageable via web.": "pyLoad est un gestionnaire de téléchargement gratuit et Open Source écrit en Python et conçu pour être extrêmement léger, facilement extensible et entièrement gérable via le web.", "pyLoad web interface": "PyLoad interface web", + "python3-jsonschema is required to generate templates": "python3-jsonschema est requis pour générer les modèles", "qBittorrent WebUI password (user: admin)": "qBittorrent Mot de passe WebUI (utilisateur: admin)", "qBittorrent already has a configuration; it is not overwritten": "qBittorrent a déjà une configuration; elle n'est pas écrasée", "qBittorrent configured": "qBittorrent configuré", @@ -8063,12 +8287,14 @@ "removed from Proxmox": "supprimé de Proxmox", "removed in Proxmox": "supprimée dans Proxmox", "removed successfully from Proxmox.": "supprimé avec succès de Proxmox.", + "removed unused image archive: {path} ({size} bytes)": "archive d'image inutilisée supprimée : {path} ({size} octets)", "requires running the official installer, which restarts the Monitor service.": "nécessite l'exécution du programme d'installation officiel, qui redémarre le service Monitor.", "requires the package": "nécessite le paquet", "restarted successfully": "redémarré avec succès", "restoring /etc/network would lose connectivity": "la restauration de /etc/network perdrait la connectivité", "restoring on:": "restauration sur :", "retries": "nouvelles tentatives", + "return to host namespace": "revenir à l'espace de noms de l'hôte", "reverse proxy": "proxy inverse", "root and real users only": "utilisateurs root et réels uniquement", "rpcbind could not be disabled completely": "rpcbind n'a pas pu être complètement désactivé", @@ -8113,6 +8339,7 @@ "storage yet.": "stockage pour le moment.", "storage(s) from backup exist on target": "le ou les stockages de la sauvegarde existent sur la cible", "storage.": "stockage.", + "subscription banner": "bannière d'abonnement", "successfully formatted with": "formaté avec succès avec", "suggested:": "suggéré:", "switch_gpu_mode.sh was not found.": "switch_gpu_mode.sh n'a pas été trouvé.", @@ -8121,18 +8348,22 @@ "systemctl restart networking failed:": "Échec de systemctl restart networking :", "systemd OnCalendar expression": "expression systemd OnCalendar", "the API key was not generated on the first start": "la clé API n'a pas été générée au premier démarrage", + "the GPU did not answer in time": "le GPU n'a pas répondu à temps", "the NVIDIA hook of the container is not available:": "le hook NVIDIA du conteneur n'est pas disponible :", "the bridge does not exist on this host:": "le pont n'existe pas sur cet hôte :", "the bridge exists on this host with another network:": "le pont existe sur cet hôte avec un autre réseau :", "the container has its own address, so the port Docker published on the host is not needed": "le conteneur a sa propre adresse, donc le port Docker publié sur l'hôte n'est pas nécessaire", "the containers do not agree on the private network of": "les conteneurs ne s'accordent pas sur le réseau privé de", "the device does not exist on this host:": "le périphérique n'existe pas sur cet hôte :", + "the devices it asks for are not written in a way that can be read": "les périphériques qu'il demande ne sont pas écrits d'une manière lisible", "the host directory does not exist:": "le répertoire hôte n'existe pas :", "the host firewall rule of the installation is not added again; allow its port in the firewall of this host if you use it.": "la règle de pare-feu hôte de l'installation n'est pas ajoutée à nouveau ; autorisez son port dans le pare-feu de cet hôte si vous l'utilisez.", + "the memory limit it asks for cannot be applied": "la limite de mémoire qu'il demande ne peut pas être appliquée", "the minimum number of characters is": "le nombre minimum de caractères est", "the qBittorrent schema is not available": "le schéma qBittorrent n'est pas disponible", "the record it carries does not belong to this container": "l'enregistrement qu'il transporte n'appartient pas à ce conteneur", "the record of the application does not list this container": "l'enregistrement de l'application ne répertorie pas ce conteneur", + "the resource limits it asks for cannot be applied": "les limites de ressources qu'il demande ne peuvent pas être appliquées", "the settings of its include are not in the record:": "les paramètres de son include ne sont pas dans l'enregistrement :", "the start order of its dependencies is not in the record": "l'ordre de démarrage de ses dépendances n'est pas dans l'enregistrement", "this configuration needs the device": "cette configuration nécessite le périphérique", @@ -8157,6 +8388,7 @@ "unsupported dependency condition": "état de dépendance non soutenu", "unsupported external credential or boolean": "credential ou booléen", "unsupported variable": "variable non prise en charge", + "update for %s exited with status %s.": "la mise à jour de %s s'est terminée avec le statut %s.", "updating": "mise à jour", "updating NVIDIA userspace libs": "mise à jour des bibliothèques d'espace utilisateur NVIDIA", "user packages missing — will be installed automatically:": "packages utilisateur manquants – seront installés automatiquement :", @@ -8185,6 +8417,7 @@ "with Proxmox": "avec Proxmox", "with prefix, e.g.": "avec préfixe, par exemple", "with the password you provided.": "avec le mot de passe que vous avez fourni.", + "x-casaos.main must name an existing service.": "x-casaos.main doit désigner un service existant.", "xemu is a free and open-source application that emulates the original Microsoft Xbox game console, enabling people to play their original Xbox games on Windows, macOS, and Linux systems.": "xemu est une application gratuite et open-source qui émule la console de jeu Microsoft Xbox originale, permettant aux utilisateurs de jouer à leurs jeux Xbox originaux sur Windows, macOS et Linux.", "xfs — Proxmox dir storage (large files and VMs)": "xfs — Stockage du répertoire Proxmox (fichiers volumineux et machines virtuelles)", "xfs — better for large files": "xfs – meilleur pour les gros fichiers", @@ -8200,6 +8433,7 @@ "zfs-auto-snapshot removed (existing snapshots preserved on the pool)": "zfs-auto-snapshot supprimé (instantanés existants conservés sur le pool)", "zpool command not found. Install zfsutils-linux and retry.": "Commande zpool introuvable. Installez zfsutils-linux et réessayez.", "zpool not found. Install zfsutils-linux and retry.": "zpool introuvable. Installez zfsutils-linux et réessayez.", + "{application} runs in {count} containers.": "{application} s'exécute dans {count} conteneurs.", "{count} saved account.": "Compte enregistré {count}.", "{count} saved accounts.": "Comptes enregistrés {count}.", "{path} already exists and belongs to another user of the host, so {app} cannot write to it.\n\nProxMenux can add access rules (ACL) to this directory, to everything inside it and to what is created there later, for the users and groups {app} runs as on the host (IDs {ids}). The owner of the files does not change and whatever reads or writes them today keeps doing so; the owner of the directory also gets access to the files {app} creates.\n\nGrant {app} access to this directory?": "{path} existe déjà et appartient à un autre utilisateur de l'hôte, donc {app} ne peut pas y écrire.\n\nProxMenux peut ajouter des règles d'accès (ACL) à ce répertoire, à tout ce qu'il contient et à ce qui y sera créé ensuite, pour les utilisateurs et les groupes sous lesquels {app} s'exécute sur l'hôte (ID {ids}). Le propriétaire des fichiers ne change pas et ce qui les lit ou les écrit aujourd'hui continue de le faire ; le propriétaire du répertoire a également accès aux fichiers créés par {app}.\n\nAccorder à {app} l'accès à ce répertoire ?", diff --git a/lang/it.json b/lang/it.json index cba6dd5d..a17563f3 100644 --- a/lang/it.json +++ b/lang/it.json @@ -1,6 +1,9 @@ { "# Alternative if you prefer screen": "# Alternativa se preferisci screen", "# Recommended: avoids disconnection during upgrade": "# Consigliato: evita la disconnessione durante l'aggiornamento", + "%s of %s updates failed — see the messages above.": "%s aggiornamenti su %s non riusciti: vedi i messaggi sopra.", + "%s of %s updates failed.": "%s aggiornamenti su %s non riusciti.", + "'auto'/'local', or root@IP for development": "'auto'/'local' oppure root@IP per lo sviluppo", "(Checked entries will be removed. Uncheck to keep in VM.)": "(Le voci selezionate saranno rimosse. Deselezionale per mantenerle nella VM.)", "(Import is selected by default — required for disk image imports)": "(Importazione selezionata per default: necessaria per importare immagini disco)", "(Only the host directory is modified. Nothing inside the container is changed.": "(Viene modificata solo la directory host. Nulla cambia nel container.", @@ -163,6 +166,7 @@ "APT configured to skip additional languages": "APT configurato per saltare lingue aggiuntive", "APT configured to skip downloading additional languages": "APT configurato per saltare il download di lingue aggiuntive", "APT configured to use IPv4": "APT configurato per usare IPv4", + "APT hook syntax issue, removing...": "Problema di sintassi nell'hook APT, rimozione in corso...", "APT index update failed after switching to no-subscription. See log:": "L’aggiornamento dell’indice APT non è riuscito dopo il passaggio a no-subscription. Vedi registro:", "APT index update failed. See log:": "Aggiornamento dell'indice APT non riuscito. Vedi registro:", "APT indexes updated for Trixie": "Indici APT aggiornati per Trixie", @@ -210,6 +214,7 @@ "Activate ProxMenux Monitor": "Attiva ProxMenux Monitor", "Active": "Attivo", "Active Connections": "Connessioni attive", + "Active ZRAM algorithm, capacity or swap sources did not match the profile": "L'algoritmo ZRAM attivo, la capacità o le sorgenti di swap non corrispondono al profilo", "Active exports:": "Esportazioni attive:", "Active session:": "Sessione attiva:", "Actual device path on the host": "Percorso effettivo del dispositivo sull'host", @@ -263,6 +268,7 @@ "Add or remove extra paths and devices": "Aggiungi o rimuovi percorsi e dispositivi aggiuntivi", "Add physical disk to VM via": "Aggiungi disco fisico alla VM tramite", "Add share block in /etc/samba/smb.conf:": "Aggiungi il blocco di condivisione in /etc/samba/smb.conf:", + "Add the host firewall rule of this container; one option for each confirmed rule": "Aggiungi la regola del firewall dell'host di questo container; un'opzione per ogni regola confermata", "Add unprivileged flag to container configuration:": "Aggiungi il flag unprivileged alla configurazione del container:", "Add virtual disk": "Aggiungi disco virtuale", "Add: Mount Host Directory into LXC": "Aggiungi: monta la directory host in LXC", @@ -337,6 +343,7 @@ "Aliases added to .bashrc": "Alias aggiunti a .bashrc", "Alist Sync web interface": "Interfaccia web di Alist Sync", "All": "Storage del backup presenti sulla destinazione:", + "All %s update(s) completed successfully.": "Tutti gli aggiornamenti (%s) completati correttamente.", "All Available Scripts": "Tutti gli script disponibili", "All GPUs Already Assigned": "Tutte le GPU già assegnate", "All ProxMenux optimizations are up to date.": "Tutte le ottimizzazioni di ProxMenux sono aggiornate.", @@ -367,6 +374,9 @@ "All {count} containers of the application will be recreated from their saved image digests (main CT: {vmid}). The stack is stopped, every container is backed up and replaced, then checked. If the operation fails after a container was changed, the backups are restored. An operation that stops halfway is recovered from the OCI management menu.": "Tutti i {count} container dell'applicazione verranno ricreati dai digest salvati delle immagini (CT principale: {vmid}). Lo stack viene arrestato, ogni container viene sottoposto a backup, sostituito e poi controllato. Se l'operazione non riesce dopo la modifica di un container, i backup vengono ripristinati. Un'operazione interrotta a metà viene recuperata dal menu di gestione OCI.", "Allocate CPU Cores": "Assegna core CPU", "Allocate RAM in MiB": "Assegna RAM in MiB", + "Allocated Cores:": "Core assegnati:", + "Allocated RAM:": "RAM assegnata:", + "Allocating virtual disk for %s...": "Allocazione del disco virtuale per %s...", "Allow TCP port {port} from {subnet} through the host firewall? Existing firewall rules are not changed.": "Consentire il traffico TCP sulla porta {port} dalla sottorete {subnet} attraverso il firewall dell’host? Le regole esistenti non vengono modificate.", "Allowed hosts (comma separated; * allows access through the assigned IP)": "Host consentiti (separati da virgole; * consente l’accesso tramite l’IP assegnato)", "Allowed source subnet:": "Sottorete di origine consentita:", @@ -407,6 +417,7 @@ "Analyzing selected disks...": "Analisi dei dischi selezionati...", "Analyzing system for available PCIe storage devices...": "Analisi del sistema per i dispositivi di archiviazione PCIe disponibili...", "Another OCI operation is using the instance registry": "Un'altra operazione OCI sta usando il registro delle istanze", + "Another OCI operation is using the instance registry.": "Un'altra operazione OCI sta usando il registro delle istanze.", "Another OCI operation is using the instance registry. Wait for it to finish and open this menu again; no container is modified.": "Un'altra operazione OCI sta utilizzando il registro delle istanze. Attendere che termini e riaprire questo menu; nessun container è stato modificato.", "Another OCI operation is using the instance registry. Wait for it to finish.": "Un’altra operazione OCI sta utilizzando il registro delle istanze. Attendi che termini.", "Another OCI operation is using the registry. This operation was not started.": "Un’altra operazione OCI sta utilizzando il registro. Questa operazione non è stata avviata.", @@ -421,6 +432,7 @@ "Another registry account operation is running. Try again when it finishes.": "È in esecuzione un'altra operazione sull'account del registro. Riprovare al termine.", "Another stack operation is pending": "È in sospeso un'altra operazione sullo stack", "Application": "Applicazione", + "Application data": "Dati dell'applicazione", "Application registered on this host:": "Applicazione registrata su questo host:", "Application responding:": "L'applicazione risponde:", "Application responding; checking its stability...": "L'applicazione risponde; verifica della stabilità in corso...", @@ -566,6 +578,7 @@ "BIOS from": "BIOS del", "BIOS: OVMF (UEFI)": "BIOS: OVMF (UEFI)", "BOINC is a platform for high-throughput computing on a large scale (thousands or millions of computers). It can be used for volunteer computing (using consumer devices) or grid computing (using organizational resources). It supports virtualized, parallel, and GPU-based applications.": "BOINC è una piattaforma per il calcolo ad alta produttività su larga scala (migliaia o milioni di computer). Può essere usata per il calcolo volontario (su dispositivi di utenti privati) o per il grid computing (con risorse di organizzazioni). Supporta applicazioni virtualizzate, parallele e basate su GPU.", + "BRIDGE": "BRIDGE", "BRIDGE CONFIGURATION ANALYSIS": "ANALISI CONFIGURAZIONE BRIDGE", "BTRFS:": "BTRFS:", "Baby Buddy web interface": "Interfaccia web di Baby Buddy", @@ -628,6 +641,7 @@ "Bandwidth limit configured": "Limite banda configurato", "Bandwidth test (iperf3)": "Test banda (iperf3)", "Bandwidth test completed successfully": "Test banda completato con successo", + "Banner removal cancelled by user.": "Rimozione del banner annullata dall'utente.", "Base VM created with ID": "VM di base creata con ID", "Base VMID": "VMID iniziale", "Base VMID (empty = next free block)": "VMID iniziale (vuoto = prossimo blocco libero)", @@ -657,6 +671,7 @@ "Blocked GPU ID for VM Mode": "ID GPU bloccato per la modalità VM", "Blocked device(s)": "Dispositivi bloccati", "Blocked device(s):": "Dispositivi bloccati:", + "Blockers": "Elementi bloccanti", "BookStack web interface": "Interfaccia web BookStack", "Bookstack is a free and open source Wiki designed for creating beautiful documentation. Featuring a simple, but powerful WYSIWYG editor it allows for teams to create detailed and useful documentation with ease.": "Bookstack è un wiki gratuito e open source pensato per creare documentazione curata. Grazie a un editor WYSIWYG semplice ma potente, consente ai team di creare facilmente documentazione dettagliata e utile.", "Boot Disk": "Disco di avvio", @@ -691,6 +706,7 @@ "Build and install the gasket and apex kernel modules (DKMS)": "Compila e installa i moduli kernel gasket e apex (DKMS)", "Build dependencies installed.": "Dipendenze di compilazione installate.", "Build your personal knowledge base with TriliumNext Notes": "Crea la tua base di conoscenze personale con TriliumNext Notes", + "Bulk generation requires GITHUB_TOKEN to obtain an immutable revision per application": "La generazione in blocco richiede GITHUB_TOKEN per ottenere una revisione immutabile per ogni applicazione", "Business & ERP": "Business e ERP", "CHANGES APPLIED SUCCESSFULLY": "MODIFICHE APPLICATE CON SUCCESSO", "CIFS Client Tools: AVAILABLE": "Strumenti client CIFS: DISPONIBILI", @@ -709,6 +725,7 @@ "CLUSTER UPGRADE NOTES:": "NOTE AGGIORNAMENTO CLUSTER:", "CONFIGURED INTERFACES": "INTERFACCE CONFIGURATE", "CONFIRM FORMAT": "CONFERMA FORMATTAZIONE", + "CORE COUNT": "NUMERO DI CORE", "CPU": "CPU", "CPU Cores": "Core CPU", "CPU MODEL": "MODELLO CPU", @@ -720,7 +737,11 @@ "CRITICAL: The selected disk is referenced by a RUNNING VM or CT.": "CRITICO: una VM o un CT IN ESECUZIONE fa riferimento al disco selezionato.", "CT": "CT", "CT started successfully.": "CT avviato correttamente.", + "CT {vmid} ({name}) could not be kept running; it is left stopped": "Impossibile mantenere in esecuzione il CT {vmid} ({name}); resta arrestato", + "CT {vmid} ({name}) stopped on its own; starting it again (attempt {attempt})": "Il CT {vmid} ({name}) si è arrestato da solo; nuovo avvio (tentativo {attempt})", "CT {vmid} is a host monitor and had a rule in the host firewall. Allow TCP port {port} from {subnet} through the firewall of this host? Existing firewall rules are not changed.": "CT {vmid} è un monitor dell'host e aveva una regola nel firewall dell'host. Consentire la porta TCP {port} da {subnet} attraverso il firewall di questo host? Le regole del firewall esistenti non vengono modificate.", + "CT {vmid} is one of the {count} containers of {application}.": "Il CT {vmid} è uno dei {count} container di {application}.", + "CT {vmid}: DHCP client of {name} (IPv{version}) started again": "CT {vmid}: client DHCP di {name} (IPv{version}) riavviato", "CUDA requires a working NVIDIA driver": "CUDA richiede un driver NVIDIA funzionante", "CUDA requires the NVIDIA Container Toolkit on the host": "CUDA richiede NVIDIA Container Toolkit sull'host", "Calculate all kinds of statistics from your (local) Emby or Jellyfin server": "Calcola statistiche di ogni tipo dal tuo server Emby o Jellyfin (locale)", @@ -737,6 +758,7 @@ "Cannot continue": "Impossibile continuare", "Cannot create:": "Impossibile creare:", "Cannot detect filesystem on": "Impossibile rilevare il filesystem su", + "Cannot determine installed systemd-zram-generator version": "Impossibile determinare la versione installata di systemd-zram-generator", "Cannot find": "Impossibile trovare", "Cannot identify the vendor of the device:": "Impossibile identificare il produttore del dispositivo:", "Cannot inspect current swap configuration": "Impossibile controllare la configurazione di scambio corrente", @@ -871,8 +893,11 @@ "Checklist post-upgrade finished. Warnings:": "Checklist post-aggiornamento completata. Avvisi:", "Checklist pre-check finished. Warnings:": "Controllo preliminare completato. Avvertenze:", "Checks for LVM and storage issues": "Verifica problemi LVM e storage", + "Choose": "Scegli", + "Choose BIOS Type": "Scegli tipo BIOS", "Choose BIOS type": "Scegli tipo BIOS", "Choose No to abort and roll back to the legacy refuse behaviour.": "Scegli No per interrompere e ripristinare il comportamento di rifiuto precedente.", + "Choose Type": "Scegli tipo", "Choose ZimaOS image option:": "Scegli l'opzione immagine ZimaOS:", "Choose a Samba server:": "Scegli un server Samba:", "Choose a Windows ISO to use:": "Scegli una ISO Windows da usare:", @@ -972,10 +997,12 @@ "Cluster configuration (advanced)": "Configurazione cluster (avanzata)", "Cluster data will be applied automatically at next boot.": "I dati del cluster verranno applicati automaticamente al prossimo avvio.", "Cluster upgrade mode": "Modalità aggiornamento cluster", + "Code": "Codice", "Code-server is VS Code running on a remote server, accessible through the browser.": "Code-server è VS Code in esecuzione su un server remoto, accessibile tramite il browser.", "CodeProject.AI Server": "CodeProject.AI Server", "Command": "Comando", "Command failed": "Comando non riuscito", + "Command not found.": "Comando non trovato.", "Command override for an unknown service:": "Override del comando per un servizio sconosciuto:", "Commenting any residual Bookworm lines in *.list...": "Disattivazione tramite commento delle eventuali righe residue di Bookworm in *.list…", "Commenting legacy PVE 8 repository .list files (if any)...": "Commento dei file .list del repository PVE 8 legacy (se presenti)...", @@ -1017,8 +1044,11 @@ "Component:": "Componente:", "Components to uninstall (manual for now):": "Componenti da disinstallare (per ora manualmente):", "Compose capabilities validated in the LXC user namespace:": "Capability Compose convalidate nello spazio dei nomi utente dell’LXC:", + "Compose environment must be a list or a mapping.": "L'ambiente Compose deve essere un elenco o una mappatura.", "Compose file of the application": "File Compose dell’applicazione", "Compose file of this host": "il file Compose dell’host", + "Compose ports must be a list.": "Le porte Compose devono essere un elenco.", + "Compose volumes must be a list.": "I volumi Compose devono essere un elenco.", "Compressed size:": "Dimensioni compresse:", "Compressing": "Compressione", "Compression": "Compressione", @@ -1057,6 +1087,7 @@ "Configure Proxmox APT repositories": "Configura i repository APT Proxmox", "Configure Samba Client in LXC (only privileged)": "Configura il client Samba in LXC (solo privilegiato)", "Configure Samba Server in LXC (only privileged)": "Configura il server Samba in LXC (solo privilegiato)", + "Configure and install an application": "Configura e installa un'applicazione", "Configure as guest (no authentication)": "Configura come ospite (nessuna autenticazione)", "Configure backup destinations": "Configura destinazioni backup", "Configure backup destinations (PBS, Borg, local)": "Configura destinazioni backup (PBS, Borg, locale)", @@ -1065,7 +1096,12 @@ "Configure the remote in the Rclone Web UI first. Checking its name may start a stopped CT, even in a dry run. Applying the mount restarts the CT and attempts to publish two FUSE views on the host; a dry run does not publish them.": "Configura prima il remote nell’interfaccia web di Rclone. La verifica del nome può avviare un CT fermo anche in modalità di prova. L’applicazione del mount riavvia il CT e tenta di rendere disponibili due viste FUSE sull’host; in modalità di prova non vengono pubblicate.", "Configure with username and password": "Configura con nome utente e password", "Configured Ports": "Porte configurate", + "Configured VM description": "Descrizione della VM configurata", "Configured but doesn't exist": "Configurata ma non esiste", + "Configured controller/NVMe as hostpci%s: %s": "Controller/NVMe configurato come hostpci%s: %s", + "Configured import disk %s as %s": "Disco importato %s configurato come %s", + "Configured loader disk as ide0": "Disco del loader configurato come ide0", + "Configured virtual disk as %s, %sGB on %s": "Disco virtuale configurato come %s, %sGB su %s", "Configuring AMD GPU passthrough...": "Configurazione del passthrough GPU AMD...", "Configuring AMD softdep...": "Configurazione del softdep AMD...", "Configuring APT to skip downloading additional languages": "Configurazione di APT per saltare il download di lingue aggiuntive", @@ -1086,6 +1122,7 @@ "Configuring Proxmox APT repositories...": "Configurazione dei repository APT Proxmox...", "Configuring Proxmox filter...": "Configurazione del filtro Proxmox...", "Configuring Proxmox jail...": "Configurazione della jail Proxmox...", + "Configuring Serial Port:": "Configurazione della porta seriale:", "Configuring TCP optimizations...": "Configurazione delle ottimizzazioni TCP...", "Configuring TPM device": "Configurazione del dispositivo TPM", "Configuring Unpackerr...": "Configurazione di Unpackerr...", @@ -1161,6 +1198,7 @@ "Consider security implications for production environments": "Considerare le implicazioni sulla sicurezza per gli ambienti di produzione", "Consider visiting the repository and supporting the project.": "Valuta di visitare il repository e sostenere il progetto.", "Console log:": "Log della console:", + "Consume/export": "Consumo/esportazione", "Container": "Container", "Container — LXC root directories": "Container: directory root LXC", "Container ID": "ID container", @@ -1247,6 +1285,7 @@ "Controller + NVMe passthrough requires machine type q35. Skipping controller assignment.": "Il passthrough di controller + NVMe richiede il tipo di macchina q35. Assegnazione del controller saltata.", "Controller/NVMe Conflict Policy": "Policy conflitti controller/NVMe", "Controller/NVMe already present in VM config": "Controller/NVMe già presente nella configurazione VM", + "Controller/NVMe already present in VM config (%s)": "Controller/NVMe già presente nella configurazione della VM (%s)", "Controller/NVMe assigned": "Controller/NVMe assegnato", "Controller/NVMe is in use by running VM": "Controller/NVMe in uso da una VM in esecuzione", "Controller/NVMe passthrough requires IOMMU enabled in BIOS/UEFI and kernel.": "Il passthrough controller/NVMe richiede IOMMU abilitato nel BIOS/UEFI e nel kernel.", @@ -1313,6 +1352,7 @@ "Core packages": "Pacchetti principali", "Cores": "Core", "Corrupted gzip layer": "Layer gzip danneggiato", + "Could not activate dev-zram0.swap": "Impossibile attivare dev-zram0.swap", "Could not add": "Impossibile aggiungere", "Could not add disk": "Impossibile aggiungere il disco", "Could not add the confirmed host firewall rule": "Impossibile aggiungere la regola confermata al firewall dell’host", @@ -1329,12 +1369,14 @@ "Could not change VM virtual display to vga: std": "Impossibile modificare il display virtuale della VM in vga: std", "Could not check the NVIDIA GPU": "Impossibile verificare la GPU NVIDIA", "Could not clone any gasket-driver repository. Check your internet connection and": "Impossibile clonare alcun repository gasket-driver. Controlla la connessione Internet e", + "Could not complete or verify the repository switch; changes may be partial and repository state is unknown. Inspect {ui} before retrying; no automatic rollback was attempted.": "Impossibile completare o verificare il cambio di repository; le modifiche potrebbero essere parziali e lo stato dei repository è sconosciuto. Controlla {ui} prima di riprovare; non è stato tentato alcun rollback automatico.", "Could not complete private network release:": "Impossibile completare la rimozione della rete privata:", "Could not configure IOMMU kernel parameters automatically. Configure manually and reboot.": "Impossibile configurare automaticamente i parametri IOMMU del kernel. Configura manualmente e riavvia.", "Could not convert the OCI rootfs to privileged": "Impossibile convertire il rootfs OCI alla modalità privilegiata", "Could not copy the PVE keyfile into place. Check permissions on:": "Impossibile copiare il file di chiavi PVE nella sua posizione. Controlla i permessi su:", "Could not copy the keyfile into place.": "Impossibile copiare il file di chiavi nella posizione prevista.", "Could not copy the keyfile into place. Check permissions on:": "Impossibile copiare il file di chiavi nella posizione prevista. Controlla i permessi su:", + "Could not create ZRAM generator directory": "Impossibile creare la directory del generatore ZRAM", "Could not create a temporary directory for the NVIDIA Container Toolkit.": "Impossibile creare una directory temporanea per NVIDIA Container Toolkit.", "Could not create converter directory:": "Impossibile creare la directory del convertitore:", "Could not create destination directory:": "Impossibile creare la directory di destinazione:", @@ -1391,6 +1433,7 @@ "Could not push the key. Check the password and that": "Impossibile trasferire la chiave. Controlla la password e verifica che", "Could not query the image registry": "Impossibile interrogare il registro delle immagini", "Could not reach {registry}. Check its address, DNS and network access.": "Impossibile raggiungere {registry}. Controlla il suo indirizzo, DNS e accesso alla rete.", + "Could not reach {url} after 3 attempts: {reason}": "Impossibile raggiungere {url} dopo 3 tentativi: {reason}", "Could not read SMART data from": "Impossibile leggere i dati SMART da", "Could not read VM configuration.": "Impossibile leggere la configurazione della VM.", "Could not read the CUDA compute capability": "Impossibile leggere la compute capability CUDA", @@ -1423,6 +1466,7 @@ "Could not stage pending restore. Nothing new was scheduled.": "Impossibile preparare il ripristino in sospeso. Non è stato pianificato nulla di nuovo.", "Could not stop LXC": "Impossibile fermare LXC", "Could not stop ZRAM swap; profile configuration remains": "Impossibile interrompere lo scambio ZRAM; la configurazione del profilo rimane", + "Could not stop existing dev-zram0.swap": "Impossibile arrestare il dev-zram0.swap esistente", "Could not translate the Compose command/entrypoint": "Impossibile tradurre il comando o l'entrypoint di Compose", "Could not unload nouveau module (may be in use). The blacklist will take effect after reboot. Installation will continue but a reboot will be required.": "Impossibile rimuovere dalla memoria il modulo nouveau (potrebbe essere in uso). La lista nera avrà effetto dopo il riavvio. L'installazione continuerà ma sarà necessario un riavvio.", "Could not unmount": "Impossibile smontare", @@ -1431,6 +1475,8 @@ "Could not unmount — disk may be busy. Removing fstab entry anyway.": "Impossibile smontare: il disco potrebbe essere occupato. Rimozione comunque della voce fstab.", "Could not update config file.": "Impossibile aggiornare il file di configurazione.", "Could not verify removal of the managed host firewall rule.": "Impossibile verificare la rimozione della regola gestita del firewall host.", + "Could not write ZRAM generator configuration": "Impossibile scrivere la configurazione del generatore ZRAM", + "Could not write ZRAM package ownership state": "Impossibile scrivere lo stato di proprietà dei pacchetti ZRAM", "Could not write to:": "Impossibile scrivere in:", "Crafty Controller default login": "Accesso predefinito a Crafty Controller", "Create Directory": "Crea directory", @@ -1449,6 +1495,7 @@ "Create VM System Windows": "Crea VM con Windows", "Create VM System macOS (OSX-PROXMOX)": "Crea VM con macOS (OSX-PROXMOX)", "Create VM from template or script": "Crea VM da modello o script", + "Create a %s": "Crea %s", "Create a VM first (machine type q35 + UEFI BIOS), then run this option again.": "Crea prima una VM (tipo di macchina q35 + UEFI BIOS), poi ripeti questa opzione.", "Create a backup of the container configuration:": "Crea un backup della configurazione del container:", "Create a backup of your container before proceeding": "Crea un backup del tuo container prima di procedere", @@ -1473,6 +1520,7 @@ "Created persistent names for": "Creati nomi persistenti per", "Created remapped user": "Creato utente rimappato", "Created sharedfiles group (GID: 101000)": "Gruppo sharedfiles creato (GID: 101000)", + "Created with ProxMenuX": "Creato con ProxMenuX", "Creating APT configuration to force IPv4...": "Creazione della configurazione APT per forzare IPv4...", "Creating Ceph repository for PVE 8 (legacy format)...": "Creazione del repository Ceph per PVE 8 (formato legacy)...", "Creating Ceph repository for PVE 9 (deb822 format)...": "Creazione del repository Ceph per PVE 9 (formato deb822)...", @@ -1482,6 +1530,8 @@ "Creating UID remapping for unprivileged container compatibility...": "Creazione della rimappatura UID per la compatibilità con i container non privilegiati...", "Creating VM with the above configuration": "Creazione della VM con la configurazione sopra", "Creating VM...": "Creazione VM...", + "Creating a %s using the above advanced settings": "Creazione di %s con le impostazioni avanzate indicate sopra", + "Creating a %s using the above default settings": "Creazione di %s con le impostazioni predefinite indicate sopra", "Creating a backup in": "creazione di un backup in", "Creating a backup of": "Creazione di un backup di", "Creating a backup of the container...": "Creazione di un backup del container...", @@ -1490,6 +1540,7 @@ "Creating backup of network interfaces configuration...": "Creazione del backup della configurazione delle interfacce di rete...", "Creating compressed archive...": "Creazione archivio compresso...", "Creating export archive...": "Creazione dell’archivio di esportazione...", + "Creating images directory": "Creazione della directory delle immagini", "Creating local archive...": "Creazione dell'archivio locale...", "Creating mount point...": "Creazione del punto di montaggio...", "Creating partition table and partition...": "Creazione della tabella delle partizioni e della partizione...", @@ -1504,6 +1555,7 @@ "Creating the initial administrator...": "Creazione dell'amministratore iniziale...", "Creating the private network...": "Creazione rete privata...", "Creating the temporary data container": "Creazione del container temporaneo per i dati", + "Creating virtual disk (format=raw) for %s...": "Creazione del disco virtuale (format=raw) per %s...", "Creative & Design": "Creatività e design", "Credential helper": "Assistente credenziali", "Credential storage and access": "Archiviazione e accesso alle credenziali", @@ -1564,6 +1616,8 @@ "Custom Configuration": "Configurazione personalizzata", "Custom Content": "Contenuto personalizzato", "Custom Directory": "Directory personalizzata", + "Custom Image": "Immagine personalizzata", + "Custom Loader Image (from %s)": "Immagine del loader personalizzata (da %s)", "Custom Logo Instructions": "Istruzioni per il logo personalizzato", "Custom MOTD message is already configured": "Il messaggio MOTD personalizzato è già configurato", "Custom Options": "Opzioni personalizzate", @@ -1638,6 +1692,7 @@ "Dedicated container volume (included in backups)": "Volume dedicato del container (incluso nei backup)", "Dedicated container volumes (included in backups)": "Volumi dedicati del container (inclusi nei backup)", "DeepSeek Harness “Everything is a Plugin“.": "DeepSeek Harness «Everything is a Plugin».", + "Default": "Predefinito", "Default ACLs applied for group inheritance.": "ACL predefiniti applicati per l'ereditarietà del gruppo.", "Default Credentials": "Credenziali predefinite", "Default Gateway": "Gateway predefinito", @@ -1880,9 +1935,11 @@ "Do you want to update the existing export?": "Vuoi aggiornare l'esportazione esistente?", "Do you want to update the existing share?": "Vuoi aggiornare la condivisione esistente?", "Do you want to view the selected backup before restoring?": "Vuoi visualizzare il backup selezionato prima del ripristino?", + "Do-Over": "Ricomincia", "Docker Mods are only offered for compatible LinuxServer images": "I Docker Mods sono disponibili solo per le immagini LinuxServer compatibili", "Docker Volume Backup": "Docker Volume Backup", "Docker/CLI not available yet or no valid answer": "Docker/CLI non ancora disponibile oppure nessuna risposta valida", + "Docs": "Documentazione", "Documents & Notes": "Documenti e note", "Documents volume size in GB": "Dimensioni volume documenti in 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 è un software wiki open source versatile e facile da usare che non richiede un database. Gli utenti ne apprezzano la sintassi chiara e leggibile. La facilità di manutenzione, backup e integrazione lo rende particolarmente apprezzato dagli amministratori. I controlli di accesso e i connettori di autenticazione integrati lo rendono utile anche in ambito aziendale; i numerosi plugin della comunità ne ampliano gli impieghi oltre quelli di un wiki tradizionale.", @@ -1898,6 +1955,7 @@ "Download its Compose file from an address": "Scarica il file Compose da un indirizzo", "Download keyfile": "Scarica file di chiavi", "Download latest VirtIO ISO automatically": "Scarica automaticamente l'ultima ISO VirtIO", + "Downloaded %s to %s": "%s scaricato in %s", "Downloaded OCI images deleted:": "Immagini OCI scaricate eliminate:", "Downloaded amdgpu_top": "Scaricato amdgpu_top", "Downloading": "Download in corso", @@ -1943,8 +2001,12 @@ "Duration": "Durata", "Duration:": "Durata:", "Dynamic NVIDIA is only validated for unprivileged containers. This profile uses static mounts and must be recreated after the host driver changes.": "La modalità NVIDIA dinamica è convalidata solo per i container non privilegiati. Questo profilo usa mount statici e il container deve essere ricreato dopo la modifica del driver dell’host.", + "EFI Disk Storage": "Storage del disco EFI", + "EFI disk created (raw) and configured on %s": "Disco EFI creato (raw) e configurato su %s", "EFI disk created and configured on": "Disco EFI creato e configurato su", + "EFI disk created and configured on %s": "Disco EFI creato e configurato su %s", "EFI storage selection cancelled.": "Selezione storage EFI annullata.", + "EFI storage selection failed or was cancelled.": "Selezione dello storage EFI non riuscita o annullata.", "EFI storage selection failed or was cancelled. VM creation aborted.": "Selezione storage EFI non riuscita o annullata. Creazione VM interrotta.", "EMERGENCY PROXMOX SYSTEM REPAIR": "RIPARAZIONE D’EMERGENZA SISTEMA PROXMOX", "ENABLED for restore": "ABILITATO per il ripristino", @@ -1960,6 +2022,7 @@ "Edit raw CT configuration file": "Modifica direttamente il file di configurazione CT", "Edit raw VM configuration file": "Modifica direttamente il file di configurazione VM", "Edit the VM machine type to q35 and try again.": "Modifica il tipo di macchina VM su q35 e riprova.", + "Edition:": "Edizione:", "Email address for certificate expiry notices (required by ZeroSSL)": "Email per avvisi di scadenza del certificato (richiesta da ZeroSSL)", "Email address of the LibreDB Studio administrator": "Email dell’amministratore LibreDB Studio", "Email address of the NetBox admin account": "Email dell’account amministratore NetBox", @@ -1969,6 +2032,7 @@ "Emby organizes video, music, live TV, and photos from personal media libraries and streams them to smart TVs, streaming boxes and mobile devices. This container is packaged as a standalone emby Media Server.": "Emby organizza video, musica, TV in diretta e foto delle librerie multimediali personali e li trasmette a smart TV, dispositivi di streaming e dispositivi mobili. Questo container contiene Emby Media Server come applicazione autonoma.", "Emergency Proxmox System Repair": "Riparazione d’emergenza sistema Proxmox", "Emergency recovery:": "Recupero d'emergenza:", + "Emit numeric progress for the OCI menu": "Mostra l'avanzamento numerico per il menu OCI", "Empowering the smart home": "Per una casa più intelligente", "Empty": "Vuoto", "Empty exec service check": "Controllo del servizio di tipo exec vuoto", @@ -1991,6 +2055,7 @@ "Enable ZFS autotrim (SSD/NVMe pools)": "Abilita ZFS autotrim (pool SSD/NVMe)", "Enable ZRAM swap profile": "Abilita il profilo di scambio ZRAM", "Enable a mount on an existing Rclone OCI container": "Abilita un mount su un container OCI Rclone esistente", + "Enable a mount on an installed Rclone OCI": "Abilita un mount su un container OCI Rclone installato", "Enable an optical drive for MakeMKV": "Abilitare un'unità ottica per MakeMKV", "Enable auto-sync if /var/log exceeds 90% of its size?": "Abilitare la sincronizzazione automatica se /var/log supera il 90% delle sue dimensioni?", "Enable fast reboots": "Abilita riavvii rapidi", @@ -2118,6 +2183,7 @@ "Enter target disk (e.g. /dev/sdX):": "Inserisci il disco di destinazione (ad esempio /dev/sdX):", "Enter target storage name (e.g., local-lvm):": "Inserisci il nome dello storage di destinazione (ad esempio, local-lvm):", "Enter target storage:": "Inserisci lo storage di destinazione:", + "Enter temporary folder path (default: %s):": "Inserisci il percorso della cartella temporanea (predefinito: %s):", "Enter the BORG REPOKEY passphrase for target:": "Inserisci la passphrase BORG REPOKEY per la destinazione:", "Enter the Samba username:": "Inserisci il nome utente Samba:", "Enter the VMID for the new VM:": "Inserisci il VMID per la nuova VM:", @@ -2144,6 +2210,7 @@ "Enterprise repository present": "Repository enterprise presente", "Enterprise repository returned 401 Unauthorized (no valid subscription). Switch to the no-subscription repository and retry?": "Il repository enterprise ha restituito 401 Unauthorized (nessun abbonamento valido). Passare al repository no-subscription e riprovare?", "Enterprise repository unauthorized and fallback declined by user": "Accesso al repository enterprise non autorizzato e passaggio a no-subscription rifiutato dall’utente", + "Enterprise shares an APT stanza with other components. Split it in the Proxmox repository UI; no repository changed.": "Enterprise condivide una stanza APT con altri componenti. Separala nell'interfaccia dei repository di Proxmox; nessun repository è stato modificato.", "Entropy generation optimization removed": "Ottimizzazione della generazione di entropia rimossa", "Environment entry without an explicit value": "Voce d’ambiente senza valore esplicito", "Environment override for an unknown service:": "Override d’ambiente per un servizio sconosciuto:", @@ -2153,6 +2220,7 @@ "Error": "Errore", "Error applying patch. Backups preserved at": "Errore durante l'applicazione della patch. Backup conservati in", "Error details:": "Dettagli errore:", + "Error generating UUP download list.": "Errore durante la generazione dell'elenco di download UUP.", "Error installing": "Errore durante l'installazione di", "Error installing build dependencies. Check": "Errore durante l'installazione delle dipendenze di compilazione. Controlla", "Error:": "Errore:", @@ -2197,6 +2265,7 @@ "Execution engine for Index-TTS": "Motore di esecuzione per Index-TTS", "Existing Groups": "Gruppi esistenti", "Existing TLS certificate reused:": "Certificato TLS esistente riutilizzato:", + "Existing ZRAM profile is active but does not match its configuration": "Il profilo ZRAM esistente è attivo ma non corrisponde alla sua configurazione", "Existing file, re-downloading...": "File esistente, nuovo download in corso...", "Existing filesystem:": "File system esistente:", "Existing hostpci entries detected — they will be reused": "Rilevate voci hostpci esistenti: verranno riutilizzate", @@ -2206,6 +2275,7 @@ "Exit": "Uscita", "Exit and repair manually": "Esci e ripara manualmente", "Exit the container terminal:": "Esci dal terminale del container:", + "Exit-Script": "Esci dallo script", "Exit: Stop to create backup manually": "Esci: interrompi per creare manualmente il backup", "Exiting for manual repair...": "Uscita per riparazione manuale...", "Expected /tmp/gasket-driver/src not found. The clone seems incomplete or uses an unknown layout.": "Directory prevista /tmp/gasket-driver/src non trovata. Il clone sembra incompleto o utilizza un layout sconosciuto.", @@ -2282,7 +2352,11 @@ "Failed to add bind mount:": "Impossibile aggiungere il bind mount:", "Failed to add iSCSI storage to Proxmox.": "Impossibile aggiungere lo storage iSCSI a Proxmox.", "Failed to add storage to Proxmox.": "Impossibile aggiungere lo storage a Proxmox.", + "Failed to allocate virtual disk %s": "Impossibile allocare il disco virtuale %s", "Failed to assign Controller/NVMe": "Impossibile assegnare controller/NVMe", + "Failed to assign disk %s (%s) on %s": "Impossibile assegnare il disco %s (%s) su %s", + "Failed to assign loader disk": "Impossibile assegnare il disco del loader", + "Failed to assign loader disk to ide0": "Impossibile assegnare il disco del loader a ide0", "Failed to assign virtual disk": "Impossibile assegnare il disco virtuale", "Failed to clone Lynis from GitHub": "Impossibile clonare Lynis da GitHub", "Failed to clone log2ram repository. Check /tmp/log2ram_install.log": "Impossibile clonare il repository log2ram. Controlla /tmp/log2ram_install.log", @@ -2291,8 +2365,11 @@ "Failed to configure Proxmox Backup Server repositories": "Impossibile configurare i repository di Proxmox Backup Server", "Failed to configure Proxmox repositories": "Impossibile configurare i repository Proxmox", "Failed to configure TPM device in VM": "Impossibile configurare il dispositivo TPM nella VM", + "Failed to configure controller/NVMe: %s": "Impossibile configurare il controller/NVMe: %s", + "Failed to configure import disk %s as %s": "Impossibile configurare il disco importato %s come %s", "Failed to configure repositories.": "Impossibile configurare i repository.", "Failed to configure repositories. Installation aborted.": "Impossibile configurare i repository. Installazione interrotta.", + "Failed to configure virtual disk as %s": "Impossibile configurare il disco virtuale come %s", "Failed to connect to": "Impossibile connettersi a", "Failed to connect to server.": "Impossibile connettersi al server.", "Failed to copy sources into": "Impossibile copiare i sorgenti in", @@ -2366,7 +2443,9 @@ "Failed to install intel-gpu-tools": "Impossibile installare intel-gpu-tools", "Failed to install libedgetpu1-std. Check": "Impossibile installare libedgetpu1-std. Controlla", "Failed to install pigz": "Impossibile installare pigz", + "Failed to install unzip": "Impossibile installare unzip", "Failed to install zfs-auto-snapshot": "Impossibile installare zfs-auto-snapshot", + "Failed to install:": "Installazione non riuscita:", "Failed to migrate the existing ProxMenux Bash configuration.": "Impossibile migrare la configurazione Bash ProxMenux esistente.", "Failed to mount CIFS share on host.": "Impossibile montare la condivisione CIFS sull'host.", "Failed to mount NFS share on host.": "Impossibile montare la condivisione NFS sull'host.", @@ -2550,6 +2629,7 @@ "Full path": "Percorso completo", "Full report — complete SMART data (scrollable)": "Rapporto completo: dati SMART completi (scorribili)", "Full system upgrade, including dependencies": "Aggiornamento completo del sistema, comprese le dipendenze", + "Function '%s' is not defined in the %s flow.": "La funzione '%s' non è definita nel flusso %s.", "Function Level Reset (FLR) not available": "Reset a livello di funzione (FLR) non disponibile", "GID already in use:": "GID già in uso:", "GID in CT": "GID nel CT", @@ -2628,6 +2708,7 @@ "Generated Paperless administrator": "Amministratore Paperless generato", "Generated Tandoor administrator": "Amministratore Tandoor generato", "Generated administrator login": "Credenziali di accesso amministratore generate", + "Generated: {generated}; failed: {failed}; family: {provider}": "Generati: {generated}; non riusciti: {failed}; famiglia: {provider}", "Generating OVF descriptor...": "Generazione descrittore OVF...", "Generating dkms.conf...": "Generazione dkms.conf...", "Generating manifest...": "Generazione del file manifest...", @@ -2639,6 +2720,9 @@ "Get the container's storage information:": "Ottieni informazioni sullo storage del container:", "Get up and running with large language models locally": "Esegui modelli linguistici di grandi dimensioni in locale", "Git installed": "Git installato", + "GitHub returned HTTP 403 for {url}. Set GITHUB_TOKEN to raise the API rate limit.": "GitHub ha restituito HTTP 403 per {url}. Imposta GITHUB_TOKEN per aumentare il limite di richieste dell'API.", + "GitHub returned HTTP {status} for {url}.": "GitHub ha restituito HTTP {status} per {url}.", + "GitHub returned a truncated tree for the CasaOS catalogue": "GitHub ha restituito un albero troncato per il catalogo CasaOS", "GitQlient is a multi-platform Git client originally forked from QGit. Nowadays it goes beyond of just a fork and adds a lot of new functionality.": "GitQlient è un client Git multipiattaforma nato come fork di QGit. Nel tempo ha aggiunto molte nuove funzionalità, andando oltre il fork originale.", "Github Desktop is an open source Electron-based GitHub app. It is written in TypeScript and uses React.": "GitHub Desktop è un'app GitHub open source basata su Electron. È scritta in TypeScript e usa React.", "Global settings and SSH jail configured": "Impostazioni globali e jail SSH configurati", @@ -2691,6 +2775,7 @@ "HAOS One is a community image that runs Docker inside the container. The LXC stays unprivileged, but the inner AppArmor profiles may not be available. The first start downloads Home Assistant Core and its add-ons. If the check fails, the CT and /mnt/data are kept for diagnosis.": "HAOS One è un’immagine della comunità che esegue Docker nel container. LXC resta non privilegiato, ma i profili AppArmor interni potrebbero non essere disponibili. Il primo avvio scarica Home Assistant Core e i suoi componenti aggiuntivi. Se la verifica fallisce, CT e /mnt/data vengono conservati per la diagnosi.", "HAOS One profile declined": "Profilo HAOS One rifiutato", "HAOS One requires an unprivileged unmanaged LXC with nesting and keyctl, 2 cores, 2048 MB RAM, rootfs of at least 12 GB and /mnt/data of at least 16 GB on a container volume included in backups": "HAOS One richiede un container LXC non privilegiato e non gestito, con nesting e keyctl, 2 core, 2048 MB di RAM, rootfs di almeno 12 GB e /mnt/data di almeno 16 GB su un volume del container incluso nei backup", + "HOSTNAME": "NOME HOST", "HTML5 Network Speed Test Server.": "Server HTML5 per test velocità di rete.", "HTTP service check without a saved URL": "Controllo servizio HTTP senza URL salvato", "Habridge emulates Philips Hue API to other home automation gateways such as an Amazon Echo/Dot Gen 1 (gen 2 has issues discovering ha-bridge) or other systems that support Philips Hue. The Bridge handles basic commands such as On, Off and brightness commands of the hue protocol. This bridge can control most devices that have a distinct API.": "Habridge emula l'API Philips Hue per altri gateway domotici, come Amazon Echo/Dot di prima generazione (la seconda generazione ha problemi a rilevare ha-bridge), e per altri sistemi compatibili con Philips Hue. Gestisce i comandi di base del protocollo Hue, come accensione, spegnimento e luminosità, e può controllare la maggior parte dei dispositivi dotati di un'API dedicata.", @@ -2786,6 +2871,7 @@ "Host device node": "Nodo dispositivo host", "Host directories are not included in the backup and are not reverted by a recovery.": "Le directory dell'host non sono incluse nel backup e non vengono ripristinate durante il recupero.", "Host directories are not included in the backups and are not reverted by a recovery.": "Le directory dell'host non sono incluse nei backup e non vengono ripristinate durante il recupero.", + "Host directories are not reverted by the backup (confirmed beforehand)": "Le directory dell'host non vengono ripristinate dal backup (confermato in precedenza)", "Host directories cannot be included in vzdump": "Le directory dell’host non possono essere incluse in vzdump", "Host directories cannot be part of the vzdump backup": "Le directory dell'host non possono far parte del backup vzdump", "Host directories that are kept, with their content:": "Directory dell’host elencate, non incluse nella rimozione:", @@ -2809,6 +2895,7 @@ "Host fstab NFS mounts (not registered with pvesm):": "Montaggi NFS in fstab host (non registrati con pvesm):", "Host fstab NFS mounts:": "Montaggi NFS in fstab host:", "Host fstab mounts (not registered as Proxmox storage):": "Montaggi in fstab host (non registrati come storage Proxmox):", + "Host has an active subscription but no active {short} repository. Configure its Enterprise source in {ui}; no repository changed.": "L'host ha un abbonamento attivo ma nessun repository {short} attivo. Configura la relativa origine Enterprise in {ui}; nessun repository è stato modificato.", "Host identity (hostname, hosts)": "Identità host (hostname, hosts)", "Host kernel module loaded:": "Modulo kernel host caricato:", "Host monitor configured: shared PID and network namespaces, LXCFS disabled in this container": "Monitor dell'host configurato: spazi dei nomi PID e di rete condivisi, LXCFS disabilitato in questo container", @@ -2838,6 +2925,7 @@ "Htpcmanager is a front end for many htpc related applications.": "Htpcmanager è un'interfaccia per numerose applicazioni HTPC.", "I have read this": "Ho letto questo", "I/O priority configured": "Priorità I/O configurata", + "ID %s is already in use": "L'ID %s è già in uso", "ID already in use. Please choose another.": "ID già in uso. Scegline un altro.", "IGDB": "IGDB", "IGDB Client ID": "ID client IGDB", @@ -2891,6 +2979,7 @@ "ISO image — installation images": "Immagine ISO: immagini di installazione", "ISO image downloaded": "Immagine ISO scaricata", "ISO not found to mount on device": "ISO non trovato per il montaggio sul dispositivo", + "Icons resolved: {resolved}; cleared: {cleared}; unchanged: {unchanged}; with a theme variant: {themed}": "Icone risolte: {resolved}; rimosse: {cleared}; invariate: {unchanged}; con variante di tema: {themed}", "Identical:": "Identica:", "Identify candidate disk (never use system disk):": "Identifica il disco candidato (non usare mai il disco di sistema):", "Identify persistent disk paths": "Identifica i percorsi persistenti dei dischi", @@ -2898,6 +2987,7 @@ "If Code 43 error appears, KVM hiding is already configured.": "Se compare l'errore Codice 43, l'occultamento KVM è già configurato.", "If GUI does not load:": "Se la GUI non viene caricata:", "If ZFS errors occur:": "Se si verificano errori ZFS:", + "If a newer application image is available, the container is stopped and backed up, and the backup integrity is verified. The container is then updated using the new image.\n\nIf the update fails after the container was changed, ProxMenux attempts to restore the previous installation from the backup. If the operation remains incomplete, select the application in OCI management and choose \"Recover the previous installation\".\n\nHost directories mounted in the container are not restored by the container backup.": "Se è disponibile un'immagine più recente dell'applicazione, il container viene arrestato e sottoposto a backup, e l'integrità del backup viene verificata. Il container viene quindi aggiornato con la nuova immagine.\n\nSe l'aggiornamento non riesce dopo la modifica del container, ProxMenux tenta di ripristinare l'installazione precedente dal backup. Se l'operazione resta incompleta, seleziona l'applicazione nella gestione OCI e scegli \"Ripristina l’installazione precedente\".\n\nLe directory dell'host montate nel container non vengono ripristinate dal backup del container.", "If booting in EFI mode with root on LVM: install GRUB for EFI": "Se avvii in modalità EFI con root su LVM: installa GRUB per EFI", "If config issues occur:": "Se si verificano problemi di configurazione:", "If container won't start:": "Se il container non si avvia:", @@ -2955,6 +3045,7 @@ "Image selection was cancelled": "Selezione immagine annullata", "Image that is not in the catalog": "Immagine non presente nel catalogo", "Image:": "Immagine:", + "Images directory created: %s": "Directory delle immagini creata: %s", "Images to import:": "Immagini da importare:", "Immich CUDA requires NVIDIA driver 545 or later": "Immich CUDA richiede il driver NVIDIA 545 o successivo", "Immich GPU profile not validated": "Profilo GPU Immich non validato", @@ -2986,6 +3077,7 @@ "Imported:": "Importato:", "Importing": "Importazione", "Importing disk": "Importazione del disco", + "Importing loader disk:": "Importazione del disco del loader:", "Importing:": "Importazione:", "Improve log rotation and limit log size to save space and extend disk life": "Migliora la rotazione e limita le dimensioni dei registri per risparmiare spazio e prolungare la durata del disco", "In an LXC": "In un LXC", @@ -3040,6 +3132,7 @@ "Independent LXC applications installed": "Applicazioni LXC indipendenti installate", "Independent LXCs: no main container or hookscript. Each one keeps its own Start with Proxmox setting.": "Container LXC indipendenti: nessun container principale né hookscript. Ognuno mantiene la propria impostazione di avvio con Proxmox.", "Independent applications, without a main container.": "Applicazioni indipendenti, senza un container principale.", + "Index updated: {count} candidate applications": "Indice aggiornato: {count} applicazioni candidate", "Indexers and quality profiles still need to be configured.": "Gli indicizzatori e i profili di qualità devono ancora essere configurati.", "Inherited retention:": "Conservazione ereditata:", "Inherited schedule:": "Pianificazione ereditata:", @@ -3110,7 +3203,10 @@ "Install with: apt-get install open-iscsi": "Installa con: apt-get install open-iscsi", "Install/Update Coral TPU on Host": "Installa/Aggiorna Coral TPU sull'host", "Install/Update NVIDIA Drivers (Host + LXC)": "Installa/Aggiorna i driver NVIDIA (Host + LXC)", + "Install? [y/N]:": "Installare? [y/N]:", "Installation Complete": "Installazione completata", + "Installation blocked:": "Installazione bloccata:", + "Installation cancelled.": "Installazione annullata.", "Installation completed": "Installazione completata", "Installation completed.": "Installazione completata.", "Installation completed. Please reboot the server manually as soon as possible.": "Installazione completata. Riavvia manualmente il server il prima possibile.", @@ -3124,6 +3220,7 @@ "Installed": "Installato", "Installed at:": "Installazione:", "Installed components:": "Componenti installati:", + "Installed unzip successfully.": "unzip installato correttamente.", "Installed:": "Installato:", "Installer already downloaded and verified.": "Installer già scaricato e verificato.", "Installer copied to container.": "Installer copiato nel container.", @@ -3165,6 +3262,7 @@ "Installing and configuring Figurine...": "Installazione e configurazione Figurine...", "Installing and configuring ZFS auto-snapshot...": "Installazione e configurazione ZFS auto-snapshot...", "Installing build dependencies...": "Installazione dipendenze di compilazione...", + "Installing dependencies:": "Installazione delle dipendenze:", "Installing dependency:": "Installazione della dipendenza:", "Installing essential Proxmox packages...": "Installazione dei pacchetti Proxmox essenziali...", "Installing gawk (required for OVF parsing)...": "Installazione di gawk (richiesto per l'analisi OVF)...", @@ -3187,9 +3285,11 @@ "Installing the new image...": "Installazione della nuova immagine...", "Installing the new image:": "Installazione della nuova immagine:", "Installing the stack startup hook...": "Installazione dell'hook di avvio dello stack...", + "Installing unzip...": "Installazione di unzip...", "Installing zfs-auto-snapshot package...": "Installazione pacchetto zfs-auto-snapshot...", "Installs essential packages if missing": "Installa i pacchetti essenziali se mancanti", "Insufficient Disk Space": "Spazio su disco insufficiente", + "Insufficient disk space. Available:": "Spazio su disco insufficiente. Disponibile:", "Insufficient disk space. Skipping LXC": "Spazio su disco insufficiente. LXC saltato", "Insufficient memory. NVIDIA install aborted.": "Memoria insufficiente. Installazione NVIDIA interrotta.", "Insufficient memory. Skipping LXC": "Memoria insufficiente. LXC saltato", @@ -3225,12 +3325,15 @@ "Interfaces to Remove": "Interfacce da rimuovere", "Internal error: NVIDIA installer path is empty or file not found.": "Errore interno: percorso installer NVIDIA vuoto o file non trovato.", "Internal error: missing arguments in pmx_prepare_host_shared_dir": "Errore interno: argomenti mancanti in pmx_prepare_host_shared_dir", + "Internal installer operation; not legacy adoption": "Operazione interna del programma di installazione; non è un'adozione legacy", "Internal subnet of the tunnel (change it only if it clashes)": "Sottorete interna del tunnel (modificala solo in caso di conflitto)", "Interrupted operation": "Operazione interrotta", "Interrupted operation:": "Operazione interrotta:", "Interrupted stack operation found": "Rilevata un'operazione dello stack interrotta", "Invalid 'proxmox-ve' candidate (not 9.x or none). Please verify your repository configuration and network, then retry.": "Candidato 'proxmox-ve' non valido (versione diversa da 9.x o nessun candidato). Verifica la configurazione dei repository e la rete, quindi riprova.", "Invalid ALLOWED_HOSTS value": "Valore ALLOWED_HOSTS non valido", + "Invalid Compose port:": "Porta Compose non valida:", + "Invalid Compose volume path:": "Percorso del volume Compose non valido:", "Invalid Home Assistant OS check timeout": "Timeout controllo Home Assistant OS non valido", "Invalid ID": "ID non valido", "Invalid IPv4 address": "Indirizzo IPv4 non valido", @@ -3266,6 +3369,7 @@ "Invalid action": "Azione non valida", "Invalid administrator email": "Email amministratore non valida", "Invalid administrator user name": "Nome utente amministratore non valido", + "Invalid application identifier:": "Identificatore dell'applicazione non valido:", "Invalid base VMID": "VMID di base non valido", "Invalid bridge": "Bridge non valido", "Invalid check package:": "Pacchetto controllo non valido:", @@ -3397,7 +3501,9 @@ "JSON output for scripts": "Output JSON per script", "Jackett works as a proxy server: it translates queries from apps (Sonarr, SickRage, CouchPotato, Mylar, etc) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software. This allows for getting recent uploads (like RSS) and performing searches. Jackett is a single repository of maintained indexer scraping & translation logic - removing the burden from other apps.": "Jackett funge da server proxy: traduce le richieste delle app (Sonarr, SickRage, CouchPotato, Mylar ecc.) in richieste HTTP specifiche per i siti tracker, ne analizza le risposte HTML e restituisce i risultati alle app. Consente di ricevere i caricamenti recenti (come tramite RSS) ed effettuare ricerche. Jackett raccoglie in un unico progetto la logica, mantenuta, per interrogare e interpretare gli indicizzatori, sollevando le altre app da questo compito.", "Jellyfin WebUI": "Jellyfin WebUI", + "Jellyfin configuration already applied:": "Configurazione di Jellyfin già applicata:", "Jellyfin configuration applied:": "Configurazione Jellyfin applicata:", + "Jellyfin configuration updated:": "Configurazione di Jellyfin aggiornata:", "Jellyfin did not create encoding.xml before the timeout": "Jellyfin non ha creato encoding.xml entro il timeout", "Jellyfin has not created encoding.xml in any declared path": "Jellyfin non ha creato encoding.xml in nessuno dei percorsi dichiarati", "Jellyseerr is a free and open source software application for managing requests for your media library.": "Jellyseerr è un’applicazione gratuita e open source per gestire le richieste di contenuti della tua libreria multimediale.", @@ -3440,6 +3546,7 @@ "Keep current version (N)": "Mantieni la versione corrente (N)", "Keep current version (N) if modified": "Mantieni la versione corrente (N) se modificata", "Keep in source VM(s) + disable onboot + add to target VM": "Mantieni nelle VM di origine + disabilita onboot + aggiungi alla VM di destinazione", + "Keep the backup taken before the update in this Proxmox storage": "Conserva in questo storage Proxmox il backup eseguito prima dell'aggiornamento", "Keeping GPU in source VM config": "Mantenimento della GPU nella configurazione della VM di origine", "Keeping the settings changed in Proxmox:": "Mantenimento delle impostazioni modificate in Proxmox:", "Kept sharedfiles group (has regular users assigned).": "Mantenuto il gruppo sharedfiles (ha utenti regolari assegnati).", @@ -3506,6 +3613,7 @@ "Language Change": "Cambio lingua", "Language changed to": "Lingua cambiata in", "Language/locale (e.g. es_ES.UTF-8; translation of every application is not guaranteed)": "Lingua/locale (ad esempio es_ES.UTF-8; traduzione di tutte le applicazioni non garantita)", + "Language:": "Lingua:", "Last 50 kernel log lines": "Ultime 50 righe del registro kernel", "Last run:": "Ultima esecuzione:", "Last system boot time": "Ora ultimo avvio sistema", @@ -3525,6 +3633,7 @@ "Let's review your current network configuration.": "Rivediamo la tua attuale configurazione di rete.", "Liberate your videos and unleash infinite possibilities.": "Libera i tuoi video e dai spazio a possibilità infinite.", "Libraries: /data/media/movies, /data/media/series and /data/media/music. Select them in the media server.": "Librerie: /data/media/movies, /data/media/series e /data/media/music. Selezionale nel server multimediale.", + "Library": "Libreria", "Library size in GB": "Dimensione libreria in GB", "LibreDB Studio": "LibreDB Studio", "LibreOffice is a free and powerful office suite, and a successor to OpenOffice.org (commonly known as OpenOffice). Its clean interface and feature-rich tools help you unleash your creativity and enhance your productivity.": "LibreOffice è una suite per ufficio gratuita e potente, erede di OpenOffice.org (comunemente noto come OpenOffice). L'interfaccia chiara e gli strumenti ricchi di funzionalità aiutano a dare spazio alla creatività e ad aumentare la produttività.", @@ -3553,6 +3662,7 @@ "List all containers to identify the privileged one:": "Elenca tutti i container per identificare quello privilegiato:", "List all containers to identify the unprivileged one:": "Elenca tutti i container per identificare quello non privilegiato:", "List all virtual machines": "Elenca tutte le VM", + "List applications": "Elenca le applicazioni", "List backups in a specific storage": "Elenca i backup in uno storage specifico", "List block devices and partitions": "Elenca i dispositivi a blocchi e le partizioni", "List configured storages:": "Elenca gli storage configurati:", @@ -3568,6 +3678,13 @@ "Listening ports:": "Porte in ascolto:", "Listing relevant CT users and their mapped UID/GID on host...": "Elenco degli utenti CT rilevanti e dei relativi UID/GID mappati sull'host...", "Load and verify the WireGuard module on the Proxmox host": "Carica e verifica il modulo WireGuard sull'host Proxmox", + "Loader": "Loader", + "Loader configured as boot device.": "Loader configurato come dispositivo di avvio.", + "Loader import failed. No disk detected in config.": "Importazione del loader non riuscita. Nessun disco rilevato nella configurazione.", + "Loader import failed. No disk detected.": "Importazione del loader non riuscita. Nessun disco rilevato.", + "Loader imported successfully to %s": "Loader importato correttamente su %s", + "Loader storage selection failed or was cancelled.": "Selezione dello storage del loader non riuscita o annullata.", + "Loader:": "Loader:", "Loading modules...": "Caricamento moduli...", "Loading the Helper-Scripts catalog...": "Caricamento del catalogo Helper-Scripts...", "Loading the host kernel module:": "Caricamento modulo kernel host:", @@ -3631,16 +3748,20 @@ "Lyrion Music Server is a streaming audio server for Squeezebox audio players.": "Lyrion Music Server è un server audio in streaming per i lettori audio Squeezebox.", "M.2 / PCIe devices:": "Dispositivi M.2/PCIe:", "M3U proxy server": "Server proxy M3U", + "MAC ADDRESS": "INDIRIZZO MAC", "MAC Address": "Indirizzo MAC", "MAC address": "Indirizzo MAC", "MACHINE TYPE": "TIPO DI MACCHINA", "MAME is a free and open-source emulator designed to emulate the hardware of arcade games, video game consoles, old computers and other systems in software on modern personal computers.": "MAME è un emulatore gratuito e open source progettato per riprodurre via software su computer moderni l'hardware di giochi arcade, console, vecchi computer e altri sistemi.", "MOTD configuration updated successfully": "Configurazione MOTD aggiornata con successo", "MOTD configuration was already up to date": "Configurazione MOTD già aggiornata", + "MTU SIZE": "DIMENSIONE MTU", "Machine Type": "Tipo macchina", + "Machine i440fx": "Macchina i440fx", "Machine learning": "Apprendimento automatico", "Machine learning container prepared": "Container per machine learning preparato", "Machine learning profile not implemented; it is not replaced by CPU:": "Profilo di machine learning non implementato; non viene sostituito dalla CPU:", + "Machine q35": "Macchina q35", "Machine type: q35": "Tipo macchina: q35", "Machine: q35": "Macchina: q35", "Main endpoint not yet defined": "Endpoint principale non ancora definito", @@ -4086,6 +4207,7 @@ "No Changes Needed": "Nessuna modifica necessaria", "No Cleanup Needed": "Nessuna pulizia necessaria", "No Compose file was given": "Nessun file Compose fornito", + "No Compose files were found in the CasaOS catalogue": "Nessun file Compose trovato nel catalogo CasaOS", "No Controller/NVMe selected for now.": "Nessun controller/NVMe selezionato per ora.", "No Coral Detected": "Nessun Coral rilevato", "No Coral TPU device was found on this host (neither PCIe/M.2 nor USB).": "Nessun dispositivo Coral TPU trovato su questo host (né PCIe/M.2 né USB).", @@ -4179,6 +4301,7 @@ "No accessible Samba servers found.": "Nessun server Samba accessibile trovato.", "No accessible exports found.": "Nessuna esportazione accessibile trovata.", "No accessible shares found.": "Nessuna condivisione accessibile trovata.", + "No active Debian base repository for this suite; configure it in the Proxmox repository UI before continuing.": "Nessun repository base Debian attivo per questa suite; configuralo nell'interfaccia dei repository di Proxmox prima di continuare.", "No active Proxmox storage accepts OCI template archives.": "Nessuno spazio di archiviazione Proxmox attivo accetta archivi modello OCI.", "No active exports or showmount not available": "Nessuna esportazione attiva o showmount non disponibile", "No active session": "Nessuna sessione attiva", @@ -4208,12 +4331,14 @@ "No compatible GPUs were detected on this host.": "Nessuna GPU compatibile rilevata su questo host.", "No compatible PVE jobs": "Nessuna attività PVE compatibile", "No compatible disk images found in:": "Nessuna immagine disco compatibile trovata in:", + "No compatible images found in %s\n\nSupported formats: .img, .iso, .qcow2, .vmdk\n\nPlease add some images and try again.": "Nessuna immagine compatibile trovata in %s\n\nFormati supportati: .img, .iso, .qcow2, .vmdk\n\nAggiungi alcune immagini e riprova.", "No configuration issues found": "Nessun problema di configurazione trovato", "No container of the stack was modified.": "Nessun container dello stack modificato.", "No container runtime available.": "Nessun runtime per container disponibile.", "No container selected. Exiting.": "Nessun container selezionato. Uscita in corso.", "No controller/NVMe selected.": "Nessun controller/NVMe selezionato.", "No controllers remaining after conflict resolution.": "Nessun controller rimasto dopo la risoluzione del conflitto.", + "No custom image selected": "Nessuna immagine personalizzata selezionata", "No custom key (rely on default SSH config)": "Nessuna chiave personalizzata (usa la configurazione SSH predefinita)", "No custom logos were found in /usr/local/share/fastfetch/logos/.\n\nPlease add a logo and try again.": "Nessun logo personalizzato trovato in /usr/local/share/fastfetch/logos/.\n\nAggiungi un logo e riprova.", "No desktop UI backup found, will reinstall packages": "Nessun backup dell’interfaccia desktop trovato. I pacchetti verranno reinstallati", @@ -4226,6 +4351,7 @@ "No disks were added.": "Nessun disco è stato aggiunto.", "No disks were configured for processing.": "Nessun disco configurato per l'elaborazione.", "No disks were selected.": "Nessun disco selezionato.", + "No disks/controllers configured.": "Nessun disco/controller configurato.", "No docker run command was given": "Non è stato indicato alcun comando docker run", "No duplicate IP addresses": "Nessun indirizzo IP duplicato", "No duplicate repositories found": "Nessun repository duplicato trovato", @@ -4331,6 +4457,7 @@ "No supported NVIDIA versions found for this GPU": "Nessuna versione NVIDIA supportata trovata per questa GPU", "No sysfs ROM entry — trying ACPI VFCT table...": "Nessuna voce ROM in sysfs: provo la tabella ACPI VFCT...", "No target configured.": "Nessuna destinazione configurata.", + "No template is available for '{app_id}'": "Nessun modello disponibile per '{app_id}'", "No test currently running": "Nessun test attualmente in corso", "No unambiguous loader download found in release metadata.": "Nessun download univoco del loader trovato nei metadati della versione.", "No uninstaller found for:": "Nessun programma di disinstallazione trovato per:", @@ -4472,6 +4599,7 @@ "Only one service at a time can be installed this way.": "In questo modo si può installare un solo servizio alla volta.", "Only removes storage definition, not remote data.": "Rimuove solo la definizione di archiviazione, non i dati remoti.", "Only run this if you used LVM (step 6b):": "Eseguilo solo se hai utilizzato LVM (passaggio 6b):", + "Only the applications that need no question: the ones the cluster keeps a record of": "Solo le applicazioni che non richiedono domande: quelle di cui il cluster conserva un registro", "Only the host backup hook is removed — PVE vzdump jobs targeting this storage stay intact.": "Viene rimosso solo l’hook di backup dell’host: le attività vzdump PVE che utilizzano questo storage rimangono intatte.", "Only the image reference, with no Compose file": "Solo il riferimento dell’immagine, senza file Compose", "Only the update of the image runs unattended.": "Solo l’aggiornamento dell’immagine viene eseguito senza intervento.", @@ -4485,6 +4613,7 @@ "Open the VM console and wait for the loader to boot": "Apri la console della VM e attendi l'avvio del caricatore", "Open the dashboard from this host on port 8008 to create a new admin account.": "Apri la dashboard da questo host sulla porta 8008 per creare un nuovo account amministratore.", "Open the dashboard to create a new admin account:": "Apri la dashboard per creare un nuovo account amministratore:", + "Open the page of an application in the menu": "Apri la pagina di un'applicazione nel menu", "Open-source AI-powered coding assistant": "Assistente open source per la programmazione basato sull'IA", "Open-source UI for building and debugging multi-agent and RAG applications": "Interfaccia open source per creare ed eseguire il debug di applicazioni multiagente e RAG", "Open-source self-hosted SQL IDE.": "IDE SQL open source ospitabile sul proprio server.", @@ -4803,6 +4932,7 @@ "Press ENTER to continue...": "Premi INVIO per continuare...", "Press ENTER to return to the menu...": "Premi INVIO per tornare al menu...", "Press ENTER to return...": "Premi INVIO per tornare...", + "Press Enter to close this terminal...": "Premi Invio per chiudere questo terminale...", "Press Enter to close...": "Premi Invio per chiudere...", "Press Enter to continue": "Premi Invio per continuare", "Press Enter to continue...": "Premi Invio per continuare...", @@ -4884,6 +5014,7 @@ "ProxMenux Monitor protection": "Protezione ProxMenux Monitor", "ProxMenux Monitor unit repaired and restarted": "Unità ProxMenux Monitor riparata e riavviata", "ProxMenux Monitor → Backups tab (live progress card with estimated time, logs, rollback delta)": "ProxMenux Monitor → scheda Backup (scheda di avanzamento in tempo reale con tempo stimato, registri, delta di rollback)", + "ProxMenux OCI manager Apps (Technology Preview)": "ProxMenux OCI manager Apps (Technology Preview)", "ProxMenux attaches directories, not single files, so this image cannot be installed yet.": "ProxMenux allega directory, non file singoli, quindi questa immagine non può essere ancora installata.", "ProxMenux can apply open permissions on this NFS directory from the host so the container can read and write:": "ProxMenux può applicare permessi aperti su questa directory NFS dall'host in modo che il container possa leggere e scrivere:", "ProxMenux can remount it with open permissions so any LXC can read and write.": "ProxMenux può rimontarlo con permessi aperti in modo che qualsiasi LXC possa leggere e scrivere.", @@ -4903,9 +5034,13 @@ "Proxmology logo applied": "Logo Proxmology applicato", "Proxmox 9 system update allready": "Il sistema è già aggiornato a Proxmox 9", "Proxmox APT repositories configured": "Repository APT Proxmox configurati", + "Proxmox APT repository inventory is invalid or reports parse errors. Fix sources in {ui}; no repository changed.": "L'inventario dei repository APT di Proxmox non è valido o segnala errori di analisi. Correggi le origini in {ui}; nessun repository è stato modificato.", "Proxmox Backup Server": "Proxmox Backup Server", "Proxmox Backup Server (PBS) destinations": "Destinazioni Proxmox Backup Server (PBS)", "Proxmox Backup Server APT repositories configured": "Repository APT di Proxmox Backup Server configurati", + "Proxmox Backup Server Microcode": "Proxmox Backup Server Microcode", + "Proxmox Backup Server Post Install": "Post-installazione di Proxmox Backup Server", + "Proxmox Backup Server Subscription Banner Removal": "Rimozione del banner di abbonamento di Proxmox Backup Server", "Proxmox Backup Server Update": "Aggiornamento di Proxmox Backup Server", "Proxmox Backup Server update completed.": "Aggiornamento di Proxmox Backup Server completato.", "Proxmox CIFS Storage Status:": "Stato storage CIFS Proxmox:", @@ -4927,6 +5062,7 @@ "Proxmox iSCSI Storage Status:": "Stato storage iSCSI Proxmox:", "Proxmox jail configured": "Jail Proxmox configurato", "Proxmox local storages:": "Archivi locali Proxmox:", + "Proxmox no-subscription standard repository handle unavailable; no repository changed.": "Handle del repository standard no-subscription di Proxmox non disponibile; nessun repository è stato modificato.", "Proxmox repository": "Repository Proxmox", "Proxmox repository OK (candidate is 9.x)": "Repository Proxmox OK (il candidato è 9.x)", "Proxmox repository configuration completed": "Configurazione repository Proxmox completata", @@ -4994,6 +5130,7 @@ "Rclone mount needs a privileged LXC with FUSE access. The container is dedicated to Rclone and its web UI must not be exposed to untrusted networks.": "Rclone mount richiede un container LXC privilegiato con accesso FUSE. Il container è dedicato a Rclone e la sua interfaccia web non deve essere esposta a reti non attendibili.", "Rclone mount requires a privileged LXC with FUSE access. Use this profile only on a trusted node and network.": "Il mount Rclone richiede un LXC privilegiato con accesso FUSE. Usa questo profilo solo su un nodo e una rete attendibili.", "Rclone mount requires a privileged container": "Il mount Rclone richiede un container privilegiato", + "Rclone remote": "Remote Rclone", "Re-enter the BORG REPOKEY passphrase to confirm:": "Reinserisci la passphrase BORG REPOKEY per confermare:", "Re-running pre-check after repairs...": "Nuova esecuzione del controllo preliminare dopo la riparazione...", "Reachable": "Raggiungibile", @@ -5017,6 +5154,7 @@ "Reading SMART self-test log...": "Lettura del registro dell'autotest SMART...", "Reading full SMART report...": "Lettura del rapporto SMART completo...", "Reading image metadata. Please wait...": "Lettura dei metadati dell'immagine. Attendere prego...", + "Ready to create a %s?": "Pronto per creare %s?", "Real-time Performance Monitoring": "Monitoraggio prestazioni in tempo reale", "Real-time bandwidth usage (press q to exit)": "Utilizzo banda in tempo reale (premi q per uscire)", "Real-time collaborative document editor": "Editor collaborativo di documenti in tempo reale", @@ -5099,15 +5237,19 @@ "Recreation prepared": "Ricreazione preparata", "Refresh APT index and verify repositories:": "Aggiorna l'indice APT e verifica i repository:", "Refresh the configured APT repositories and review the PBS package upgrade? Repository files will be preserved.": "Aggiornare gli indici dei repository APT configurati ed esaminare l'aggiornamento dei pacchetti PBS? I file dei repository verranno conservati.", + "Refresh the index from the image sources": "Aggiorna l'indice dalle sorgenti delle immagini", "Refresh token of the connector, from the Twingate admin console": "Token di refresh del connettore, dalla console di amministrazione Twingate", "Refresh your browser (Ctrl+Shift+R) to see changes": "Aggiorna il browser (Ctrl+Shift+R) per vedere le modifiche", "Refresh your browser to see changes (server restart may be required)": "Aggiorna il browser per vedere le modifiche (potrebbe essere necessario il riavvio del server)", "Refreshing apt cache...": "Aggiornamento cache apt...", "Refreshing the NVIDIA runtime...": "Aggiornamento del runtime NVIDIA...", "Refusing an unexpected rootfs path:": "Rifiutato un percorso rootfs inatteso:", + "Regenerate the catalog templates": "Rigenera i modelli del catalogo", + "Regenerate the template of one application": "Rigenera il modello di un'applicazione", "Regenerating PVE package cache...": "Rigenerazione cache pacchetti PVE...", "Regenerating boot artifacts for the merged kernel-agnostic changes...": "Rigenerazione degli artefatti di avvio per le modifiche unite indipendenti dal kernel...", "Regenerating certificates and restarting services...": "Rigenerazione certificati e riavvio servizi...", + "Register again the OCI applications restored from a backup": "Registra di nuovo le applicazioni OCI ripristinate da un backup", "Register mount path in Proxmox:": "Registra il percorso di montaggio in Proxmox:", "Registering disk as Proxmox storage...": "Registrazione disco come storage Proxmox...", "Registering module with DKMS...": "Registrazione del modulo con DKMS...", @@ -5294,6 +5436,7 @@ "Resetting time synchronization...": "Reimpostazione della sincronizzazione dell'ora...", "Residual Bookworm entries commented where applicable": "Voci residue di Bookworm disattivate tramite commento dove applicabile", "Resilio-sync (formerly BitTorrent Sync) uses the BitTorrent protocol to sync files and folders between all of your devices. There are both free and paid versions, this container supports both. There is an official sync image but we created this one as it supports user mapping to simplify permissions for volumes.": "Resilio Sync (in precedenza BitTorrent Sync) usa il protocollo BitTorrent per sincronizzare file e cartelle tra tutti i tuoi dispositivi. Esistono versioni gratuite e a pagamento, entrambe supportate da questo container. Pur esistendo un'immagine ufficiale, questa versione supporta la mappatura degli utenti per semplificare i permessi dei volumi.", + "Resolve catalog icons against the jsdelivr icon sets": "Risolvi le icone del catalogo con i set di icone di jsdelivr", "Resolve package conflicts": "Risolvi i conflitti tra pacchetti", "Resources": "Risorse", "Restart Network": "Riavvia la rete", @@ -5352,6 +5495,7 @@ "Results:": "Risultati:", "Retention": "Conservazione", "Retention policy (prune-backups syntax).": "Politica di conservazione (sintassi prune-backups).", + "Retrieving the URL for the %s loader": "Recupero dell'URL per il loader %s", "RetroArch is a frontend for emulators, game engines and media players. It enables you to run classic games on a wide range of computers and consoles through its slick graphical interface.": "RetroArch è un frontend per emulatori, motori di gioco e lettori multimediali. Permette di eseguire giochi classici su una vasta gamma di computer e console tramite un'interfaccia grafica intuitiva.", "Return": "Torna", "Return to Main Menu": "Torna al menu principale", @@ -5431,6 +5575,9 @@ "SCSI (recommended for Linux)": "SCSI (consigliato per Linux)", "SECURITY CONSIDERATIONS:": "CONSIDERAZIONI SULLA SICUREZZA:", "SECURITY WARNING:": "AVVISO DI SICUREZZA:", + "SELECT CUSTOM IMAGE": "SELEZIONA IMMAGINE PERSONALIZZATA", + "SELECT LOADER": "SELEZIONA LOADER", + "SETTINGS": "IMPOSTAZIONI", "SMART Action": "Azione SMART", "SMART Disk Health & Test": "Integrità e test disco SMART", "SMART health status: PASSED": "Stato di salute SMART: SUPERATO", @@ -5456,6 +5603,7 @@ "SSH protection (aggressive mode)": "Protezione SSH (modalità aggressiva)", "STEP 6: Choose commands based on your storage type": "PASSO 6: Scegli i comandi in base al tipo di storage", "STEP 9: Cleanup (LVM only)": "PASSO 9: Pulizia (solo LVM)", + "STORAGE PLAN": "PIANO DI STORAGE", "STORAGE TYPE IDENTIFICATION:": "IDENTIFICAZIONE TIPO STORAGE:", "SUGGESTION FOR": "CONSIGLIO PER", "SWAG serves HTTPS on port 443. Plain HTTP on port 80 is disabled in /config/nginx/site-confs/default.conf.": "SWAG offre HTTPS sulla porta 443. HTTP non cifrato sulla porta 80 è disabilitato in /config/nginx/site-confs/default.conf.", @@ -5536,6 +5684,7 @@ "Scheduled backup job created": "Attività di backup pianificata creata", "Scheduled backup jobs": "Attività di backup pianificate", "Scheduled backups and retention policies": "Backup pianificati e policy di conservazione", + "Scheduled run: no questions; stops where a person has to decide": "Esecuzione pianificata: nessuna domanda; si ferma dove deve decidere una persona", "Scheduled tasks (cron)": "Attività pianificate (cron)", "Scheduler script not found:": "Script dello scheduler non trovato:", "ScreenScraper": "ScreenScraper", @@ -5545,6 +5694,7 @@ "Script not found:": "Script non trovato:", "Scripts in": "Script in", "ScummVM is a program which allows you to run certain classic graphical adventure and role-playing games, provided you already have their data files. The clever part about this: ScummVM just replaces the executables shipped with the games, allowing you to play them on systems for which they were never designed! ScummVM is a complete rewrite of these games' executables and is not an emulator.": "ScummVM consente di eseguire alcuni classici giochi di avventura grafica e di ruolo, purché tu ne abbia già i file di dati. Sostituisce gli eseguibili originali dei giochi, così puoi usarli su sistemi per i quali non erano stati progettati. Gli eseguibili vengono riscritti completamente: ScummVM non è un emulatore.", + "SeaBIOS (Legacy)": "SeaBIOS (Legacy)", "Sealskin is a self-hosted, client-server platform that enables users to run powerful, containerized desktop applications streamed directly to a web browser. It uses a browser extension to intercept user actions—such as clicking a link or downloading a file and redirects them to a secure, isolated application environment running on a remote server.": "Sealskin è una piattaforma client-server self-hosted che consente di eseguire applicazioni desktop containerizzate e trasmetterle direttamente a un browser web. Usa un'estensione del browser per intercettare le azioni degli utenti, come cliccare su un link o scaricare un file, e reindirizzarle verso un ambiente applicativo sicuro e isolato su un server remoto.", "Search": "Cerca", "Search Results for:": "Risultati ricerca per:", @@ -5730,6 +5880,7 @@ "Selected GPU(s)": "GPU selezionate", "Selected GPU(s):": "GPU selezionate:", "Selected LXC action": "Azione LXC selezionata", + "Selected Loader:": "Loader selezionato:", "Selected VM": "VM selezionata", "Selected VM action": "Azione VM selezionata", "Selected bridge:": "Bridge selezionato:", @@ -5895,6 +6046,7 @@ "Show standard exclude patterns": "Mostra modelli di esclusione standard", "Show status of all storage pools": "Mostra lo stato di tutti gli storage pool", "Show the QR code of a peer again with: pct exec -- /app/show-peer 1": "Mostra di nuovo il codice QR di un peer con: pct exec -- /app/show-peer 1", + "Show the summary of a template": "Mostra il riepilogo di un modello", "Show traffic statistics per interface": "Mostra statistiche traffico per interfaccia", "Show vzdump backup configuration": "Mostra configurazione backup vzdump", "Shows status and type (nfs/cifs/dir/iscsi...).": "Mostra lo stato e il tipo (nfs/cifs/dir/iscsi...).", @@ -6001,6 +6153,7 @@ "Start VM": "Avvia VM", "Start VM after creation": "Avvia VM dopo la creazione", "Start VM after creation?": "Avviare la VM dopo la creazione?", + "Start VM when completed:": "Avvia la VM al termine:", "Start a container. Use the correct ": "Avvia un container. Usa il corretto", "Start a virtual machine. Use the correct ": "Avvia una VM. Usa il corretto", "Start each LXC with Proxmox (no coordinated startup)": "Avvia ogni LXC con Proxmox (senza avvio coordinato)", @@ -6030,6 +6183,7 @@ "Starting": "Avvio", "Starting Borg backup...": "Avvio del backup Borg...", "Starting CT": "Avvio del CT", + "Starting ISO conversion...": "Avvio della conversione ISO...", "Starting LXC Privileged to Unprivileged conversion process...": "Avvio conversione LXC da privilegiato a non privilegiato...", "Starting LXC Unprivileged to Privileged conversion process...": "Avvio conversione LXC da non privilegiato a privilegiato...", "Starting NVIDIA installer. This may take several minutes...": "Avvio del programma di installazione NVIDIA. L'operazione potrebbe richiedere diversi minuti...", @@ -6137,6 +6291,7 @@ "Subscription banner removal failed": "Rimozione del banner di abbonamento non riuscita", "Subscription banner removed successfully": "Banner di abbonamento rimosso", "Subscription banner restored successfully (desktop and mobile)": "Banner di abbonamento ripristinato (desktop e mobile)", + "Subscription status is not unambiguously active, notfound or expired. Check proxmox-backup-manager subscription get locally; no repository changed.": "Lo stato dell'abbonamento non è chiaramente active, notfound o expired. Controlla localmente proxmox-backup-manager subscription get; nessun repository è stato modificato.", "Success": "Successo", "Successful": "Riuscito", "Supervisor does not confirm healthy and supported yet": "Il Supervisor non conferma ancora che il sistema sia integro e supportato", @@ -6164,6 +6319,7 @@ "Synchronize time automatically": "Sincronizza l’ora automaticamente", "Synclounge is a third party tool that allows you to watch Plex in sync with your friends/family, wherever you are.": "Synclounge è uno strumento di terze parti che permette di guardare i contenuti Plex in sincronia con amici e familiari, ovunque ci si trovi.", "Syncthing replaces proprietary sync and cloud services with something open, trustworthy and decentralized. Your data is your data alone and you deserve to choose where it is stored, if it is shared with some third party and how it's transmitted over the Internet.": "Syncthing sostituisce i servizi proprietari di sincronizzazione e cloud con una soluzione aperta, affidabile e decentralizzata. I tuoi dati appartengono solo a te: puoi scegliere dove archiviarli, se condividerli con terzi e come trasmetterli su Internet.", + "Synology VM Creator": "Creazione VM Synology", "Sysctl not namespaced or not valid:": "Sysctl non isolato in un namespace o non valido:", "System": "Sistema", "System CLI Tools": "Strumenti CLI di sistema", @@ -6185,6 +6341,7 @@ "System path mounts are not yet supported": "I mount di percorsi di sistema non sono ancora supportati", "System reboot required": "Riavvio del sistema necessario", "System upgrade completed": "Aggiornamento sistema completato", + "System upgrade failed. Check log:": "Aggiornamento del sistema non riuscito. Controlla il log:", "System uptime": "Tempo di attività sistema", "Systemd ulimits set": "ulimits di systemd impostati", "TCP BBR configuration created successfully": "Configurazione TCP BBR creata", @@ -6249,10 +6406,13 @@ "The Bookmark Everything App": "L'app per salvare tutto nei segnalibri", "The Brave browser is a fast, private and secure web browser for PC, Mac and mobile.": "Brave è un browser web veloce, privato e sicuro per PC, Mac e dispositivi mobili.", "The CT already exists:": "Il CT esiste già:", + "The Compose document must be a mapping.": "Il documento Compose deve essere una mappatura.", "The Compose file declares no service": "Il file Compose non dichiara alcun servizio", "The Compose file describes several images:": "Il file Compose descrive diverse immagini:", "The Compose file describes several services:": "Il file Compose descrive più servizi:", "The Compose file does not contain a Compose document": "Il file Compose non contiene un documento Compose", + "The Compose file has no services.": "Il file Compose non ha servizi.", + "The Compose file has no x-casaos metadata.": "Il file Compose non ha metadati x-casaos.", "The Compose file is not valid YAML:": "Il file Compose non è un documento YAML valido:", "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.": "Compose consente di allentare le restrizioni AppArmor o seccomp; l’opzione resta disattivata salvo selezione dell’utente. Continuare solo se si ritiene affidabile l’immagine e si accetta il rischio.", "The Compose value must be text or a list:": "Il valore Compose deve essere testo o un elenco:", @@ -6302,9 +6462,11 @@ "The PostgreSQL volume needs at least 4 GB": "Il volume PostgreSQL richiede almeno 4 GB", "The PostgreSQL volume needs at least 8 GB": "Il volume PostgreSQL richiede almeno 8 GB", "The ProxMenux Monitor update checker is not available. Start or update ProxMenux Monitor and try again.": "Il controllo degli aggiornamenti di ProxMenux Monitor non è disponibile. Avvia o aggiorna ProxMenux Monitor e riprova.", + "The ProxMenux application catalogue is not a list": "Il catalogo delle applicazioni ProxMenux non è un elenco", "The Proxmox VE 8 update did not finish. The upgrade to Proxmox VE 9 was not started.": "L’aggiornamento di Proxmox VE 8 non è stato completato. L’aggiornamento a Proxmox VE 9 non è stato avviato.", "The Proxmox archive keyring is missing; Ceph installation cannot continue safely": "Manca il portachiavi dell’archivio Proxmox; l’installazione di Ceph non può continuare in sicurezza", "The Proxmox inventory and the local configurations differ": "L'inventario Proxmox e le configurazioni locali differiscono", + "The README has no recognisable docker-compose section": "Il README non ha una sezione docker-compose riconoscibile", "The ROCm image has no support for the AMD GPU of this host:": "L’immagine ROCm non supporta la GPU AMD di questo host:", "The ROCm image of this application has no support for the AMD GPU of this host:": "L’immagine ROCm di questa applicazione non supporta la GPU AMD di questo host:", "The Rclone configuration needs at least 1 GB": "La configurazione di Rclone richiede almeno 1 GB", @@ -6341,6 +6503,8 @@ "The administrator email is not valid": "L’email dell’amministratore non è valida", "The administrator user contains characters that are not allowed": "L’utente amministratore contiene caratteri non consentiti", "The all-in-one AI application.": "L'applicazione AI all-in-one.", + "The application '{app_id}' does not come from LinuxServer": "L'applicazione '{app_id}' non proviene da LinuxServer", + "The application '{app_id}' is not in the index": "L'applicazione '{app_id}' non è nell'indice", "The application configuration needs a first start to complete.": "La configurazione dell’applicazione richiede un primo avvio per completarsi.", "The application could not be modified:": "Impossibile modificare l'applicazione:", "The application could not be recovered:": "Impossibile recuperare l’applicazione:", @@ -6370,6 +6534,7 @@ "The backup was taken on a different PVE or kernel major.minor. These paths will be SKIPPED to keep the boot safe:": "Il backup è stato eseguito con una versione major.minor diversa di PVE o del kernel. Questi percorsi verranno SALTATI per garantire un avvio sicuro:", "The bind mount target escapes the rootfs:": "La destinazione del bind mount esce dalla rootfs:", "The block device does not exist:": "Il dispositivo di blocco non esiste:", + "The block found does not look like a Docker Compose file": "Il blocco trovato non sembra un file Docker Compose", "The build could not be checked beforehand; continuing without that check.": "Non è stato possibile verificare la build in anticipo; si prosegue senza tale verifica.", "The cached image does not match the current digest": "L'immagine nella cache non corrisponde al digest corrente", "The cached image is damaged; it will be downloaded again.": "L'immagine nella cache è danneggiata; verrà scaricata nuovamente.", @@ -6454,6 +6619,8 @@ "The disk size cannot be reproduced": "Impossibile riprodurre le dimensioni del disco", "The disk usage of the container could not be read": "Impossibile leggere l'utilizzo del disco del container", "The disks of the failed attempt could not be removed and stay in the temporary container:": "Rimozione dei dischi del tentativo fallito non riuscita; restano nel container temporaneo:", + "The docker-compose block is not closed": "Il blocco docker-compose non è chiuso", + "The docker-compose section contains no code block": "La sezione docker-compose non contiene alcun blocco di codice", "The domain must resolve to the public address of this network before the certificate can be issued.": "Il dominio deve risolversi nell'indirizzo pubblico di questa rete prima che il certificato possa essere emesso.", "The download client still needs to be configured.": "Il client di download deve ancora essere configurato.", "The download stopped progressing; cancelling this attempt.": "Il download non avanza più; annullamento del tentativo.", @@ -6487,6 +6654,7 @@ "The fstab entry will still be removed; reboot or manual umount needed.": "La voce fstab verrà comunque rimossa; è necessario riavviare o eseguire manualmente umount.", "The gateway must be another usable address in the same subnet.": "Il gateway deve essere un altro indirizzo utilizzabile nella stessa sottorete.", "The gateway should appear in your Tailscale admin console shortly.": "Il gateway dovrebbe apparire a breve nella console di amministrazione Tailscale.", + "The generated template does not match the schema:": "Il modello generato non corrisponde allo schema:", "The guest access test did not succeed.": "Il test di accesso guest non è riuscito.", "The healthcheck cannot run without an IP address": "Il controllo dello stato richiede un indirizzo IP", "The host NVIDIA driver is not responding correctly": "Il driver NVIDIA dell'host non risponde correttamente", @@ -6564,6 +6732,8 @@ "The long test runs directly on the disk hardware.": "Il test lungo si esegue direttamente sull’hardware del disco.", "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.": "Il container di machine learning viene ricreato con l'immagine della nuova scelta. La cache dei modelli, la libreria e il database sono conservati. L'intera applicazione viene arrestata e aggiornata, come per un aggiornamento. Se l'operazione fallisce dopo la modifica di un container, vengono ripristinati i container e la scelta precedenti. Un'operazione interrotta a metà viene recuperata dal menu Gestione 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.": "Il contenitore di machine learning viene ricostruito con l'immagine della nuova scelta. La cache del modello, la libreria e il database vengono conservati. L'intera applicazione viene arrestata e aggiornata, come in un aggiornamento; se qualcosa fallisce, vengono ripristinati i contenitori precedenti e la scelta precedente.", + "The main Compose service cannot be identified unambiguously": "Impossibile identificare in modo univoco il servizio Compose principale", + "The main Compose service has no image.": "Il servizio Compose principale non ha un'immagine.", "The main container of this application is not on this host. Restore it too.": "Il container principale di questa applicazione non è su questo host. Ripristina anche quello.", "The main member must stop first and start last": "Il componente principale deve fermarsi per primo e avviarsi per ultimo", "The main member of the stack is missing": "Manca il membro principale dello stack", @@ -6877,6 +7047,7 @@ "This guarantees that device nodes are available before applying LXC GPU config.": "Garantisce la disponibilità dei nodi dispositivo prima di applicare la configurazione GPU LXC.", "This host architecture is not supported by the OCI image importer.": "Questa architettura host non è supportata dall'importatore di immagini OCI.", "This host has no active subscription, switch to the no-subscription repository? The inaccessible Enterprise PVE source will be disabled. Enterprise Ceph sources, if present, will be disabled without choosing a replacement Ceph channel; configure Ceph separately if needed.": "Questo host non ha un abbonamento attivo, passare al repository senza abbonamento? L'origine PVE Enterprise, non accessibile, verrà disabilitata. Le origini Ceph Enterprise, se presenti, verranno disabilitate senza scegliere un canale Ceph sostitutivo; configurare Ceph separatamente se necessario.", + "This host runs {name} on {suite}, but these {name} repositories are for another suite: {details}. Disable or remove them in {ui} and run the update again; no repository changed.": "Questo host esegue {name} su {suite}, ma questi repository {name} sono per un'altra suite: {details}. Disabilitali o rimuovili in {ui} ed esegui di nuovo l'aggiornamento; nessun repository è stato modificato.", "This image cannot be installed as it is described:": "L’immagine non può essere installata secondo la descrizione fornita:", "This image has no compatible Linux image for this host ({architecture}).": "Questa immagine non ha un'immagine Linux compatibile per questo host ({architecture}).", "This image requires the host module": "Questa immagine richiede il modulo dell’host", @@ -6947,6 +7118,7 @@ "This will add the mount to /etc/fstab so it persists after reboot.": "Aggiunge il montaggio a /etc/fstab per renderlo persistente dopo il riavvio.", "This will completely remove Fail2Ban and its configuration. Continue?": "Ciò rimuoverà completamente Fail2Ban e la sua configurazione. Continuare?", "This will completely remove Lynis from the system. Continue?": "Ciò rimuoverà completamente Lynis dal sistema. Continuare?", + "This will create a New %s. Proceed?": "Verrà creata una nuova %s. Procedere?", "This will create a new VM": "Questo creerà una nuova VM", "This will deploy a Tailscale VPN gateway for secure remote access.": "Verrà distribuito un gateway VPN Tailscale per l'accesso remoto sicuro.", "This will install and configure Fail2Ban with:": "Questo installerà e configurerà Fail2Ban con:", @@ -7053,6 +7225,8 @@ "Umbrel OS installer script by Helper Scripts\n\nVisit the GitHub repo to learn more, contribute, or support the project:\n\nhttps://community-scripts.github.io/ProxmoxVE/scripts?id=umbrel-os-vm": "Script di installazione del sistema operativo Umbrel di Helper Scripts\n\nVisita il repository GitHub per saperne di più, contribuire o supportare il progetto:\n\nhttps://community-scripts.github.io/ProxmoxVE/scripts?id=umbrel-os-vm", "Unable to detect Proxmox version": "Impossibile rilevare la versione di Proxmox", "Unable to detect Proxmox version.": "Impossibile rilevare la versione di Proxmox.", + "Unable to detect a valid storage location for EFI disk.": "Impossibile rilevare una posizione di storage valida per il disco EFI.", + "Unable to detect a valid storage location.": "Impossibile rilevare una posizione di storage valida.", "Unable to determine the installed memory.": "Impossibile determinare la memoria installata.", "Unable to identify the root filesystem. Aborting.": "Impossibile identificare il filesystem root. Interruzione.", "Unable to resolve system ZFS pool disks. Aborting.": "Impossibile individuare i dischi del pool ZFS di sistema. Interruzione.", @@ -7156,6 +7330,7 @@ "Unsupported OCI digest:": "Digest OCI non supportato:", "Unsupported OCI-LXC AppArmor profile:": "Profilo OCI-LXC AppArmor non supportato:", "Unsupported OCI-LXC seccomp profile:": "Profilo seccomp OCI-LXC non supportato:", + "Unsupported Proxmox suite; no repository changed.": "Suite Proxmox non supportata; nessun repository è stato modificato.", "Unsupported Terminal": "Terminale non supportato", "Unsupported architecture for Figurine:": "Architettura non supportata da Figurine:", "Unsupported architecture:": "Architettura non supportata:", @@ -7167,6 +7342,7 @@ "Unsupported device type:": "Tipo dispositivo non supportato:", "Unsupported dynamic NVIDIA capabilities:": "Capability NVIDIA dinamiche non supportate:", "Unsupported format. Only .ova and .ovf files are supported.": "Formato non supportato. Solo file .ova e .ovf.", + "Unsupported host architecture:": "Architettura dell'host non supportata:", "Unsupported kept setting:": "Impostazione mantenuta non supportata:", "Unsupported media storage mode:": "Modalità storage multimediale non supportata:", "Unsupported mount options": "Opzioni mount non supportate", @@ -7214,6 +7390,8 @@ "Update completed. Press Enter to continue...": "Aggiornamento completato. Premere Invio per continuare...", "Update credentials": "Aggiorna le credenziali", "Update every container of the application": "Aggiorna tutti i container dell’applicazione", + "Update for %s completed.": "Aggiornamento di %s completato.", + "Update for %s exited with status %s.": "Aggiornamento di %s terminato con stato %s.", "Update kernel to compatible version": "Aggiorna il kernel alla versione compatibile", "Update now?": "Aggiornare ora?", "Update package index:": "Aggiornare l’indice pacchetti:", @@ -7222,6 +7400,7 @@ "Update system to latest PVE 8.4+ (if not done already):": "Aggiornare il sistema all’ultima versione PVE 8.4+ (se non già fatto):", "Update the image with the saved configuration": "Aggiorna l’immagine mantenendo la configurazione salvata", "Update the whole stack?": "Aggiornare l’intero stack?", + "Update, modify or recreate one installed OCI instance": "Aggiorna, modifica o ricrea un'istanza OCI installata", "Updated": "Aggiornato", "Updated sharedfiles group to GID: 101000": "Gruppo sharedfiles aggiornato a GID: 101000", "Updated stack checked": "Stack aggiornato verificato", @@ -7233,6 +7412,7 @@ "Updates available": "Aggiornamenti disponibili", "Updates file is empty or unreadable.": "Il file degli aggiornamenti è vuoto o illeggibile.", "Updating": "Aggiornamento", + "Updating %s (running %s from %s flow)...": "Aggiornamento di %s (esecuzione di %s dal flusso %s)...", "Updating APT package lists...": "Aggiornamento elenchi pacchetti APT...", "Updating Debian Bookworm → Trixie in sources.list...": "Aggiornamento di Debian Bookworm → Trixie nel file sources.list...", "Updating Figurine binary...": "Aggiornamento binario Figurine...", @@ -7333,7 +7513,20 @@ "Username on the Borg server that runs \"borg serve\" (typically \"borg\"). This is NOT the admin/root user of the server — that one is asked later only if you choose \"Generate a new key and authorize it\".": "Nome utente sul server Borg che esegue \"borg serve\" (in genere \"borg\"). NON è l’utente amministratore/root del server, richiesto solo scegliendo \"Genera una nuova chiave e autorizzala\".", "Username:": "Nome utente:", "Users:": "Utenti:", + "Using Advanced Settings": "Uso delle impostazioni avanzate", + "Using BIOS Type:": "Uso tipo BIOS:", + "Using Bridge:": "Uso bridge:", + "Using CPU Model:": "Uso modello CPU:", + "Using Custom Image:": "Uso immagine personalizzata:", + "Using Default Settings": "Uso delle impostazioni predefinite", + "Using Hostname:": "Uso nome host:", + "Using Interface MTU Size:": "Uso dimensione MTU dell'interfaccia:", + "Using MAC Address:": "Uso indirizzo MAC:", + "Using Machine Type:": "Uso tipo di macchina:", "Using UUID is recommended over /dev/sdX.": "Si consiglia UUID anziché /dev/sdX.", + "Using VLAN:": "Uso VLAN:", + "Using Virtual Machine ID:": "Uso ID macchina virtuale:", + "Using Vlan:": "Uso VLAN:", "Using advanced configuration": "Uso configurazione avanzata", "Using default Proxmox logo...": "Uso logo Proxmox predefinito...", "Using existing encryption key:": "Uso chiave di crittografia esistente:", @@ -7357,6 +7550,8 @@ "VFIO orphans cleared and initramfs rebuilt — next boot will free the GPU.": "Le voci VFIO orfane sono state cancellate e initramfs ricostruito: il prossimo avvio libererà la GPU.", "VFIO orphans cleared but initramfs rebuild failed; check /var/log/proxmenux logs.": "Voci VFIO orfane cancellate, ma ricostruzione initramfs non riuscita; verificare i log /var/log/proxmenux.", "VFS cache mode": "Modalità cache VFS", + "VIRTUAL DISK": "DISCO VIRTUALE", + "VIRTUAL MACHINE ID": "ID MACCHINA VIRTUALE", "VLAN": "VLAN", "VLC Media Player is a free and open source cross-platform multimedia player and framework that delivers dependable performance across multiple devices.": "VLC Media Player è un lettore e framework multimediale gratuito, open source e multipiattaforma che offre prestazioni affidabili su diversi dispositivi.", "VM": "VM", @@ -7368,6 +7563,7 @@ "VM Storage (images, backup)": "Storage VM (images, backup)", "VM and CT Management Commands": "Comandi di gestione VM e CT", "VM and CT backup jobs (Datacenter > Backup)": "Job di backup di VM e CT (Datacenter > Backup)", + "VM created with errors. Check configuration.": "VM creata con errori. Controlla la configurazione.", "VM creation cancelled before disk planning.": "Creazione VM annullata prima della pianificazione del disco.", "VM creation cancelled by user.": "Creazione VM annullata dall’utente.", "VM creation completed": "Creazione VM completata", @@ -7461,6 +7657,7 @@ "Virtual Function": "Funzione virtuale", "Virtual Function (parent PF:": "Funzione virtuale (PF di origine:", "Virtual Machine ID": "ID VM", + "Virtual Machine ID:": "ID macchina virtuale:", "Virtual disk": "Disco virtuale", "Virtual disks": "Dischi virtuali", "Virtual display already set to": "Display virtuale già impostato su", @@ -7477,6 +7674,7 @@ "Volume configuration cancelled": "Configurazione volume annullata", "Volume options are not yet supported": "Le opzioni dei volumi non sono ancora supportate", "Volume size in GB": "Dimensione volume in GB", + "Volumes": "Volumi", "Volumes attached": "Volumi collegati", "Volumes prepared for the first start:": "Volumi preparati per il primo avvio:", "Volumes shared between services are not yet supported": "I volumi condivisi tra servizi non sono ancora supportati", @@ -7677,6 +7875,7 @@ "ZRAM profile removed, but package purge failed": "Profilo ZRAM rimosso, ma l'eliminazione del pacchetto non è riuscita", "ZRAM still holds pages; configuration was preserved": "ZRAM contiene ancora pagine; la configurazione è stata preservata", "ZRAM still holds pages; profile remains active": "ZRAM contiene ancora pagine; il profilo rimane attivo", + "ZRAM swap profile": "Profilo di scambio ZRAM", "ZRAM swap profile enabled": "Profilo di scambio ZRAM abilitato", "ZRAM swap profile removed": "Profilo di scambio ZRAM rimosso", "ZSTD - fast, good ratio (recommended)": "ZSTD - veloce, buona compressione (consigliato)", @@ -7743,6 +7942,7 @@ "chmod 1777 + setfacl o::rwx (applied on the NFS share from this host)": "chmod 1777 + setfacl o::rwx (applicato alla condivisione NFS da questo host)", "chmod failed — NFS server may be restricting changes from root": "chmod non riuscito: il server NFS potrebbe limitare le modifiche da root", "chown/chmod failed — likely unprivileged CT against host bind mount. Falling back to ACL.": "chown/chmod non riuscito: probabilmente un CT non privilegiato tenta di modificare un bind mount dell’host. Si ricorre alle ACL.", + "clone source mount tree": "clonazione dell'albero di mount di origine", "containers": "container", "containers of": "container di", "content:": "contenuto:", @@ -7782,6 +7982,7 @@ "driver:": "driver:", "e.g.": "ad es.", "empty = generate": "vuoto = genera automaticamente", + "enter container namespace": "ingresso nel namespace del container", "exFAT (portable: Windows/Linux/macOS)": "exFAT (portatile: Windows/Linux/macOS)", "exFAT tools installed successfully.": "Strumenti exFAT installati.", "experimental on this GPU": "sperimentale su questa GPU", @@ -7814,10 +8015,12 @@ "fstab entry exists": "esiste la voce fstab", "fstab line:": "riga fstab:", "fstab references UUIDs/devices not present on this host:": "fstab fa riferimento a UUID/dispositivi non presenti su questo host:", + "function '%s' is not defined in the %s flow.": "la funzione '%s' non è definita nel flusso %s.", "gasket DKMS entries removed.": "Voci DKMS di gasket rimosse.", "gasket-dkms has been fully removed from this system.": "gasket-dkms è stato completamente rimosso dal sistema.", "gasket-dkms is still reported by dpkg in state:": "gasket-dkms è ancora riportato da dpkg nello stato:", "gawk installed": "gawk installato", + "genisoimage/mkisofs not found.": "genisoimage/mkisofs non trovato.", "go2rtc WebUI": "go2rtc WebUI", "google/gasket-driver cloned (fallback — will apply local patches).": "google/gasket-driver clonato (fallback: applicherà le patch locali).", "gpg not found; trying apt-key fallback": "gpg non trovato; tentativo con apt-key come alternativa", @@ -7861,6 +8064,7 @@ "individual template is blocked": "Il template individuale è bloccato", "initramfs updated": "initramfs aggiornato", "initramfs updated.": "initramfs aggiornato.", + "installable": "installabile", "installed": "installato", "installed but command not immediately available": "installato ma comando non immediatamente disponibile", "installed correctly and available": "installato correttamente e disponibile", @@ -7877,6 +8081,7 @@ "intel_iommu/amd_iommu is set in cmdline but no IOMMU groups exist — IOMMU appears disabled in BIOS. Enable VT-d / AMD-Vi in firmware before continuing.": "intel_iommu/amd_iommu è impostato in cmdline ma mancano i gruppi IOMMU — IOMMU sembra disabilitato nel BIOS. Abilitare VT-d / AMD-Vi nel firmware prima di continuare.", "interfaces": "interfacce", "into an LXC.": "in un LXC.", + "invalid source '%s' (must be 'auto', 'custom', or 'detected')": "sorgente '%s' non valida (deve essere 'auto', 'custom' o 'detected')", "iperf3 - Bandwidth test": "iperf3 - Test larghezza di banda", "iperf3 - Bandwidth test (Client mode)": "iperf3 - Test larghezza di banda (modalità client)", "iperf3 - Bandwidth test (Server mode)": "iperf3 - Test larghezza di banda (modalità server)", @@ -7903,9 +8108,12 @@ "is one of the": "è uno dei", "is referenced in the following stopped VM(s)/CT(s):": "è citato nelle configurazioni delle seguenti VM/CT arrestati:", "it asks for the network of the host; the container gets its own address instead": "richiede la rete dell’host, ma il container riceve un proprio indirizzo", + "it asks for two different memory limits": "richiede due limiti di memoria diversi", "it could not be started:": "impossibile avviarlo:", + "it describes more than one image": "descrive più di un'immagine", "it is locked or its disk could not be mounted": "è bloccato o non è stato possibile montarne il disco", "it publishes no other architecture": "non sono pubblicate altre architetture", + "it uses Compose configs, which have no equivalent here": "usa configs di Compose, che qui non hanno equivalente", "it uses an NVIDIA GPU and this host has no working NVIDIA driver and Container Toolkit. Install them and run the recovery again.": "usa una GPU NVIDIA, ma su questo host manca un driver NVIDIA funzionante o il Container Toolkit. Installali e ripeti il recupero.", "it uses the Compose option": "usa l’opzione Compose", "its NVIDIA runtime could not be rebuilt for the driver of this host; the container will not start until it is installed again:": "impossibile ricostruire il suo runtime NVIDIA per il driver di questo host; il container non si avvierà finché non verrà installato di nuovo:", @@ -7913,10 +8121,13 @@ "its Rclone mount is published by a host script that a backup does not include. Enable the mount again from the Rclone entry of the catalog before starting it.": "il suo mount Rclone è pubblicato da uno script host non incluso nel backup. Riabilita il mount dalla voce Rclone del catalogo prima di avviarlo.", "its backup was made before ProxMenux kept the record inside the container": "il suo backup risale a prima che ProxMenux salvasse il record nel container", "its configuration could not be read": "impossibile leggere la sua configurazione", + "its health check is not written in a way that can be read": "il suo controllo di integrità non è scritto in un formato leggibile", "its hookscript does not exist on this host:": "il suo hookscript non esiste su questo host:", "its host firewall rule was not added:": "la sua regola nel firewall host non è stata aggiunta:", "its include exists with other content:": "il suo include esiste con contenuto diverso:", "its record is missing and it was not found among the restored containers": "manca il suo record e non è stato trovato tra i container ripristinati", + "its shared memory size is not written in a way that can be read": "la dimensione della memoria condivisa non è scritta in un formato leggibile", + "its stop timeout is not written in a way that can be read": "il timeout di arresto non è scritto in un formato leggibile", "journald MaxLevelStore is adequate for auth logging": "MaxLevelStore di journald è adeguato per la registrazione dei messaggi di autenticazione", "journald drop-in created: /etc/systemd/journald.conf.d/proxmenux-loglevel.conf": "drop-in journald creato: /etc/systemd/journald.conf.d/proxmenux-loglevel.conf", "journald log level restored": "livello di registro journald ripristinato", @@ -7932,6 +8143,7 @@ "keep-weekly (0 disables)": "keep-weekly (0 disabilita)", "keep-yearly (0 disables)": "keep-yearly (0 disabilita)", "keeping current settings": "mantenendo le impostazioni attuali", + "kernel": "kernel", "kexec configured successfully. Use the command: reboot-quick": "kexec configurato. Usare il comando: reboot-quick", "kexec-pve service enabled": "Servizio kexec-pve abilitato", "kexec-pve service file created": "File di servizio kexec-pve creato", @@ -7944,12 +8156,15 @@ "layers": "layer", "legacy .link file(s) to the ProxMenux-managed format": "file .link legacy nel formato gestito da ProxMenux", "log2ram completely removed from system": "log2ram completamente rimosso dal sistema", + "main container of the application": "container principale dell'applicazione", + "make cloned mount tree read-only": "impostazione in sola lettura dell'albero di mount clonato", "manually inside the container before starting it.": "manualmente all'interno del contenitore prima di avviarlo.", "manually inside the container.": "manualmente all'interno del container.", "maximum performance": "massime prestazioni", "may be closed — trying discovery anyway...": "potrebbe essere chiusa — tentativo di rilevamento comunque in corso...", "melonDS aims at providing fast and accurate Nintendo DS emulation.": "melonDS mira a offrire un’emulazione di Nintendo DS veloce e accurata.", "members:": "membri:", + "memory": "memoria", "minimum": "minimo", "missing": "mancanti", "mkfs.btrfs not found. Install btrfs-progs and retry.": "mkfs.btrfs non trovato. Installare btrfs-progs e riprovare.", @@ -7964,6 +8179,7 @@ "needs a relaxed AppArmor or seccomp profile": "richiede un profilo AppArmor o seccomp meno restrittivo", "needs stack review": "richiede una verifica per lo stack", "needs these external services, already running:": "necessita di questi servizi esterni, già in esecuzione:", + "network": "rete", "never": "mai", "next free": "il prossimo libero", "next free block": "prossimo blocco libero", @@ -7974,11 +8190,14 @@ "no declarative value": "nessun valore dichiarato", "no passphrase": "nessuna passphrase", "no password": "nessuna password", + "no-subscription repository": "repository no-subscription", "no_root_squash": "no_root_squash", "non-ProxMenux .tar archive(s) in this path": "in questo percorso", + "none": "nessuno", "not available yet": "non ancora disponibile", "not changed": "non modificato", "not found.": "non trovato.", + "not generated": "non generato", "not installed": "non installato", "not reliable on this hardware due to the following limitations": "non affidabile su questo hardware a causa delle seguenti limitazioni", "nouveau driver has been blacklisted.": "Il driver nouveau è stato inserito nella lista nera.", @@ -8018,6 +8237,7 @@ "pct exec authorization failed": "autorizzazione pct exec non riuscita", "pct push failed. Check log:": "pct push non riuscito. Verificare il log:", "pending (reboot required to enumerate full group)": "in sospeso (riavvio necessario per enumerare il gruppo completo)", + "pending adaptation": "adattamento in sospeso", "phpMyAdmin is installed with arbitrary server connections enabled: the login page has a Server field where the address of the MySQL or MariaDB server is entered, together with its user and password.": "phpMyAdmin è installato con le connessioni a server arbitrari abilitate: la pagina di accesso contiene un campo Server in cui inserire l’indirizzo del server MySQL o MariaDB, insieme a nome utente e password.", "pigz configuration completed": "configurazione pigz completata", "pigz enabled in vzdump configuration": "pigz abilitato nella configurazione vzdump", @@ -8027,10 +8247,13 @@ "playit.gg has to claim this agent before it forwards anything. The agent prints a one-time claim link on the container console and keeps it there until the link is opened.": "L'agente playit.gg deve essere associato a un account prima di poter inoltrare il traffico. Mostra un link di associazione monouso nella console del container e lo mantiene visibile finché non viene aperto.", "port": "porta", "portmapper/rpcbind has been disabled": "portmapper/rpcbind è stato disabilitato", + "print the estimated unpacked size in MiB (0 when unknown)": "stampa la dimensione stimata dopo l'estrazione in MiB (0 se sconosciuta)", "private network assigned automatically": "rete privata assegnata automaticamente", "privileged LXC": "LXC privilegiato", + "provide either SOURCE_TYPE+FUNCTION_NAME (single mode) or FUNCTIONS_BATCH (batch mode).": "specifica SOURCE_TYPE+FUNCTION_NAME (modalità singola) oppure FUNCTIONS_BATCH (modalità batch).", "proxmox-backup-client reported:": "proxmox-backup-client ha segnalato:", "proxmox-boot-tool refreshed": "Aggiornamento con proxmox-boot-tool completato", + "publish mount tree": "pubblicazione dell'albero di mount", "pve-enterprise.list update skipped (no change)": "Aggiornamento pve-enterprise.list saltato (nessuna modifica)", "pve-enterprise.list updated to Trixie": "pve-enterprise.list aggiornato a Trixie", "pvecm command not found (might not be in a cluster)": "Comando pvecm non trovato (potrebbe non essere in un cluster)", @@ -8043,6 +8266,7 @@ "pvesm status failed": "pvesm status non riuscito", "pyLoad is a Free and Open Source download manager written in Python and designed to be extremely lightweight, easily extensible and fully manageable via web.": "pyLoad è un download manager gratuito e open source scritto in Python, progettato per essere estremamente leggero, facilmente estensibile e interamente gestibile via web.", "pyLoad web interface": "Interfaccia web pyLoad", + "python3-jsonschema is required to generate templates": "python3-jsonschema è necessario per generare i modelli", "qBittorrent WebUI password (user: admin)": "Password WebUI qBittorrent (utente: admin)", "qBittorrent already has a configuration; it is not overwritten": "qBittorrent ha già una configurazione; non viene sovrascritta", "qBittorrent configured": "qBittorrent configurato", @@ -8064,12 +8288,14 @@ "removed from Proxmox": "rimosso da Proxmox", "removed in Proxmox": "rimossa in Proxmox", "removed successfully from Proxmox.": "rimosso con successo da Proxmox.", + "removed unused image archive: {path} ({size} bytes)": "archivio immagine inutilizzato rimosso: {path} ({size} byte)", "requires running the official installer, which restarts the Monitor service.": "richiede l'esecuzione del programma di installazione ufficiale, che riavvia il servizio Monitor.", "requires the package": "richiede il pacchetto", "restarted successfully": "riavviato con successo", "restoring /etc/network would lose connectivity": "il ripristino di /etc/network causerebbe la perdita della connettività", "restoring on:": "ripristino su:", "retries": "tentativi", + "return to host namespace": "ritorno al namespace dell'host", "reverse proxy": "reverse proxy", "root and real users only": "solo utenti root e reali", "rpcbind could not be disabled completely": "Impossibile disabilitare completamente rpcbind", @@ -8114,6 +8340,7 @@ "storage yet.": "ancora spazio di archiviazione.", "storage(s) from backup exist on target": "(tutti)", "storage.": "conservazione.", + "subscription banner": "banner di abbonamento", "successfully formatted with": "formattato con successo con", "suggested:": "suggerito:", "switch_gpu_mode.sh was not found.": "switch_gpu_mode.sh non è stato trovato.", @@ -8122,18 +8349,22 @@ "systemctl restart networking failed:": "systemctl restart networking non riuscito:", "systemd OnCalendar expression": "espressione systemd OnCalendar", "the API key was not generated on the first start": "la chiave API non è stata generata al primo avvio", + "the GPU did not answer in time": "la GPU non ha risposto in tempo", "the NVIDIA hook of the container is not available:": "l’hook NVIDIA del container non è disponibile:", "the bridge does not exist on this host:": "il bridge non esiste su questo host:", "the bridge exists on this host with another network:": "il bridge esiste su questo host con un’altra rete:", "the container has its own address, so the port Docker published on the host is not needed": "il container ha un proprio indirizzo, quindi non serve la porta pubblicata da Docker sull’host", "the containers do not agree on the private network of": "i container indicano reti private diverse per", "the device does not exist on this host:": "il dispositivo non esiste su questo host:", + "the devices it asks for are not written in a way that can be read": "i dispositivi richiesti non sono scritti in un formato leggibile", "the host directory does not exist:": "la directory host non esiste:", "the host firewall rule of the installation is not added again; allow its port in the firewall of this host if you use it.": "la regola dell’installazione nel firewall host non viene riaggiunta; consenti la sua porta nel firewall di questo host se lo usi.", + "the memory limit it asks for cannot be applied": "il limite di memoria richiesto non può essere applicato", "the minimum number of characters is": "il numero minimo di caratteri è", "the qBittorrent schema is not available": "lo schema qBittorrent non è disponibile", "the record it carries does not belong to this container": "il record che contiene non appartiene a questo container", "the record of the application does not list this container": "il record dell’applicazione non elenca questo container", + "the resource limits it asks for cannot be applied": "i limiti di risorse richiesti non possono essere applicati", "the settings of its include are not in the record:": "le impostazioni del suo include non sono nel record:", "the start order of its dependencies is not in the record": "l’ordine di avvio delle sue dipendenze non è nel record", "this configuration needs the device": "questa configurazione richiede il dispositivo", @@ -8158,6 +8389,7 @@ "unsupported dependency condition": "condizione di dipendenza non supportata", "unsupported external credential or boolean": "credenziale esterna o valore booleano non supportati", "unsupported variable": "variabile non supportata", + "update for %s exited with status %s.": "aggiornamento di %s terminato con stato %s.", "updating": "aggiornamento", "updating NVIDIA userspace libs": "aggiornamento librerie userspace NVIDIA", "user packages missing — will be installed automatically:": "pacchetti utente mancanti: verranno installati automaticamente:", @@ -8186,6 +8418,7 @@ "with Proxmox": "con Proxmox", "with prefix, e.g.": "con prefisso, ad es.", "with the password you provided.": "con la password che hai fornito.", + "x-casaos.main must name an existing service.": "x-casaos.main deve indicare un servizio esistente.", "xemu is a free and open-source application that emulates the original Microsoft Xbox game console, enabling people to play their original Xbox games on Windows, macOS, and Linux systems.": "xemu è un'applicazione gratuita e open source che emula la console Microsoft Xbox originale e permette di giocare ai propri giochi Xbox originali su Windows, macOS e Linux.", "xfs — Proxmox dir storage (large files and VMs)": "xfs — storage Proxmox di tipo dir (file grandi e VM)", "xfs — better for large files": "xfs — migliore per file grandi", @@ -8201,6 +8434,7 @@ "zfs-auto-snapshot removed (existing snapshots preserved on the pool)": "zfs-auto-snapshot rimosso (snapshot esistenti conservati nel pool)", "zpool command not found. Install zfsutils-linux and retry.": "Comando zpool non trovato. Installare zfsutils-linux e riprovare.", "zpool not found. Install zfsutils-linux and retry.": "zpool non trovato. Installare zfsutils-linux e riprovare.", + "{application} runs in {count} containers.": "{application} viene eseguita in {count} container.", "{count} saved account.": "Account salvato {count}.", "{count} saved accounts.": "Account salvati {count}.", "{path} already exists and belongs to another user of the host, so {app} cannot write to it.\n\nProxMenux can add access rules (ACL) to this directory, to everything inside it and to what is created there later, for the users and groups {app} runs as on the host (IDs {ids}). The owner of the files does not change and whatever reads or writes them today keeps doing so; the owner of the directory also gets access to the files {app} creates.\n\nGrant {app} access to this directory?": "{path} esiste già e appartiene a un altro utente dell'host, quindi {app} non può scrivervi.\n\nProxMenux può aggiungere regole di accesso (ACL) a questa directory, a tutto ciò che contiene e a ciò che vi verrà creato in seguito, per gli utenti e i gruppi con cui {app} viene eseguito sull'host (ID {ids}). Il proprietario dei file non cambia e chi oggi li legge o li scrive continua a farlo; anche il proprietario della directory ottiene l'accesso ai file creati da {app}.\n\nConcedere a {app} l'accesso a questa directory?", diff --git a/lang/pt.json b/lang/pt.json index 9e99c389..1c82da44 100644 --- a/lang/pt.json +++ b/lang/pt.json @@ -1,6 +1,9 @@ { "# Alternative if you prefer screen": "# Alternativa se você preferir tela", "# Recommended: avoids disconnection during upgrade": "# Recomendado: evita desconexão durante a atualização", + "%s of %s updates failed — see the messages above.": "%s de %s atualizações falharam — consulte as mensagens acima.", + "%s of %s updates failed.": "%s de %s atualizações falharam.", + "'auto'/'local', or root@IP for development": "'auto'/'local', ou root@IP para desenvolvimento", "(Checked entries will be removed. Uncheck to keep in VM.)": "(As entradas marcadas serão removidas. Desmarque para manter na VM.)", "(Import is selected by default — required for disk image imports)": "(A importação é selecionada por padrão – necessária para importações de imagens de disco)", "(Only the host directory is modified. Nothing inside the container is changed.": "(Apenas o diretório host é modificado. Nada dentro do contêiner é alterado.", @@ -163,6 +166,7 @@ "APT configured to skip additional languages": "APT configurado para ignorar idiomas adicionais", "APT configured to skip downloading additional languages": "APT configurado para ignorar o download de idiomas adicionais", "APT configured to use IPv4": "APT configurado para usar IPv4", + "APT hook syntax issue, removing...": "Problema de sintaxe no hook APT, a remover...", "APT index update failed after switching to no-subscription. See log:": "A atualização do índice APT falhou após mudar para sem assinatura. Veja registro:", "APT index update failed. See log:": "A atualização do índice APT falhou. Veja registro:", "APT indexes updated for Trixie": "Índices APT atualizados para Trixie", @@ -210,6 +214,7 @@ "Activate ProxMenux Monitor": "Ativar ProxMenux Monitor", "Active": "Ativo", "Active Connections": "Conexões Ativas", + "Active ZRAM algorithm, capacity or swap sources did not match the profile": "O algoritmo, a capacidade ou as origens de swap do ZRAM ativo não correspondem ao perfil", "Active exports:": "Exportações ativas:", "Active session:": "Sessão ativa:", "Actual device path on the host": "Localização real do dispositivo na máquina", @@ -263,6 +268,7 @@ "Add or remove extra paths and devices": "Adicionar ou remover caminhos e dispositivos extras", "Add physical disk to VM via": "Adicione disco físico à VM via", "Add share block in /etc/samba/smb.conf:": "Adicione bloco de compartilhamento em /etc/samba/smb.conf:", + "Add the host firewall rule of this container; one option for each confirmed rule": "Adicionar a regra de firewall do host deste contentor; uma opção por cada regra confirmada", "Add unprivileged flag to container configuration:": "Adicione sinalizador sem privilégios à configuração do contêiner:", "Add virtual disk": "Adicionar disco virtual", "Add: Mount Host Directory into LXC": "Adicionar: Monte o diretório Host no LXC", @@ -337,6 +343,7 @@ "Aliases added to .bashrc": "Aliases adicionados a .bashrc", "Alist Sync web interface": "Interface Web de sincronização Alist", "All": "Todos", + "All %s update(s) completed successfully.": "Todas as %s atualizações foram concluídas com êxito.", "All Available Scripts": "Todos os scripts disponíveis", "All GPUs Already Assigned": "Todas as GPUs já atribuídas", "All ProxMenux optimizations are up to date.": "Todas as otimizações do ProxMenux estão atualizadas.", @@ -367,6 +374,9 @@ "All {count} containers of the application will be recreated from their saved image digests (main CT: {vmid}). The stack is stopped, every container is backed up and replaced, then checked. If the operation fails after a container was changed, the backups are restored. An operation that stops halfway is recovered from the OCI management menu.": "Os {count} contêineres do aplicativo serão recriados a partir dos digests de imagem salvos (CT principal: {vmid}). A pilha é parada, é feito o backup de cada contêiner, que é substituído e depois verificado. Se a operação falhar após a alteração de um contêiner, os backups serão restaurados. Uma operação que pára no meio é recuperada no menu de gerenciamento OCI.", "Allocate CPU Cores": "Alocar núcleos de CPU", "Allocate RAM in MiB": "Alocar RAM em MiB", + "Allocated Cores:": "Núcleos atribuídos:", + "Allocated RAM:": "RAM atribuída:", + "Allocating virtual disk for %s...": "A alocar o disco virtual para %s...", "Allow TCP port {port} from {subnet} through the host firewall? Existing firewall rules are not changed.": "Permitir porta TCP {port} de {subnet} através do firewall do host? As regras de firewall existentes não são alteradas.", "Allowed hosts (comma separated; * allows access through the assigned IP)": "Hosts permitidas (separados por vírgula; * permite o acesso através do IP atribuído)", "Allowed source subnet:": "Sub-rede de origem permitida:", @@ -407,6 +417,7 @@ "Analyzing selected disks...": "Analisando discos selecionados...", "Analyzing system for available PCIe storage devices...": "Analisando sistema para dispositivos de armazenamento PCIe disponíveis...", "Another OCI operation is using the instance registry": "Outra OCI operation está usando o registro de instância", + "Another OCI operation is using the instance registry.": "Outra operação OCI está a utilizar o registo de instâncias.", "Another OCI operation is using the instance registry. Wait for it to finish and open this menu again; no container is modified.": "Outra OCI operation está usando o registro de instância. Espere que termine e abra este menu novamente; nenhum recipiente é modificado.", "Another OCI operation is using the instance registry. Wait for it to finish.": "Outra operação OCI está usando o registro da instância. Espere terminar.", "Another OCI operation is using the registry. This operation was not started.": "Outra OCI operation está usando o registro. Esta operation não foi iniciada.", @@ -421,6 +432,7 @@ "Another registry account operation is running. Try again when it finishes.": "Outra operação de conta de registro está em execução. Tente novamente quando terminar.", "Another stack operation is pending": "Outra pilha operation está pendente", "Application": "Aplicação", + "Application data": "Dados da aplicação", "Application registered on this host:": "Aplicativo registrado neste host:", "Application responding:": "Aplicação que responde:", "Application responding; checking its stability...": "Aplicação respondendo; verificando sua estabilidade...", @@ -566,6 +578,7 @@ "BIOS from": "BIOS de", "BIOS: OVMF (UEFI)": "BIOS: OVMF (UEFI)", "BOINC is a platform for high-throughput computing on a large scale (thousands or millions of computers). It can be used for volunteer computing (using consumer devices) or grid computing (using organizational resources). It supports virtualized, parallel, and GPU-based applications.": "BOINC é uma plataforma para computação de alto rendimento em grande escala (milhares ou milhões de computadores). Ele pode ser usado para computação voluntária (usando dispositivos de consumo) ou computação em grade (usando recursos organizacionais). Ele suporta aplicativos virtualizados, paralelos e baseados em GPU.", + "BRIDGE": "BRIDGE", "BRIDGE CONFIGURATION ANALYSIS": "ANÁLISE DE CONFIGURAÇÃO DE PONTE", "BTRFS:": "BTRFS:", "Baby Buddy web interface": "Interface web Baby Buddy", @@ -628,6 +641,7 @@ "Bandwidth limit configured": "Limite de largura de banda configurado", "Bandwidth test (iperf3)": "teste de largura de banda (iperf3)", "Bandwidth test completed successfully": "Teste de largura de banda concluído com sucesso", + "Banner removal cancelled by user.": "Remoção do banner cancelada pelo utilizador.", "Base VM created with ID": "VM base criada com ID", "Base VMID": "VMID base", "Base VMID (empty = next free block)": "VMID base (vazio = próximo bloco livre)", @@ -657,6 +671,7 @@ "Blocked GPU ID for VM Mode": "ID de GPU bloqueado para modo VM", "Blocked device(s)": "Dispositivo(s) bloqueado(s)", "Blocked device(s):": "Dispositivo(s) bloqueado(s):", + "Blockers": "Bloqueios", "BookStack web interface": "Interface Web BookStack", "Bookstack is a free and open source Wiki designed for creating beautiful documentation. Featuring a simple, but powerful WYSIWYG editor it allows for teams to create detailed and useful documentation with ease.": "Bookstack é um Wiki livre e de código aberto projetado para criar documentação bonita. Com um editor WYSIWYG simples, mas poderoso, permite que as equipes criem documentação detalhada e útil com facilidade.", "Boot Disk": "Disco de inicialização", @@ -691,6 +706,7 @@ "Build and install the gasket and apex kernel modules (DKMS)": "Compilar e instalar os módulos de kernel gasket e apex (DKMS)", "Build dependencies installed.": "Construa dependências instaladas.", "Build your personal knowledge base with TriliumNext Notes": "Crie sua base de conhecimento pessoal com TriliumPróximos Notas", + "Bulk generation requires GITHUB_TOKEN to obtain an immutable revision per application": "A geração em massa requer GITHUB_TOKEN para obter uma revisão imutável por aplicação", "Business & ERP": "Negócio e ERP", "CHANGES APPLIED SUCCESSFULLY": "ALTERAÇÕES APLICADAS COM SUCESSO", "CIFS Client Tools: AVAILABLE": "Ferramentas de cliente CIFS: DISPONÍVEIS", @@ -709,6 +725,7 @@ "CLUSTER UPGRADE NOTES:": "NOTAS DE ATUALIZAÇÃO DO CLUSTER:", "CONFIGURED INTERFACES": "INTERFACES CONFIGURADAS", "CONFIRM FORMAT": "CONFIRMAR FORMATO", + "CORE COUNT": "NÚMERO DE NÚCLEOS", "CPU": "CPU", "CPU Cores": "Núcleos de CPU", "CPU MODEL": "MODELO DE CPU", @@ -720,7 +737,11 @@ "CRITICAL: The selected disk is referenced by a RUNNING VM or CT.": "CRÍTICO: O disco selecionado é referenciado por uma VM ou CT em RUNNING.", "CT": "TC", "CT started successfully.": "CT iniciado com sucesso.", + "CT {vmid} ({name}) could not be kept running; it is left stopped": "Não foi possível manter o CT {vmid} ({name}) em execução; fica parado", + "CT {vmid} ({name}) stopped on its own; starting it again (attempt {attempt})": "O CT {vmid} ({name}) parou por si só; a iniciá-lo novamente (tentativa {attempt})", "CT {vmid} is a host monitor and had a rule in the host firewall. Allow TCP port {port} from {subnet} through the firewall of this host? Existing firewall rules are not changed.": "CT {vmid} é um monitor host e tinha uma regra no firewall do host. Permitir a porta TCP {port} de {subnet} através do firewall deste host? As regras de firewall existentes não são alteradas.", + "CT {vmid} is one of the {count} containers of {application}.": "O CT {vmid} é um dos {count} contentores de {application}.", + "CT {vmid}: DHCP client of {name} (IPv{version}) started again": "CT {vmid}: cliente DHCP de {name} (IPv{version}) iniciado novamente", "CUDA requires a working NVIDIA driver": "CUDA requires um driver NVIDIA funcionando", "CUDA requires the NVIDIA Container Toolkit on the host": "CUDA requires o kit de ferramentas do recipiente NVIDIA no host", "Calculate all kinds of statistics from your (local) Emby or Jellyfin server": "Calcular todos os tipos de estatísticas do seu servidor Emby ou Jellyfin (local)", @@ -737,6 +758,7 @@ "Cannot continue": "Não é possível continuar", "Cannot create:": "Não é possível criar:", "Cannot detect filesystem on": "Não é possível detectar o sistema de arquivos em", + "Cannot determine installed systemd-zram-generator version": "Não é possível determinar a versão instalada do systemd-zram-generator", "Cannot find": "Não foi possível encontrar", "Cannot identify the vendor of the device:": "Não é possível identificar o fornecedor do dispositivo:", "Cannot inspect current swap configuration": "Não é possível inspecionar a configuração de swap atual", @@ -871,8 +893,11 @@ "Checklist post-upgrade finished. Warnings:": "Lista de verificação pós-atualização concluída. Avisos:", "Checklist pre-check finished. Warnings:": "Pré-verificação da lista de verificação concluída. Avisos:", "Checks for LVM and storage issues": "Verifica problemas de LVM e armazenamento", + "Choose": "Escolha", + "Choose BIOS Type": "Escolha o tipo de BIOS", "Choose BIOS type": "Escolha o tipo de BIOS", "Choose No to abort and roll back to the legacy refuse behaviour.": "Escolha Não para abortar e reverter para o comportamento de recusa herdado.", + "Choose Type": "Escolha o tipo", "Choose ZimaOS image option:": "Escolha a opção de imagem ZimaOS:", "Choose a Samba server:": "Escolha um servidor Samba:", "Choose a Windows ISO to use:": "Escolha um ISO do Windows para usar:", @@ -972,10 +997,12 @@ "Cluster configuration (advanced)": "Configuração de cluster (avançado)", "Cluster data will be applied automatically at next boot.": "os dados do cluster serão aplicados automaticamente na próxima inicialização.", "Cluster upgrade mode": "Modo de atualização de cluster", + "Code": "Código", "Code-server is VS Code running on a remote server, accessible through the browser.": "O servidor de código é VS Code em execução em um servidor remoto, acessível através do navegador.", "CodeProject.AI Server": "CodeProject. AI Server", "Command": "Comando", "Command failed": "O comando falhou", + "Command not found.": "Comando não encontrado.", "Command override for an unknown service:": "Sobreposição de comandos para um serviço desconhecido:", "Commenting any residual Bookworm lines in *.list...": "Comentando quaisquer linhas residuais do Bookworm em *.list...", "Commenting legacy PVE 8 repository .list files (if any)...": "Comentando arquivos .list do repositório PVE 8 legado (se houver)...", @@ -1017,8 +1044,11 @@ "Component:": "Componente:", "Components to uninstall (manual for now):": "Componentes a serem desinstalados (manual por enquanto):", "Compose capabilities validated in the LXC user namespace:": "Compor capacidades validadas no espaço de nomes de utilizador LXC:", + "Compose environment must be a list or a mapping.": "O ambiente do Compose deve ser uma lista ou um mapeamento.", "Compose file of the application": "Compor o ficheiro da aplicação", "Compose file of this host": "Compor o ficheiro desta máquina", + "Compose ports must be a list.": "As portas do Compose devem ser uma lista.", + "Compose volumes must be a list.": "Os volumes do Compose devem ser uma lista.", "Compressed size:": "Tamanho compactado:", "Compressing": "Comprimindo", "Compression": "Compressão", @@ -1057,6 +1087,7 @@ "Configure Proxmox APT repositories": "Configurar repositórios Proxmox APT", "Configure Samba Client in LXC (only privileged)": "Configurar o cliente Samba no LXC (apenas privilegiado)", "Configure Samba Server in LXC (only privileged)": "Configure o Samba Server no LXC (apenas privilegiado)", + "Configure and install an application": "Configurar e instalar uma aplicação", "Configure as guest (no authentication)": "Configurar como convidado (sem autenticação)", "Configure backup destinations": "Configurar destinos de backup", "Configure backup destinations (PBS, Borg, local)": "Configurar destinos de backup (PBS, Borg, local)", @@ -1065,7 +1096,12 @@ "Configure the remote in the Rclone Web UI first. Checking its name may start a stopped CT, even in a dry run. Applying the mount restarts the CT and attempts to publish two FUSE views on the host; a dry run does not publish them.": "Configure primeiro o controle remoto na UI da Web do Rclone. A verificação de seu nome pode iniciar um CT parado, mesmo em uma simulação. A aplicação da montagem reinicia o CT e tenta publicar duas visualizações FUSE no host;um ensaio não os publica.", "Configure with username and password": "Configurar com nome de usuário e senha", "Configured Ports": "Portas configuradas", + "Configured VM description": "Descrição da VM configurada", "Configured but doesn't exist": "Configurado mas não existe", + "Configured controller/NVMe as hostpci%s: %s": "Controlador/NVMe configurado como hostpci%s: %s", + "Configured import disk %s as %s": "Disco de importação %s configurado como %s", + "Configured loader disk as ide0": "Disco do carregador configurado como ide0", + "Configured virtual disk as %s, %sGB on %s": "Disco virtual configurado como %s, %sGB em %s", "Configuring AMD GPU passthrough...": "Configurando passagem de GPU AMD...", "Configuring AMD softdep...": "Configurando o softdep AMD...", "Configuring APT to skip downloading additional languages": "Configurando o APT para pular o download de idiomas adicionais", @@ -1086,6 +1122,7 @@ "Configuring Proxmox APT repositories...": "Configurando repositórios Proxmox APT...", "Configuring Proxmox filter...": "Configurando filtro Proxmox...", "Configuring Proxmox jail...": "Configurando a prisão do Proxmox...", + "Configuring Serial Port:": "A configurar a porta série:", "Configuring TCP optimizations...": "Configurando otimizações de TCP...", "Configuring TPM device": "Configurando o dispositivo TPM", "Configuring Unpackerr...": "Configurando o Unpackerr...", @@ -1161,6 +1198,7 @@ "Consider security implications for production environments": "Considere as implicações de segurança para ambientes de produção", "Consider visiting the repository and supporting the project.": "Considere visitar o repositório e apoiar o projeto.", "Console log:": "Registo da consola:", + "Consume/export": "Consumo/exportação", "Container": "Contêiner", "Container — LXC root directories": "Container - diretórios raiz LXC", "Container ID": "ID do contêiner", @@ -1247,6 +1285,7 @@ "Controller + NVMe passthrough requires machine type q35. Skipping controller assignment.": "A passagem Controlador + NVMe requer tipo de máquina q35. Ignorando atribuição do controlador.", "Controller/NVMe Conflict Policy": "Política de Conflito Controlador/NVMe", "Controller/NVMe already present in VM config": "Controlador/NVMe já presente na configuração da VM", + "Controller/NVMe already present in VM config (%s)": "Controlador/NVMe já presente na configuração da VM (%s)", "Controller/NVMe assigned": "Controlador/NVMe atribuído", "Controller/NVMe is in use by running VM": "Controlador/NVMe está em uso executando VM", "Controller/NVMe passthrough requires IOMMU enabled in BIOS/UEFI and kernel.": "A passagem do controlador/NVMe requer IOMMU habilitado no BIOS/UEFI e no kernel.", @@ -1313,6 +1352,7 @@ "Core packages": "Pacotes principais", "Cores": "Cores", "Corrupted gzip layer": "Camada gzip corrompida", + "Could not activate dev-zram0.swap": "Não foi possível ativar o dev-zram0.swap", "Could not add": "Não foi possível adicionar", "Could not add disk": "Não foi possível adicionar o disco", "Could not add the confirmed host firewall rule": "Não foi possível adicionar a regra de firewall do host confirmada", @@ -1329,12 +1369,14 @@ "Could not change VM virtual display to vga: std": "Não foi possível alterar a exibição virtual da VM para vga: std", "Could not check the NVIDIA GPU": "Não foi possível verificar a GPU NVIDIA", "Could not clone any gasket-driver repository. Check your internet connection and": "Não foi possível clonar um repositório gasket-driver. Verifique a ligação à Internet e", + "Could not complete or verify the repository switch; changes may be partial and repository state is unknown. Inspect {ui} before retrying; no automatic rollback was attempted.": "Não foi possível concluir ou verificar a mudança de repositório; as alterações podem ser parciais e o estado do repositório é desconhecido. Inspecione {ui} antes de tentar novamente; não foi tentada nenhuma reversão automática.", "Could not complete private network release:": "Não foi possível concluir a liberação da rede privada:", "Could not configure IOMMU kernel parameters automatically. Configure manually and reboot.": "Não foi possível configurar os parâmetros do kernel IOMMU automaticamente. Configure manualmente e reinicie.", "Could not convert the OCI rootfs to privileged": "Não foi possível converter os rootfs do OCI para privilegiado", "Could not copy the PVE keyfile into place. Check permissions on:": "Não foi possível copiar o arquivo-chave PVE no lugar. Verifique as permissões em:", "Could not copy the keyfile into place.": "Não foi possível copiar o arquivo-chave no lugar.", "Could not copy the keyfile into place. Check permissions on:": "Não foi possível copiar o arquivo-chave no lugar. Verifique as permissões em:", + "Could not create ZRAM generator directory": "Não foi possível criar o diretório do gerador ZRAM", "Could not create a temporary directory for the NVIDIA Container Toolkit.": "Não foi possível criar um diretório temporário para o NVIDIA Container Toolkit.", "Could not create converter directory:": "Não foi possível criar o diretório do conversor:", "Could not create destination directory:": "Não foi possível criar o diretório de destino:", @@ -1391,6 +1433,7 @@ "Could not push the key. Check the password and that": "Não foi possível pressionar a chave. Verifique a senha e isso", "Could not query the image registry": "Não foi possível consultar o registro de imagem", "Could not reach {registry}. Check its address, DNS and network access.": "Não foi possível acessar {registry}. Verifique seu endereço, DNS e acesso à rede.", + "Could not reach {url} after 3 attempts: {reason}": "Não foi possível contactar {url} após 3 tentativas: {reason}", "Could not read SMART data from": "Não foi possível ler os dados SMART de", "Could not read VM configuration.": "Não foi possível ler a configuração da VM.", "Could not read the CUDA compute capability": "Não foi possível ler a capacidade de computação do CUDA", @@ -1423,6 +1466,7 @@ "Could not stage pending restore. Nothing new was scheduled.": "não foi possível preparar a restauração pendente. Nada de novo foi programado.", "Could not stop LXC": "Não foi possível parar o LXC", "Could not stop ZRAM swap; profile configuration remains": "Não foi possível interromper a troca de ZRAM; a configuração do perfil permanece", + "Could not stop existing dev-zram0.swap": "Não foi possível parar o dev-zram0.swap existente", "Could not translate the Compose command/entrypoint": "Não foi possível traduzir o comando/ponto de entrada Compose", "Could not unload nouveau module (may be in use). The blacklist will take effect after reboot. Installation will continue but a reboot will be required.": "Não foi possível descarregar o módulo nouveau (pode estar em uso). A lista negra entrará em vigor após a reinicialização. A instalação continuará, mas será necessária uma reinicialização.", "Could not unmount": "Não foi possível desmontar", @@ -1431,6 +1475,8 @@ "Could not unmount — disk may be busy. Removing fstab entry anyway.": "Não foi possível desmontar — o disco pode estar ocupado. Removendo a entrada fstab de qualquer maneira.", "Could not update config file.": "Não foi possível atualizar o arquivo de configuração.", "Could not verify removal of the managed host firewall rule.": "não foi possível verificar a remoção da regra de firewall do host gerenciado.", + "Could not write ZRAM generator configuration": "Não foi possível escrever a configuração do gerador ZRAM", + "Could not write ZRAM package ownership state": "Não foi possível escrever o estado de propriedade dos pacotes ZRAM", "Could not write to:": "Não foi possível escrever para:", "Crafty Controller default login": "Login padrão do controlador Crafty", "Create Directory": "Criar diretório", @@ -1449,6 +1495,7 @@ "Create VM System Windows": "Criar VM com Windows", "Create VM System macOS (OSX-PROXMOX)": "Criar VM com macOS (OSX-PROXMOX)", "Create VM from template or script": "Crie VM a partir de modelo ou script", + "Create a %s": "Criar uma %s", "Create a VM first (machine type q35 + UEFI BIOS), then run this option again.": "Crie primeiro uma VM (tipo de máquina q35 + UEFI BIOS) e, em seguida, execute esta opção novamente.", "Create a backup of the container configuration:": "Crie um backup da configuração do contêiner:", "Create a backup of your container before proceeding": "Crie um backup do seu contêiner antes de continuar", @@ -1473,6 +1520,7 @@ "Created persistent names for": "Nomes persistentes criados para", "Created remapped user": "Usuário remapeado criado", "Created sharedfiles group (GID: 101000)": "Grupo de arquivos compartilhados criado (GID: 101000)", + "Created with ProxMenuX": "Criado com ProxMenuX", "Creating APT configuration to force IPv4...": "Criando configuração do APT para forçar IPv4...", "Creating Ceph repository for PVE 8 (legacy format)...": "Criando repositório Ceph para PVE 8 (formato legado)...", "Creating Ceph repository for PVE 9 (deb822 format)...": "Criando repositório Ceph para PVE 9 (formato deb822)...", @@ -1482,6 +1530,8 @@ "Creating UID remapping for unprivileged container compatibility...": "Criando remapeamento de UID para compatibilidade de contêiner sem privilégios...", "Creating VM with the above configuration": "Criando VM com a configuração acima", "Creating VM...": "Criando VM...", + "Creating a %s using the above advanced settings": "A criar uma %s com as definições avançadas acima", + "Creating a %s using the above default settings": "A criar uma %s com as definições predefinidas acima", "Creating a backup in": "Criando um backup em", "Creating a backup of": "Criar uma cópia de segurança de", "Creating a backup of the container...": "Criando um backup do recipiente...", @@ -1490,6 +1540,7 @@ "Creating backup of network interfaces configuration...": "Criando backup da configuração das interfaces de rede...", "Creating compressed archive...": "Criando arquivo compactado...", "Creating export archive...": "Criando arquivo de exportação...", + "Creating images directory": "A criar o diretório de imagens", "Creating local archive...": "Criando arquivo local...", "Creating mount point...": "Criando ponto de montagem...", "Creating partition table and partition...": "Criando tabela de partição e partição...", @@ -1504,6 +1555,7 @@ "Creating the initial administrator...": "Criando o administrador inicial...", "Creating the private network...": "Criando a rede privada...", "Creating the temporary data container": "Criando o recipiente de dados temporário", + "Creating virtual disk (format=raw) for %s...": "A criar o disco virtual (format=raw) para %s...", "Creative & Design": "Criatividade e design", "Credential helper": "Auxiliar de credencial", "Credential storage and access": "Armazenamento e acesso de credenciais", @@ -1564,6 +1616,8 @@ "Custom Configuration": "Configuração personalizada", "Custom Content": "Conteúdo personalizado", "Custom Directory": "Diretório personalizado", + "Custom Image": "Imagem personalizada", + "Custom Loader Image (from %s)": "Imagem de carregador personalizada (de %s)", "Custom Logo Instructions": "Instruções para logotipo personalizado", "Custom MOTD message is already configured": "a mensagem MOTD personalizada já está configurada", "Custom Options": "Opções personalizadas", @@ -1638,6 +1692,7 @@ "Dedicated container volume (included in backups)": "Volume dedicado do recipiente (incluído em backups)", "Dedicated container volumes (included in backups)": "Volumes de contentores dedicados (incluídos em cópias de segurança)", "DeepSeek Harness “Everything is a Plugin“.": "DeepSeek Harness “Tudo é um Plugin“.", + "Default": "Predefinido", "Default ACLs applied for group inheritance.": "ACLs padrão aplicadas para herança de grupo.", "Default Credentials": "Credenciais padrão", "Default Gateway": "Gateway padrão", @@ -1880,9 +1935,11 @@ "Do you want to update the existing export?": "Deseja atualizar a exportação existente?", "Do you want to update the existing share?": "Deseja atualizar o compartilhamento existente?", "Do you want to view the selected backup before restoring?": "Deseja visualizar o backup selecionado antes de restaurá-lo?", + "Do-Over": "Refazer", "Docker Mods are only offered for compatible LinuxServer images": "Docker Mods são oferecidos apenas para imagens LinuxServer compatíveis", "Docker Volume Backup": "Docker Volume Backup", "Docker/CLI not available yet or no valid answer": "Docker/CLI ainda não disponível ou nenhuma resposta válida", + "Docs": "Documentação", "Documents & Notes": "Documentos e notas", "Documents volume size in GB": "Tamanho do volume de documentos em 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 é um software wiki de código aberto muito simples de usar e altamente versátil que não require um banco de dados. É amado pelos usuários por sua sintaxe limpa e legível. A facilidade de manutenção, backup e integração o torna o favorito do administrador. Conectados em controles de acesso e conectores de autenticação tornam o DokuWiki especialmente útil no contexto empresarial e o grande número de plugins contribuídos por sua comunidade vibrante permitem uma ampla gama de casos de uso além de uma wiki tradicional.", @@ -1898,6 +1955,7 @@ "Download its Compose file from an address": "Baixe seu arquivo Compose de um endereço", "Download keyfile": "Baixar arquivo-chave", "Download latest VirtIO ISO automatically": "Baixe o VirtIO ISO mais recente automaticamente", + "Downloaded %s to %s": "%s descarregado para %s", "Downloaded OCI images deleted:": "Imagens OCI transferidas suprimidas:", "Downloaded amdgpu_top": "baixado amdgpu_top", "Downloading": "Baixando", @@ -1943,8 +2001,12 @@ "Duration": "Duração", "Duration:": "Duração:", "Dynamic NVIDIA is only validated for unprivileged containers. This profile uses static mounts and must be recreated after the host driver changes.": "A NVIDIA dinâmica só é validada para recipientes não privilegiados. Este perfil usa montagens estáticas e deve ser recriado após as mudanças do driver.", + "EFI Disk Storage": "Armazenamento do disco EFI", + "EFI disk created (raw) and configured on %s": "Disco EFI criado (raw) e configurado em %s", "EFI disk created and configured on": "Disco EFI criado e configurado em", + "EFI disk created and configured on %s": "Disco EFI criado e configurado em %s", "EFI storage selection cancelled.": "Seleção de armazenamento EFI cancelada.", + "EFI storage selection failed or was cancelled.": "A seleção do armazenamento EFI falhou ou foi cancelada.", "EFI storage selection failed or was cancelled. VM creation aborted.": "A seleção de armazenamento EFI falhou ou foi cancelada. Criação de VM abortada.", "EMERGENCY PROXMOX SYSTEM REPAIR": "REPARO DE EMERGÊNCIA DO SISTEMA PROXMOX", "ENABLED for restore": "HABILITADO para restauração", @@ -1960,6 +2022,7 @@ "Edit raw CT configuration file": "Editar arquivo de configuração CT bruto", "Edit raw VM configuration file": "Editar arquivo de configuração bruto da VM", "Edit the VM machine type to q35 and try again.": "Edite o tipo de máquina VM para q35 e tente novamente.", + "Edition:": "Edição:", "Email address for certificate expiry notices (required by ZeroSSL)": "Endereço de e-mail para os avisos de validade do certificado (required by ZeroSSL)", "Email address of the LibreDB Studio administrator": "Endereço de e-mail do administrador LibreDB Studio", "Email address of the NetBox admin account": "Endereço de e-mail da conta de administrador NetBox", @@ -1969,6 +2032,7 @@ "Emby organizes video, music, live TV, and photos from personal media libraries and streams them to smart TVs, streaming boxes and mobile devices. This container is packaged as a standalone emby Media Server.": "Emby organiza vídeo, música, TV ao vivo e fotos de bibliotecas de mídia pessoal e os transmite para televisões inteligentes, caixas de streaming e dispositivos móveis. Este recipiente é embalado como um servidor de mídia emby independente.", "Emergency Proxmox System Repair": "Reparo de emergência do sistema Proxmox", "Emergency recovery:": "Recuperação de emergência:", + "Emit numeric progress for the OCI menu": "Emitir progresso numérico para o menu OCI", "Empowering the smart home": "Empoderar o lar inteligente", "Empty": "Vazio", "Empty exec service check": "Verificação do serviço executivo vazio", @@ -1991,6 +2055,7 @@ "Enable ZFS autotrim (SSD/NVMe pools)": "Habilitar ajuste automático ZFS (pools SSD/NVMe)", "Enable ZRAM swap profile": "Habilitar perfil de troca ZRAM", "Enable a mount on an existing Rclone OCI container": "Activar uma montagem num contentor Rclone OCI existente", + "Enable a mount on an installed Rclone OCI": "Ativar uma montagem num OCI Rclone instalado", "Enable an optical drive for MakeMKV": "Activar uma unidade óptica para MakeMKV", "Enable auto-sync if /var/log exceeds 90% of its size?": "Ativar a sincronização automática se /var/log exceder 90% do seu tamanho?", "Enable fast reboots": "Habilite reinicializações rápidas", @@ -2118,6 +2183,7 @@ "Enter target disk (e.g. /dev/sdX):": "Insira o disco de destino (por exemplo, /dev/sdX):", "Enter target storage name (e.g., local-lvm):": "Insira o nome do armazenamento de destino (por exemplo, local-lvm):", "Enter target storage:": "Insira o armazenamento de destino:", + "Enter temporary folder path (default: %s):": "Introduza o caminho da pasta temporária (predefinição: %s):", "Enter the BORG REPOKEY passphrase for target:": "Digite a senha do BORG REPOKEY para o destino:", "Enter the Samba username:": "Digite o nome de usuário do Samba:", "Enter the VMID for the new VM:": "Insira o VMID da nova VM:", @@ -2144,6 +2210,7 @@ "Enterprise repository present": "Repositório corporativo presente", "Enterprise repository returned 401 Unauthorized (no valid subscription). Switch to the no-subscription repository and retry?": "O repositório corporativo retornou 401 Não autorizado (sem assinatura válida). Mudar para o repositório sem assinatura e tentar novamente?", "Enterprise repository unauthorized and fallback declined by user": "Repositório corporativo não autorizado e substituto recusado pelo usuário", + "Enterprise shares an APT stanza with other components. Split it in the Proxmox repository UI; no repository changed.": "O Enterprise partilha uma stanza APT com outros componentes. Separe-a na interface de repositórios do Proxmox; nenhum repositório foi alterado.", "Entropy generation optimization removed": "Otimização de geração de entropia removida", "Environment entry without an explicit value": "Entrada do ambiente sem um valor explícito", "Environment override for an unknown service:": "Sobreposição do ambiente para um serviço desconhecido:", @@ -2153,6 +2220,7 @@ "Error": "Erro", "Error applying patch. Backups preserved at": "Erro ao aplicar patch. Backups preservados em", "Error details:": "Detalhes do erro:", + "Error generating UUP download list.": "Erro ao gerar a lista de transferências UUP.", "Error installing": "Erro ao instalar", "Error installing build dependencies. Check": "Erro ao instalar dependências de build. Verificar", "Error:": "Erro:", @@ -2197,6 +2265,7 @@ "Execution engine for Index-TTS": "Motor de execução para Index-TTS", "Existing Groups": "Grupos Existentes", "Existing TLS certificate reused:": "Certificado TLS existente reutilizado:", + "Existing ZRAM profile is active but does not match its configuration": "O perfil ZRAM existente está ativo, mas não corresponde à sua configuração", "Existing file, re-downloading...": "Arquivo existente, baixando novamente...", "Existing filesystem:": "Sistema de arquivos existente:", "Existing hostpci entries detected — they will be reused": "Entradas hostpci existentes detectadas – elas serão reutilizadas", @@ -2206,6 +2275,7 @@ "Exit": "Saída", "Exit and repair manually": "Sair e reparar manualmente", "Exit the container terminal:": "Saia do terminal de contêineres:", + "Exit-Script": "Sair do script", "Exit: Stop to create backup manually": "Sair: Pare para criar backup manualmente", "Exiting for manual repair...": "Saindo para reparo manual...", "Expected /tmp/gasket-driver/src not found. The clone seems incomplete or uses an unknown layout.": "Esperado /tmp/gasket-driver/src não encontrado. O clone parece incompleto ou usa um layout desconhecido.", @@ -2282,7 +2352,11 @@ "Failed to add bind mount:": "Falha ao adicionar montagem de ligação:", "Failed to add iSCSI storage to Proxmox.": "Falha ao adicionar armazenamento iSCSI ao Proxmox.", "Failed to add storage to Proxmox.": "Falha ao adicionar armazenamento ao Proxmox.", + "Failed to allocate virtual disk %s": "Falha ao alocar o disco virtual %s", "Failed to assign Controller/NVMe": "Falha ao atribuir controlador/NVMe", + "Failed to assign disk %s (%s) on %s": "Falha ao atribuir o disco %s (%s) em %s", + "Failed to assign loader disk": "Falha ao atribuir o disco do carregador", + "Failed to assign loader disk to ide0": "Falha ao atribuir o disco do carregador a ide0", "Failed to assign virtual disk": "Falha ao atribuir disco virtual", "Failed to clone Lynis from GitHub": "Falha ao clonar Lynis do GitHub", "Failed to clone log2ram repository. Check /tmp/log2ram_install.log": "Falha ao clonar o repositório log2ram. Verifique /tmp/log2ram_install.log", @@ -2291,8 +2365,11 @@ "Failed to configure Proxmox Backup Server repositories": "Falha ao configurar os repositórios do Proxmox Backup Server", "Failed to configure Proxmox repositories": "Falha ao configurar repositórios Proxmox", "Failed to configure TPM device in VM": "Falha ao configurar o dispositivo TPM na VM", + "Failed to configure controller/NVMe: %s": "Falha ao configurar o controlador/NVMe: %s", + "Failed to configure import disk %s as %s": "Falha ao configurar o disco de importação %s como %s", "Failed to configure repositories.": "Falha ao configurar repositórios.", "Failed to configure repositories. Installation aborted.": "Falha ao configurar repositórios. Instalação abortada.", + "Failed to configure virtual disk as %s": "Falha ao configurar o disco virtual como %s", "Failed to connect to": "Falha ao conectar-se a", "Failed to connect to server.": "Falha ao conectar ao servidor.", "Failed to copy sources into": "Falha ao copiar fontes para", @@ -2366,7 +2443,9 @@ "Failed to install intel-gpu-tools": "Falha ao instalar ferramentas Intel-GPU", "Failed to install libedgetpu1-std. Check": "Falha ao instalar libedgetpu1-std. Verificar", "Failed to install pigz": "Falha ao instalar o pigz", + "Failed to install unzip": "Falha ao instalar o unzip", "Failed to install zfs-auto-snapshot": "Falha ao instalar o zfs-auto-snapshot", + "Failed to install:": "Falha ao instalar:", "Failed to migrate the existing ProxMenux Bash configuration.": "Falha ao migrar a configuração Bash ProxMenux existente.", "Failed to mount CIFS share on host.": "Falha ao montar o compartilhamento CIFS no host.", "Failed to mount NFS share on host.": "Falha ao montar o compartilhamento NFS no host.", @@ -2550,6 +2629,7 @@ "Full path": "Caminho completo", "Full report — complete SMART data (scrollable)": "Relatório completo – dados SMART completos (rolável)", "Full system upgrade, including dependencies": "Atualização completa do sistema, incluindo dependências", + "Function '%s' is not defined in the %s flow.": "A função '%s' não está definida no fluxo %s.", "Function Level Reset (FLR) not available": "Redefinição de nível de função (FLR) não disponível", "GID already in use:": "GID já em uso:", "GID in CT": "GID em TC", @@ -2628,6 +2708,7 @@ "Generated Paperless administrator": "Administrador Gerado sem Papel", "Generated Tandoor administrator": "Gerado o administrador Tandoor", "Generated administrator login": "Gerou o login do administrador", + "Generated: {generated}; failed: {failed}; family: {provider}": "Gerados: {generated}; com falha: {failed}; família: {provider}", "Generating OVF descriptor...": "Gerando descritor OVF...", "Generating dkms.conf...": "Gerando dkms.conf...", "Generating manifest...": "Gerando manifesto...", @@ -2639,6 +2720,9 @@ "Get the container's storage information:": "Obtenha as informações de armazenamento do contêiner:", "Get up and running with large language models locally": "Começar a funcionar com modelos de linguagem grandes localmente", "Git installed": "Git instalado", + "GitHub returned HTTP 403 for {url}. Set GITHUB_TOKEN to raise the API rate limit.": "O GitHub devolveu HTTP 403 para {url}. Defina GITHUB_TOKEN para aumentar o limite de pedidos da API.", + "GitHub returned HTTP {status} for {url}.": "O GitHub devolveu HTTP {status} para {url}.", + "GitHub returned a truncated tree for the CasaOS catalogue": "O GitHub devolveu uma árvore truncada para o catálogo do CasaOS", "GitQlient is a multi-platform Git client originally forked from QGit. Nowadays it goes beyond of just a fork and adds a lot of new functionality.": "GitQlient é uma multi-plataforma Cliente Git originalmente forked do QGit. Hoje em dia vai além de apenas um fork e adiciona um monte de novas funcionalidades.", "Github Desktop is an open source Electron-based GitHub app. It is written in TypeScript and uses React.": "Github Desktop é uma aplicação GitHub baseada em electrões de código aberto. É escrito em TypeScript e usa React.", "Global settings and SSH jail configured": "Configurações globais e prisão SSH configuradas", @@ -2691,6 +2775,7 @@ "HAOS One is a community image that runs Docker inside the container. The LXC stays unprivileged, but the inner AppArmor profiles may not be available. The first start downloads Home Assistant Core and its add-ons. If the check fails, the CT and /mnt/data are kept for diagnosis.": "HAOS One é uma imagem comunitária que executa Docker dentro do recipiente. O LXC permanece sem privilégios, mas os perfis internos do AppArmor podem não estar disponíveis. O primeiro início baixa o Home Assistant Core e seus add-ons. Se a verificação falhar, a TC e /mnt/dados são mantidos para diagnóstico.", "HAOS One profile declined": "O perfil do HAOS One diminuiu", "HAOS One requires an unprivileged unmanaged LXC with nesting and keyctl, 2 cores, 2048 MB RAM, rootfs of at least 12 GB and /mnt/data of at least 16 GB on a container volume included in backups": "HAOS One requires um LXC não privilegiado não gerido com nidificação e keyctl, 2 núcleos, 2048 MB RAM, rootfs de pelo menos 12 GB e /mnt/dados de pelo menos 16 GB em um volume de recipiente incluído em backups", + "HOSTNAME": "NOME DO ANFITRIÃO", "HTML5 Network Speed Test Server.": "Servidor de Teste de Velocidade de Rede HTML5.", "HTTP service check without a saved URL": "Verificação de serviço HTTP sem um URL salvo", "Habridge emulates Philips Hue API to other home automation gateways such as an Amazon Echo/Dot Gen 1 (gen 2 has issues discovering ha-bridge) or other systems that support Philips Hue. The Bridge handles basic commands such as On, Off and brightness commands of the hue protocol. This bridge can control most devices that have a distinct API.": "Habridge emula Philips Hue API para outros gateways de automação doméstica, como um Amazon Echo/Dot Gen 1 (gen 2 tem problemas descobrindo ha-bridge) ou outros sistemas que suportam Philips Hue. A Ponte lida com comandos básicos como comandos On, Off e brilho do protocolo de matiz. Esta ponte pode controlar a maioria dos dispositivos que têm uma API distinta.", @@ -2786,6 +2871,7 @@ "Host device node": "Nó do dispositivo da máquina", "Host directories are not included in the backup and are not reverted by a recovery.": "Diretórios host não estão incluídos no backup e não são revertidas por uma recuperação.", "Host directories are not included in the backups and are not reverted by a recovery.": "Diretórios host não estão incluídos nos backups e não são revertidas por uma recuperação.", + "Host directories are not reverted by the backup (confirmed beforehand)": "Os diretórios do host não são revertidos pelo backup (confirmado previamente)", "Host directories cannot be included in vzdump": "diretórios de host não podem ser incluídos no vzdump", "Host directories cannot be part of the vzdump backup": "As pastas da máquina não podem fazer parte do backup do vzdump", "Host directories that are kept, with their content:": "Directórios de máquinas que são mantidos, com o seu conteúdo:", @@ -2809,6 +2895,7 @@ "Host fstab NFS mounts (not registered with pvesm):": "Host fstab montagens NFS (não registradas com pvesm):", "Host fstab NFS mounts:": "Host fstab montagens NFS:", "Host fstab mounts (not registered as Proxmox storage):": "Host fstab montagens (não registradas como armazenamento Proxmox):", + "Host has an active subscription but no active {short} repository. Configure its Enterprise source in {ui}; no repository changed.": "O host tem uma subscrição ativa, mas nenhum repositório {short} ativo. Configure a sua origem Enterprise em {ui}; nenhum repositório foi alterado.", "Host identity (hostname, hosts)": "Identidade do host (nome do host, hosts)", "Host kernel module loaded:": "Módulo do kernel da máquina carregado:", "Host monitor configured: shared PID and network namespaces, LXCFS disabled in this container": "Monitor de máquina configurado: espaços de nomes compartilhados PID e rede, LXCFS desabilitados neste recipiente", @@ -2838,6 +2925,7 @@ "Htpcmanager is a front end for many htpc related applications.": "Htpcmanager é uma interface para muitas aplicações relacionadas com htpc.", "I have read this": "eu li isso", "I/O priority configured": "Prioridade de E/S configurada", + "ID %s is already in use": "O ID %s já está a ser utilizado", "ID already in use. Please choose another.": "ID já em uso. Por favor escolha outro.", "IGDB": "IGDB", "IGDB Client ID": "ID do Cliente do IGDB", @@ -2891,6 +2979,7 @@ "ISO image — installation images": "Imagem ISO – imagens de instalação", "ISO image downloaded": "Imagem ISO baixada", "ISO not found to mount on device": "ISO não encontrado para montagem no dispositivo", + "Icons resolved: {resolved}; cleared: {cleared}; unchanged: {unchanged}; with a theme variant: {themed}": "Ícones resolvidos: {resolved}; limpos: {cleared}; inalterados: {unchanged}; com variante de tema: {themed}", "Identical:": "Idêntico:", "Identify candidate disk (never use system disk):": "Identifique o disco candidato (nunca use o disco do sistema):", "Identify persistent disk paths": "Identifique caminhos de disco permanente", @@ -2898,6 +2987,7 @@ "If Code 43 error appears, KVM hiding is already configured.": "Se o erro do Código 43 aparecer, a ocultação do KVM já está configurada.", "If GUI does not load:": "Se a GUI não carregar:", "If ZFS errors occur:": "Se ocorrerem erros do ZFS:", + "If a newer application image is available, the container is stopped and backed up, and the backup integrity is verified. The container is then updated using the new image.\n\nIf the update fails after the container was changed, ProxMenux attempts to restore the previous installation from the backup. If the operation remains incomplete, select the application in OCI management and choose \"Recover the previous installation\".\n\nHost directories mounted in the container are not restored by the container backup.": "Se estiver disponível uma imagem mais recente da aplicação, o contentor é parado, é feito um backup e a integridade do backup é verificada. Em seguida, o contentor é atualizado com a nova imagem.\n\nSe a atualização falhar depois de o contentor ter sido alterado, o ProxMenux tenta restaurar a instalação anterior a partir do backup. Se a operação ficar incompleta, selecione a aplicação na gestão OCI e escolha \"Recuperar a instalação anterior\".\n\nOs diretórios do host montados no contentor não são restaurados pelo backup do contentor.", "If booting in EFI mode with root on LVM: install GRUB for EFI": "Se inicializar no modo EFI com root no LVM: instale o GRUB para EFI", "If config issues occur:": "Se ocorrerem problemas de configuração:", "If container won't start:": "Se o contêiner não iniciar:", @@ -2955,6 +3045,7 @@ "Image selection was cancelled": "A seleção da imagem foi cancelada", "Image that is not in the catalog": "Imagem que não está no catálogo", "Image:": "Imagem:", + "Images directory created: %s": "Diretório de imagens criado: %s", "Images to import:": "Imagens para importar:", "Immich CUDA requires NVIDIA driver 545 or later": "Immich CUDA requires NVIDIA driver 545 ou posterior", "Immich GPU profile not validated": "Perfil Immich GPU não validado", @@ -2986,6 +3077,7 @@ "Imported:": "Importado:", "Importing": "Importando", "Importing disk": "Importando disco", + "Importing loader disk:": "A importar o disco do carregador:", "Importing:": "Importando:", "Improve log rotation and limit log size to save space and extend disk life": "Melhore a rotação do log e limite o tamanho do log para economizar espaço e prolongar a vida útil do disco", "In an LXC": "Em um LXC", @@ -3040,6 +3132,7 @@ "Independent LXC applications installed": "Aplicações independentes LXC instaladas", "Independent LXCs: no main container or hookscript. Each one keeps its own Start with Proxmox setting.": "LXCs independentes: nenhum recipiente principal ou gancho. Cada um mantém a sua própria configuração Iniciar com Proxmox.", "Independent applications, without a main container.": "Aplicações independentes, sem um recipiente principal.", + "Index updated: {count} candidate applications": "Índice atualizado: {count} aplicações candidatas", "Indexers and quality profiles still need to be configured.": "Os indexadores e os perfis de qualidade ainda precisam ser configurados.", "Inherited retention:": "retenção herdada:", "Inherited schedule:": "Cronograma herdado:", @@ -3110,7 +3203,10 @@ "Install with: apt-get install open-iscsi": "Instale com: apt-get install open-iscsi", "Install/Update Coral TPU on Host": "Instalar/atualizar Coral TPU no host", "Install/Update NVIDIA Drivers (Host + LXC)": "Instalar/atualizar drivers NVIDIA (Host + LXC)", + "Install? [y/N]:": "Instalar? [y/N]:", "Installation Complete": "Instalação concluída", + "Installation blocked:": "Instalação bloqueada:", + "Installation cancelled.": "Instalação cancelada.", "Installation completed": "Instalação concluída", "Installation completed.": "Instalação concluída.", "Installation completed. Please reboot the server manually as soon as possible.": "Instalação concluída. Reinicie o servidor manualmente o mais rápido possível.", @@ -3124,6 +3220,7 @@ "Installed": "Instalado", "Installed at:": "Instalado em:", "Installed components:": "Componentes instalados:", + "Installed unzip successfully.": "unzip instalado com êxito.", "Installed:": "Instalado:", "Installer already downloaded and verified.": "Instalador já baixado e verificado.", "Installer copied to container.": "Instalador copiado para contêiner.", @@ -3165,6 +3262,7 @@ "Installing and configuring Figurine...": "Instalando e configurando o Figurine...", "Installing and configuring ZFS auto-snapshot...": "Instalando e configurando o instantâneo automático do ZFS...", "Installing build dependencies...": "Instalando dependências de compilação...", + "Installing dependencies:": "A instalar dependências:", "Installing dependency:": "Instalando dependência:", "Installing essential Proxmox packages...": "Instalando pacotes essenciais do Proxmox...", "Installing gawk (required for OVF parsing)...": "Instalando o gawk (necessário para análise de OVF)...", @@ -3187,9 +3285,11 @@ "Installing the new image...": "Instalando a nova imagem...", "Installing the new image:": "Instalando a nova imagem:", "Installing the stack startup hook...": "Instalando o gancho inicial da pilha...", + "Installing unzip...": "A instalar o unzip...", "Installing zfs-auto-snapshot package...": "Instalando o pacote zfs-auto-snapshot...", "Installs essential packages if missing": "Instala pacotes essenciais se estiverem faltando", "Insufficient Disk Space": "Espaço em disco insuficiente", + "Insufficient disk space. Available:": "Espaço em disco insuficiente. Disponível:", "Insufficient disk space. Skipping LXC": "Espaço em disco insuficiente. Ignorando LXC", "Insufficient memory. NVIDIA install aborted.": "Memória insuficiente. Instalação da NVIDIA abortada.", "Insufficient memory. Skipping LXC": "Memória insuficiente. Ignorando LXC", @@ -3225,12 +3325,15 @@ "Interfaces to Remove": "Interfaces para remover", "Internal error: NVIDIA installer path is empty or file not found.": "Erro interno: o caminho do instalador NVIDIA está vazio ou o arquivo não foi encontrado.", "Internal error: missing arguments in pmx_prepare_host_shared_dir": "Erro interno: argumentos ausentes em pmx_prepare_host_shared_dir", + "Internal installer operation; not legacy adoption": "Operação interna do instalador; não é uma adoção legada", "Internal subnet of the tunnel (change it only if it clashes)": "Subrede interna do túnel (altere-o apenas se colidir)", "Interrupted operation": "operation interrompido", "Interrupted operation:": "operation interrompida:", "Interrupted stack operation found": "Pilha interrompida operation encontrada", "Invalid 'proxmox-ve' candidate (not 9.x or none). Please verify your repository configuration and network, then retry.": "Candidato 'proxmox-ve' inválido (não 9.x ou nenhum). Verifique a configuração e a rede do seu repositório e tente novamente.", "Invalid ALLOWED_HOSTS value": "Valor de ALLOWED_HOSTS inválido", + "Invalid Compose port:": "Porta do Compose inválida:", + "Invalid Compose volume path:": "Caminho de volume do Compose inválido:", "Invalid Home Assistant OS check timeout": "Tempo de verificação do sistema operacional Home Assistant inválido", "Invalid ID": "ID inválido", "Invalid IPv4 address": "Endereço IPv4 inválido", @@ -3266,6 +3369,7 @@ "Invalid action": "ação inválida", "Invalid administrator email": "E- mail de administrador inválido", "Invalid administrator user name": "Nome de usuário do administrador inválido", + "Invalid application identifier:": "Identificador de aplicação inválido:", "Invalid base VMID": "VMID base inválida", "Invalid bridge": "Bridge inválida", "Invalid check package:": "Pacote de verificação inválido:", @@ -3397,7 +3501,9 @@ "JSON output for scripts": "Saída JSON para scripts", "Jackett works as a proxy server: it translates queries from apps (Sonarr, SickRage, CouchPotato, Mylar, etc) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software. This allows for getting recent uploads (like RSS) and performing searches. Jackett is a single repository of maintained indexer scraping & translation logic - removing the burden from other apps.": "O Jackett funciona como um servidor proxy: traduz consultas de aplicativos (Sonarr, SickRage, CouchPotato, Mylar, etc) em consultas http específicas do site do rastreador, analisa a resposta html e envia os resultados de volta para o software solicitante. Isso permite obter uploads recentes (como RSS) e realizar pesquisas. O Jackett é um único repositório de lógica de raspagem & tradução de indexadores mantidos - removendo a carga de outros aplicativos.", "Jellyfin WebUI": "Jellyfin WebUI", + "Jellyfin configuration already applied:": "Configuração do Jellyfin já aplicada:", "Jellyfin configuration applied:": "Configuração Jellyfin aplicada:", + "Jellyfin configuration updated:": "Configuração do Jellyfin atualizada:", "Jellyfin did not create encoding.xml before the timeout": "Jellyfin não criou coding.xml antes do tempo limite", "Jellyfin has not created encoding.xml in any declared path": "Jellyfin não criou coding.xml em qualquer caminho declarado", "Jellyseerr is a free and open source software application for managing requests for your media library.": "Jellyseerr é um aplicativo de software gratuito e de código aberto para gerenciar pedidos para sua biblioteca de mídia.", @@ -3440,6 +3546,7 @@ "Keep current version (N)": "Manter a versão atual (N)", "Keep current version (N) if modified": "Manter a versão atual (N) se modificada", "Keep in source VM(s) + disable onboot + add to target VM": "Manter na(s) VM(s) de origem + desativar onboot + adicionar à VM de destino", + "Keep the backup taken before the update in this Proxmox storage": "Manter neste armazenamento do Proxmox o backup feito antes da atualização", "Keeping GPU in source VM config": "Mantendo a GPU na configuração da VM de origem", "Keeping the settings changed in Proxmox:": "Manter as configurações alteradas em Proxmox:", "Kept sharedfiles group (has regular users assigned).": "Manteve o grupo sharedfiles (tem usuários regulares atribuídos).", @@ -3506,6 +3613,7 @@ "Language Change": "Mudança de idioma", "Language changed to": "Idioma alterado para", "Language/locale (e.g. es_ES.UTF-8; translation of every application is not guaranteed)": "Língua/locale (por exemplo, es ES.UTF-8; a tradução de cada pedido não é garantida)", + "Language:": "Idioma:", "Last 50 kernel log lines": "Últimas 50 linhas de log do kernel", "Last run:": "Última execução:", "Last system boot time": "Hora da última inicialização do sistema", @@ -3525,6 +3633,7 @@ "Let's review your current network configuration.": "Vamos revisar sua configuração de rede atual.", "Liberate your videos and unleash infinite possibilities.": "Liberte seus vídeos e solte infinitas possibilidades.", "Libraries: /data/media/movies, /data/media/series and /data/media/music. Select them in the media server.": "Bibliotecas: /data/media/movies, /data/media/series e /data/media/music. Selecione-os no servidor de mídia.", + "Library": "Biblioteca", "Library size in GB": "Tamanho da biblioteca em GB", "LibreDB Studio": "LibreDB Studio", "LibreOffice is a free and powerful office suite, and a successor to OpenOffice.org (commonly known as OpenOffice). Its clean interface and feature-rich tools help you unleash your creativity and enhance your productivity.": "LibreOffice é uma suíte de escritório livre e poderosa, e um sucessor do OpenOffice.org (comummente conhecido como OpenOffice). Sua interface limpa e ferramentas ricas em recursos ajudam você a liberar sua criatividade e aumentar sua produtividade.", @@ -3553,6 +3662,7 @@ "List all containers to identify the privileged one:": "Liste todos os contêineres para identificar o privilegiado:", "List all containers to identify the unprivileged one:": "Liste todos os contêineres para identificar aquele sem privilégios:", "List all virtual machines": "Listar todas as máquinas virtuais", + "List applications": "Listar aplicações", "List backups in a specific storage": "Listar backups em um armazenamento específico", "List block devices and partitions": "Listar dispositivos e partições de bloco", "List configured storages:": "Listar armazenamentos configurados:", @@ -3568,6 +3678,13 @@ "Listening ports:": "Portas de escuta:", "Listing relevant CT users and their mapped UID/GID on host...": "Listando usuários CT relevantes e seu UID/GID mapeado no host...", "Load and verify the WireGuard module on the Proxmox host": "Carregar e verificar o módulo WireGuard na máquina Proxmox", + "Loader": "Carregador", + "Loader configured as boot device.": "Carregador configurado como dispositivo de arranque.", + "Loader import failed. No disk detected in config.": "A importação do carregador falhou. Nenhum disco detetado na configuração.", + "Loader import failed. No disk detected.": "A importação do carregador falhou. Nenhum disco detetado.", + "Loader imported successfully to %s": "Carregador importado com êxito para %s", + "Loader storage selection failed or was cancelled.": "A seleção do armazenamento do carregador falhou ou foi cancelada.", + "Loader:": "Carregador:", "Loading modules...": "Carregando módulos...", "Loading the Helper-Scripts catalog...": "Carregando o catálogo Helper-Scripts...", "Loading the host kernel module:": "Carregando o módulo do kernel da máquina:", @@ -3631,16 +3748,20 @@ "Lyrion Music Server is a streaming audio server for Squeezebox audio players.": "Lyrion Music Server é um servidor de áudio de streaming para leitores de áudio Squeezebox.", "M.2 / PCIe devices:": "Dispositivos M.2/PCIe:", "M3U proxy server": "Servidor proxy M3U", + "MAC ADDRESS": "ENDEREÇO MAC", "MAC Address": "Endereço MAC", "MAC address": "Endereço MAC", "MACHINE TYPE": "TIPO DE MÁQUINA", "MAME is a free and open-source emulator designed to emulate the hardware of arcade games, video game consoles, old computers and other systems in software on modern personal computers.": "MAME é um emulador livre e de código aberto projetado para emular o hardware de jogos de arcade, consoles de jogos de vídeo, computadores antigos e outros sistemas em software em computadores pessoais modernos.", "MOTD configuration updated successfully": "Configuração MOTD atualizada com sucesso", "MOTD configuration was already up to date": "a configuração do MOTD já estava atualizada", + "MTU SIZE": "TAMANHO DA MTU", "Machine Type": "Tipo de máquina", + "Machine i440fx": "Máquina i440fx", "Machine learning": "Aprendizagem de máquina", "Machine learning container prepared": "Contêiner de aprendizado de máquina preparado", "Machine learning profile not implemented; it is not replaced by CPU:": "Perfil de aprendizagem de máquina não implementado; não é substituído por CPU:", + "Machine q35": "Máquina q35", "Machine type: q35": "Tipo de máquina: q35", "Machine: q35": "Máquina: q35", "Main endpoint not yet defined": "Endpoint principal ainda não definido", @@ -4086,6 +4207,7 @@ "No Changes Needed": "Nenhuma alteração necessária", "No Cleanup Needed": "Nenhuma limpeza necessária", "No Compose file was given": "Não foi indicado nenhum ficheiro Compose", + "No Compose files were found in the CasaOS catalogue": "Não foram encontrados ficheiros Compose no catálogo do CasaOS", "No Controller/NVMe selected for now.": "Nenhum controlador/NVMe selecionado no momento.", "No Coral Detected": "Nenhum Coral detetado", "No Coral TPU device was found on this host (neither PCIe/M.2 nor USB).": "Nenhum dispositivo Coral TPU foi encontrado neste host (nem PCIe/M.2 nem USB).", @@ -4179,6 +4301,7 @@ "No accessible Samba servers found.": "Nenhum servidor Samba acessível encontrado.", "No accessible exports found.": "Nenhuma exportação acessível encontrada.", "No accessible shares found.": "Nenhum compartilhamento acessível encontrado.", + "No active Debian base repository for this suite; configure it in the Proxmox repository UI before continuing.": "Não existe nenhum repositório base Debian ativo para esta suite; configure-o na interface de repositórios do Proxmox antes de continuar.", "No active Proxmox storage accepts OCI template archives.": "Nenhum armazenamento Proxmox ativo aceita arquivos de modelo OCI.", "No active exports or showmount not available": "Nenhuma exportação ativa ou showmount não disponível", "No active session": "Nenhuma sessão ativa", @@ -4208,12 +4331,14 @@ "No compatible GPUs were detected on this host.": "Nenhuma GPU compatível foi detectada neste host.", "No compatible PVE jobs": "Nenhum trabalho PVE compatível", "No compatible disk images found in:": "Nenhuma imagem de disco compatível encontrada em:", + "No compatible images found in %s\n\nSupported formats: .img, .iso, .qcow2, .vmdk\n\nPlease add some images and try again.": "Não foram encontradas imagens compatíveis em %s\n\nFormatos suportados: .img, .iso, .qcow2, .vmdk\n\nAdicione algumas imagens e tente novamente.", "No configuration issues found": "Nenhum problema de configuração encontrado", "No container of the stack was modified.": "Nenhum recipiente da pilha foi modificado.", "No container runtime available.": "Nenhum tempo de execução do contêiner disponível.", "No container selected. Exiting.": "Nenhum contêiner selecionado. Saindo.", "No controller/NVMe selected.": "Nenhum controlador/NVMe selecionado.", "No controllers remaining after conflict resolution.": "Nenhum controlador restante após a resolução do conflito.", + "No custom image selected": "Nenhuma imagem personalizada selecionada", "No custom key (rely on default SSH config)": "Nenhuma chave personalizada (depende da configuração SSH padrão)", "No custom logos were found in /usr/local/share/fastfetch/logos/.\n\nPlease add a logo and try again.": "Nenhum logotipo personalizado foi encontrado em /usr/local/share/fastfetch/logos/.\n\nAdicione um logotipo e tente novamente.", "No desktop UI backup found, will reinstall packages": "Nenhum backup da UI do desktop encontrado, os pacotes serão reinstalados", @@ -4226,6 +4351,7 @@ "No disks were added.": "Nenhum disco foi adicionado.", "No disks were configured for processing.": "Nenhum disco foi configurado para processamento.", "No disks were selected.": "Nenhum disco foi selecionado.", + "No disks/controllers configured.": "Nenhum disco/controlador configurado.", "No docker run command was given": "Nenhum comando docker run foi informado", "No duplicate IP addresses": "Nenhum endereço IP duplicado", "No duplicate repositories found": "Nenhum repositório duplicado encontrado", @@ -4331,6 +4457,7 @@ "No supported NVIDIA versions found for this GPU": "Nenhuma versão NVIDIA suportada encontrada para esta GPU", "No sysfs ROM entry — trying ACPI VFCT table...": "Nenhuma entrada ROM sysfs - tentando tabela ACPI VFCT...", "No target configured.": "Nenhum destino configurado.", + "No template is available for '{app_id}'": "Não existe nenhum modelo disponível para '{app_id}'", "No test currently running": "Nenhum teste em execução no momento", "No unambiguous loader download found in release metadata.": "Nenhum download inequívoco do carregador foi encontrado nos metadados da versão.", "No uninstaller found for:": "Nenhum desinstalador encontrado para:", @@ -4472,6 +4599,7 @@ "Only one service at a time can be installed this way.": "Dessa forma, só é possível instalar um serviço por vez.", "Only removes storage definition, not remote data.": "Remove apenas a definição de armazenamento, não os dados remotos.", "Only run this if you used LVM (step 6b):": "Execute isso apenas se você usou LVM (etapa 6b):", + "Only the applications that need no question: the ones the cluster keeps a record of": "Apenas as aplicações que não precisam de perguntas: aquelas de que o cluster guarda registo", "Only the host backup hook is removed — PVE vzdump jobs targeting this storage stay intact.": "apenas o gancho de backup do host é removido – as tarefas PVE vzdump direcionadas a esse armazenamento permanecem intactas.", "Only the image reference, with no Compose file": "Apenas a referência da imagem, sem composição do ficheiro", "Only the update of the image runs unattended.": "Somente a atualização da imagem é executada de forma autônoma.", @@ -4485,6 +4613,7 @@ "Open the VM console and wait for the loader to boot": "Abra o console da VM e espere o carregador inicializar", "Open the dashboard from this host on port 8008 to create a new admin account.": "Abra o painel deste host na porta 8008 para criar uma nova conta de administrador.", "Open the dashboard to create a new admin account:": "Abra o painel para criar uma nova conta de administrador:", + "Open the page of an application in the menu": "Abrir a página de uma aplicação no menu", "Open-source AI-powered coding assistant": "Assistente de codificação com código aberto", "Open-source UI for building and debugging multi-agent and RAG applications": "UI de código aberto para a construção e depuração de aplicações multi-agente e RAG", "Open-source self-hosted SQL IDE.": "SQL IDE self-hosted do código aberto.", @@ -4803,6 +4932,7 @@ "Press ENTER to continue...": "Pressione ENTER para continuar...", "Press ENTER to return to the menu...": "Pressione ENTER para retornar ao menu...", "Press ENTER to return...": "Pressione ENTER para retornar...", + "Press Enter to close this terminal...": "Prima Enter para fechar este terminal...", "Press Enter to close...": "pressione Enter para fechar...", "Press Enter to continue": "Pressione Enter para continuar", "Press Enter to continue...": "Pressione Enter para continuar...", @@ -4884,6 +5014,7 @@ "ProxMenux Monitor protection": "Proteção do ProxMenux Monitor", "ProxMenux Monitor unit repaired and restarted": "Unidade ProxMenux Monitor reparada e reiniciada", "ProxMenux Monitor → Backups tab (live progress card with estimated time, logs, rollback delta)": "ProxMenux Monitor → guia Backups (cartão de progresso ao vivo com tempo estimado, logs, delta de reversão)", + "ProxMenux OCI manager Apps (Technology Preview)": "ProxMenux OCI manager Apps (Technology Preview)", "ProxMenux attaches directories, not single files, so this image cannot be installed yet.": "ProxMenux atribui diretórios, não arquivos únicos, então esta imagem ainda não pode ser instalada.", "ProxMenux can apply open permissions on this NFS directory from the host so the container can read and write:": "ProxMenux pode aplicar permissões abertas neste diretório NFS do host para que o contêiner possa ler e escrever:", "ProxMenux can remount it with open permissions so any LXC can read and write.": "ProxMenux pode remontá-lo com permissões abertas para que qualquer LXC possa ler e escrever.", @@ -4903,9 +5034,13 @@ "Proxmology logo applied": "Logotipo da Proxmologia aplicado", "Proxmox 9 system update allready": "Atualização do sistema Proxmox 9 já", "Proxmox APT repositories configured": "repositórios Proxmox APT configurados", + "Proxmox APT repository inventory is invalid or reports parse errors. Fix sources in {ui}; no repository changed.": "O inventário de repositórios APT do Proxmox é inválido ou indica erros de análise. Corrija as origens em {ui}; nenhum repositório foi alterado.", "Proxmox Backup Server": "Proxmox Backup Server", "Proxmox Backup Server (PBS) destinations": "Destinos Proxmox Backup Server (PBS)", "Proxmox Backup Server APT repositories configured": "Repositórios APT do Proxmox Backup Server configurados", + "Proxmox Backup Server Microcode": "Proxmox Backup Server Microcode", + "Proxmox Backup Server Post Install": "Pós-instalação do Proxmox Backup Server", + "Proxmox Backup Server Subscription Banner Removal": "Remoção do banner de subscrição do Proxmox Backup Server", "Proxmox Backup Server Update": "Atualização do Proxmox Backup Server", "Proxmox Backup Server update completed.": "Atualização do Proxmox Backup Server concluída.", "Proxmox CIFS Storage Status:": "Status de armazenamento CIFS do Proxmox:", @@ -4927,6 +5062,7 @@ "Proxmox iSCSI Storage Status:": "Status de armazenamento iSCSI do Proxmox:", "Proxmox jail configured": "Prisão Proxmox configurada", "Proxmox local storages:": "Armazenamentos locais Proxmox:", + "Proxmox no-subscription standard repository handle unavailable; no repository changed.": "Identificador do repositório padrão no-subscription do Proxmox indisponível; nenhum repositório foi alterado.", "Proxmox repository": "Repositório Proxmox", "Proxmox repository OK (candidate is 9.x)": "Repositório Proxmox OK (o candidato é 9.x)", "Proxmox repository configuration completed": "Configuração do repositório Proxmox concluída", @@ -4994,6 +5130,7 @@ "Rclone mount needs a privileged LXC with FUSE access. The container is dedicated to Rclone and its web UI must not be exposed to untrusted networks.": "A montagem Rclone precisa de um LXC privilegiado com acesso FUSE. O contêiner é dedicado à Rclone e sua interface web não deve ser exposta a redes não confiáveis.", "Rclone mount requires a privileged LXC with FUSE access. Use this profile only on a trusted node and network.": "Rclone mount requires um LXC privilegiado com acesso FUSE. Use este perfil apenas em um nó e rede confiáveis.", "Rclone mount requires a privileged container": "Rclone mount requires um recipiente privilegiado", + "Rclone remote": "Remote do Rclone", "Re-enter the BORG REPOKEY passphrase to confirm:": "Digite novamente a senha do BORG REPOKEY para confirmar:", "Re-running pre-check after repairs...": "Executando novamente a pré-verificação após os reparos...", "Reachable": "Acessível", @@ -5017,6 +5154,7 @@ "Reading SMART self-test log...": "Lendo o registro de autoteste SMART...", "Reading full SMART report...": "Lendo o relatório SMART completo...", "Reading image metadata. Please wait...": "Lendo metadados de imagem. Por favor, aguarde...", + "Ready to create a %s?": "Pronto para criar uma %s?", "Real-time Performance Monitoring": "Monitoramento de desempenho em tempo real", "Real-time bandwidth usage (press q to exit)": "Uso de largura de banda em tempo real (pressione q para sair)", "Real-time collaborative document editor": "Editor de documentos colaborativos em tempo real", @@ -5099,15 +5237,19 @@ "Recreation prepared": "Recreação preparada", "Refresh APT index and verify repositories:": "Atualize o índice APT e verifique os repositórios:", "Refresh the configured APT repositories and review the PBS package upgrade? Repository files will be preserved.": "Atualizar os índices dos repositórios APT configurados e rever a atualização de pacotes PBS? Os ficheiros dos repositórios serão preservados.", + "Refresh the index from the image sources": "Atualizar o índice a partir das origens de imagens", "Refresh token of the connector, from the Twingate admin console": "Token de atualização do conector, no console administrativo Twingate", "Refresh your browser (Ctrl+Shift+R) to see changes": "Atualize seu navegador (Ctrl+Shift+R) para ver as alterações", "Refresh your browser to see changes (server restart may be required)": "Atualize seu navegador para ver as alterações (pode ser necessário reiniciar o servidor)", "Refreshing apt cache...": "Atualizando o cache do apt...", "Refreshing the NVIDIA runtime...": "Atualizando o tempo de execução NVIDIA...", "Refusing an unexpected rootfs path:": "Recusando um caminho inesperado do rootfs:", + "Regenerate the catalog templates": "Regenerar os modelos do catálogo", + "Regenerate the template of one application": "Regenerar o modelo de uma aplicação", "Regenerating PVE package cache...": "Regenerando cache de pacotes PVE...", "Regenerating boot artifacts for the merged kernel-agnostic changes...": "Regenerando artefatos de inicialização para as alterações independentes do kernel mescladas...", "Regenerating certificates and restarting services...": "Gerando novamente certificados e reiniciando serviços...", + "Register again the OCI applications restored from a backup": "Registar novamente as aplicações OCI restauradas a partir de um backup", "Register mount path in Proxmox:": "Registre o caminho de montagem no Proxmox:", "Registering disk as Proxmox storage...": "Registrando disco como armazenamento Proxmox...", "Registering module with DKMS...": "Registrando módulo com DKMS...", @@ -5294,6 +5436,7 @@ "Resetting time synchronization...": "Redefinindo a sincronização de horário...", "Residual Bookworm entries commented where applicable": "Entradas residuais do Bookworm comentadas quando aplicável", "Resilio-sync (formerly BitTorrent Sync) uses the BitTorrent protocol to sync files and folders between all of your devices. There are both free and paid versions, this container supports both. There is an official sync image but we created this one as it supports user mapping to simplify permissions for volumes.": "Resilio-sync (anteriormente BitTorrent Sync) usa o protocolo BitTorrent para sincronizar arquivos e pastas entre todos os seus dispositivos. Existem versões gratuitas e pagas, este recipiente suporta ambas. Há uma imagem de sincronização oficial, mas nós criamos este como ele suporta o mapeamento do usuário para simplificar permissões para volumes.", + "Resolve catalog icons against the jsdelivr icon sets": "Resolver os ícones do catálogo com os conjuntos de ícones do jsdelivr", "Resolve package conflicts": "Resolver conflitos de pacotes", "Resources": "Recursos", "Restart Network": "Reiniciar rede", @@ -5352,6 +5495,7 @@ "Results:": "Resultados:", "Retention": "Retenção", "Retention policy (prune-backups syntax).": "Política de retenção (sintaxe de remoção de backups).", + "Retrieving the URL for the %s loader": "A obter o URL do carregador %s", "RetroArch is a frontend for emulators, game engines and media players. It enables you to run classic games on a wide range of computers and consoles through its slick graphical interface.": "RetroArch é uma interface para emuladores, motores de jogo e media players. Ele permite que você execute jogos clássicos em uma ampla gama de computadores e consoles através de sua interface gráfica liso.", "Return": "Retornar", "Return to Main Menu": "Retornar ao menu principal", @@ -5431,6 +5575,9 @@ "SCSI (recommended for Linux)": "SCSI (recomendado para Linux)", "SECURITY CONSIDERATIONS:": "CONSIDERAÇÕES DE SEGURANÇA:", "SECURITY WARNING:": "AVISO DE SEGURANÇA:", + "SELECT CUSTOM IMAGE": "SELECIONAR IMAGEM PERSONALIZADA", + "SELECT LOADER": "SELECIONAR CARREGADOR", + "SETTINGS": "DEFINIÇÕES", "SMART Action": "Ação SMART", "SMART Disk Health & Test": "Integridade e teste do disco SMART", "SMART health status: PASSED": "Status de saúde SMART: APROVADO", @@ -5456,6 +5603,7 @@ "SSH protection (aggressive mode)": "Proteção SSH (modo agressivo)", "STEP 6: Choose commands based on your storage type": "PASSO 6: Escolha comandos com base no seu tipo de armazenamento", "STEP 9: Cleanup (LVM only)": "PASSO 9: Limpeza (somente LVM)", + "STORAGE PLAN": "PLANO DE ARMAZENAMENTO", "STORAGE TYPE IDENTIFICATION:": "IDENTIFICAÇÃO DO TIPO DE ARMAZENAMENTO:", "SUGGESTION FOR": "SUGESTÃO PARA", "SWAG serves HTTPS on port 443. Plain HTTP on port 80 is disabled in /config/nginx/site-confs/default.conf.": "SWAG serve HTTPS na porta 443. HTTP simples na porta 80 está desativado em /config/nginx/site-confs/default.conf.", @@ -5536,6 +5684,7 @@ "Scheduled backup job created": "Tarefa de backup agendada criada", "Scheduled backup jobs": "Tarefas de backup agendadas", "Scheduled backups and retention policies": "Backups agendados e políticas de retenção", + "Scheduled run: no questions; stops where a person has to decide": "Execução agendada: sem perguntas; detém-se onde uma pessoa tiver de decidir", "Scheduled tasks (cron)": "Tarefas agendadas (cron)", "Scheduler script not found:": "Script do agendador não encontrado:", "ScreenScraper": "ScreenScraper", @@ -5545,6 +5694,7 @@ "Script not found:": "Script não encontrado:", "Scripts in": "Scripts em", "ScummVM is a program which allows you to run certain classic graphical adventure and role-playing games, provided you already have their data files. The clever part about this: ScummVM just replaces the executables shipped with the games, allowing you to play them on systems for which they were never designed! ScummVM is a complete rewrite of these games' executables and is not an emulator.": "ScummVM é um programa que permite que você execute certos jogos clássicos de aventura gráfica e RPG, desde que você já tenha seus arquivos de dados. A parte inteligente sobre isso: ScummVM apenas substitui os executáveis enviados com os jogos, permitindo que você jogá-los em sistemas para os quais eles nunca foram projetados! ScummVM é uma reescrita completa dos executáveis desses jogos e não é um emulador.", + "SeaBIOS (Legacy)": "SeaBIOS (Legado)", "Sealskin is a self-hosted, client-server platform that enables users to run powerful, containerized desktop applications streamed directly to a web browser. It uses a browser extension to intercept user actions—such as clicking a link or downloading a file and redirects them to a secure, isolated application environment running on a remote server.": "Sealskin é uma plataforma auto-hospedada, cliente-servidor que permite aos usuários executar aplicativos de desktop poderosos e containerizados transmitidos diretamente para um navegador web. Ele usa uma extensão do navegador para interceptar ações do usuário, como clicar em um link ou baixar um arquivo e redirecioná-los para um ambiente de aplicação seguro e isolado rodando em um servidor remoto.", "Search": "Pesquisar", "Search Results for:": "Resultados da pesquisa para:", @@ -5730,6 +5880,7 @@ "Selected GPU(s)": "GPU(s) selecionada(s)", "Selected GPU(s):": "GPU(s) selecionada(s):", "Selected LXC action": "Ação LXC selecionada", + "Selected Loader:": "Carregador selecionado:", "Selected VM": "VM selecionada", "Selected VM action": "Ação de VM selecionada", "Selected bridge:": "Ponte selecionada:", @@ -5895,6 +6046,7 @@ "Show standard exclude patterns": "Mostrar padrões de exclusão padrão", "Show status of all storage pools": "Mostrar o status de todos os pools de armazenamento", "Show the QR code of a peer again with: pct exec -- /app/show-peer 1": "Mostrar o código QR de um par novamente com: pct exec -- /app/show-peer 1", + "Show the summary of a template": "Mostrar o resumo de um modelo", "Show traffic statistics per interface": "Mostrar estatísticas de tráfego por interface", "Show vzdump backup configuration": "Mostrar configuração de backup do vzdump", "Shows status and type (nfs/cifs/dir/iscsi...).": "Mostra status e tipo (nfs/cifs/dir/iscsi...).", @@ -6001,6 +6153,7 @@ "Start VM": "Iniciar VM", "Start VM after creation": "Inicie a VM após a criação", "Start VM after creation?": "Iniciar VM após a criação?", + "Start VM when completed:": "Iniciar a VM no fim:", "Start a container. Use the correct ": "Inicie um contêiner. Use o correto", "Start a virtual machine. Use the correct ": "Inicie uma máquina virtual. Use o correto", "Start each LXC with Proxmox (no coordinated startup)": "Iniciar cada LXC com Proxmox (sem arranque coordenado)", @@ -6030,6 +6183,7 @@ "Starting": "Início", "Starting Borg backup...": "Iniciando backup do Borg...", "Starting CT": "Iniciando TC", + "Starting ISO conversion...": "A iniciar a conversão ISO...", "Starting LXC Privileged to Unprivileged conversion process...": "Iniciando o processo de conversão LXC privilegiado para não privilegiado...", "Starting LXC Unprivileged to Privileged conversion process...": "Iniciando o processo de conversão de LXC sem privilégios para privilegiados...", "Starting NVIDIA installer. This may take several minutes...": "Iniciando o instalador NVIDIA. Isso pode levar vários minutos...", @@ -6137,6 +6291,7 @@ "Subscription banner removal failed": "falha na remoção do banner de assinatura", "Subscription banner removed successfully": "Banner de assinatura removido com sucesso", "Subscription banner restored successfully (desktop and mobile)": "Banner de assinatura restaurado com sucesso (desktop e celular)", + "Subscription status is not unambiguously active, notfound or expired. Check proxmox-backup-manager subscription get locally; no repository changed.": "O estado da subscrição não é inequivocamente active, notfound ou expired. Verifique localmente com proxmox-backup-manager subscription get; nenhum repositório foi alterado.", "Success": "Sucesso", "Successful": "Bem-sucedido", "Supervisor does not confirm healthy and supported yet": "Supervisor ainda não confirma saudável e apoiado", @@ -6164,6 +6319,7 @@ "Synchronize time automatically": "sincronizar a hora automaticamente", "Synclounge is a third party tool that allows you to watch Plex in sync with your friends/family, wherever you are.": "Synclounge é uma ferramenta de terceiros que permite que você assista Plex em sincronia com seus amigos/família, onde quer que você esteja.", "Syncthing replaces proprietary sync and cloud services with something open, trustworthy and decentralized. Your data is your data alone and you deserve to choose where it is stored, if it is shared with some third party and how it's transmitted over the Internet.": "O Syncthing substitui serviços de sincronização e nuvem proprietários por algo aberto, confiável e descentralizado. Seus dados são apenas seus dados e você merece escolher onde são armazenados, se forem compartilhados com algum terceiro e como são transmitidos pela Internet.", + "Synology VM Creator": "Criador de VM Synology", "Sysctl not namespaced or not valid:": "Sysctl não espaçado ou não válido:", "System": "Sistema", "System CLI Tools": "Ferramentas CLI do sistema", @@ -6185,6 +6341,7 @@ "System path mounts are not yet supported": "As montagens do caminho do sistema ainda não são suportadas", "System reboot required": "Reinicialização do sistema necessária", "System upgrade completed": "Atualização do sistema concluída", + "System upgrade failed. Check log:": "A atualização do sistema falhou. Consulte o registo:", "System uptime": "Tempo de atividade do sistema", "Systemd ulimits set": "Conjunto de limites do Systemd", "TCP BBR configuration created successfully": "Configuração TCP BBR criada com sucesso", @@ -6249,10 +6406,13 @@ "The Bookmark Everything App": "A aplicação Tudo do Favorito", "The Brave browser is a fast, private and secure web browser for PC, Mac and mobile.": "O navegador Brave é um navegador web rápido, privado e seguro para PC, Mac e móvel.", "The CT already exists:": "O CT já existe:", + "The Compose document must be a mapping.": "O documento Compose deve ser um mapeamento.", "The Compose file declares no service": "O arquivo Compose não declara nenhum serviço", "The Compose file describes several images:": "O arquivo Compose descreve várias imagens:", "The Compose file describes several services:": "O arquivo Compose descreve vários serviços:", "The Compose file does not contain a Compose document": "O arquivo Compose não contém um documento Compose", + "The Compose file has no services.": "O ficheiro Compose não tem serviços.", + "The Compose file has no x-casaos metadata.": "O ficheiro Compose não tem metadados x-casaos.", "The Compose file is not valid YAML:": "O arquivo Compose não é válido 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.": "O Compose oferece um relaxamento opcional AppArmor ou seccomp; ele ficará desativado a menos que o usuário o selecione. Continue apenas se você confiar na imagem e aceitar este risco.", "The Compose value must be text or a list:": "O valor Compose deve ser texto ou uma lista:", @@ -6302,9 +6462,11 @@ "The PostgreSQL volume needs at least 4 GB": "O volume PostgreSQL precisa de pelo menos 4 GB", "The PostgreSQL volume needs at least 8 GB": "O volume PostgreSQL precisa de pelo menos 8 GB", "The ProxMenux Monitor update checker is not available. Start or update ProxMenux Monitor and try again.": "O verificador de atualizações do ProxMenux Monitor não está disponível. Inicie ou atualize o ProxMenux Monitor e tente novamente.", + "The ProxMenux application catalogue is not a list": "O catálogo de aplicações do ProxMenux não é uma lista", "The Proxmox VE 8 update did not finish. The upgrade to Proxmox VE 9 was not started.": "A atualização do Proxmox VE 8 não terminou. A atualização para o Proxmox VE 9 não foi iniciada.", "The Proxmox archive keyring is missing; Ceph installation cannot continue safely": "O chaveiro de arquivo Proxmox está faltando;A instalação do Ceph não pode continuar com segurança", "The Proxmox inventory and the local configurations differ": "O inventário Proxmox e as configurações locais diferem", + "The README has no recognisable docker-compose section": "O README não tem nenhuma secção docker-compose reconhecível", "The ROCm image has no support for the AMD GPU of this host:": "A imagem ROCm não tem suporte para a GPU AMD deste host:", "The ROCm image of this application has no support for the AMD GPU of this host:": "A imagem ROCm desta aplicação não tem suporte para a GPU AMD deste host:", "The Rclone configuration needs at least 1 GB": "A configuração Rclone precisa de pelo menos 1 GB", @@ -6341,6 +6503,8 @@ "The administrator email is not valid": "O e- mail do administrador não é válido", "The administrator user contains characters that are not allowed": "O usuário administrador contém caracteres que não são permitidos", "The all-in-one AI application.": "A aplicação de IA tudo-em-um.", + "The application '{app_id}' does not come from LinuxServer": "A aplicação '{app_id}' não provém do LinuxServer", + "The application '{app_id}' is not in the index": "A aplicação '{app_id}' não está no índice", "The application configuration needs a first start to complete.": "A configuração do aplicativo precisa de um primeiro começo para completar.", "The application could not be modified:": "O aplicativo não pôde ser modificado:", "The application could not be recovered:": "O aplicativo não pôde ser recuperado:", @@ -6370,6 +6534,7 @@ "The backup was taken on a different PVE or kernel major.minor. These paths will be SKIPPED to keep the boot safe:": "O backup foi feito em um PVE ou kernel major.minor diferente. Esses caminhos serão SKIPPED para manter a inicialização segura:", "The bind mount target escapes the rootfs:": "O alvo de montagem de ligação escapa aos rootfs:", "The block device does not exist:": "O dispositivo de bloqueio não existe:", + "The block found does not look like a Docker Compose file": "O bloco encontrado não parece um ficheiro Docker Compose", "The build could not be checked beforehand; continuing without that check.": "A compilação não pôde ser verificada antecipadamente;continuando sem essa verificação.", "The cached image does not match the current digest": "A imagem em cache não corresponde à digest atual", "The cached image is damaged; it will be downloaded again.": "A imagem em cache está danificada; será transferida novamente.", @@ -6454,6 +6619,8 @@ "The disk size cannot be reproduced": "O tamanho do disco não pode ser reproduzido", "The disk usage of the container could not be read": "Não foi possível ler o uso do disco do recipiente", "The disks of the failed attempt could not be removed and stay in the temporary container:": "Os discos da tentativa fracassada não puderam ser removidos e permanecem no contêiner temporário:", + "The docker-compose block is not closed": "O bloco docker-compose não está fechado", + "The docker-compose section contains no code block": "A secção docker-compose não contém nenhum bloco de código", "The domain must resolve to the public address of this network before the certificate can be issued.": "O domínio deve ser resolvido para o endereço público desta rede antes que o certificado possa ser emitido.", "The download client still needs to be configured.": "O cliente de download ainda precisa ser configurado.", "The download stopped progressing; cancelling this attempt.": "O download parou de progredir; cancelando esta tentativa.", @@ -6487,6 +6654,7 @@ "The fstab entry will still be removed; reboot or manual umount needed.": "A entrada fstab ainda será removida; reinicialização ou desmontagem manual necessária.", "The gateway must be another usable address in the same subnet.": "O gateway deve ser outro endereço utilizável na mesma subrede.", "The gateway should appear in your Tailscale admin console shortly.": "O gateway deve aparecer em seu console de administração Tailscale em breve.", + "The generated template does not match the schema:": "O modelo gerado não corresponde ao esquema:", "The guest access test did not succeed.": "O teste de acesso de convidado não foi bem-sucedido.", "The healthcheck cannot run without an IP address": "A verificação de saúde não pode ser executada sem um endereço IP", "The host NVIDIA driver is not responding correctly": "O driver NVIDIA da máquina não está respondendo corretamente", @@ -6564,6 +6732,8 @@ "The long test runs directly on the disk hardware.": "O teste longo é executado diretamente no hardware do disco.", "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.": "O contêiner de aprendizado de máquina é reconstruído com a imagem da nova escolha. Seu cache de modelo, a biblioteca e o banco de dados são mantidos. Todo o aplicativo é interrompido e atualizado, como em uma atualização. Se a operação falhar após a alteração de um contêiner, os contêineres anteriores e a escolha anterior serão restaurados. Uma operação que pára no meio é recuperada no menu de gerenciamento 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.": "O contêiner de aprendizado de máquina é reconstruído com a imagem da nova escolha. Seu cache de modelo, a biblioteca e o banco de dados são mantidos. Toda a aplicação é parada e atualizada, como numa atualização; se algo falhar, os contêineres anteriores e a escolha anterior serão restaurados.", + "The main Compose service cannot be identified unambiguously": "Não é possível identificar de forma inequívoca o serviço principal do Compose", + "The main Compose service has no image.": "O serviço principal do Compose não tem imagem.", "The main container of this application is not on this host. Restore it too.": "O contêiner principal deste aplicativo não está neste host. Restaure-o também.", "The main member must stop first and start last": "O membro principal deve parar primeiro e começar por último", "The main member of the stack is missing": "Falta o membro principal da pilha", @@ -6877,6 +7047,7 @@ "This guarantees that device nodes are available before applying LXC GPU config.": "Isso garante que os nós do dispositivo estejam disponíveis antes de aplicar a configuração da GPU LXC.", "This host architecture is not supported by the OCI image importer.": "Esta arquitetura de host não é suportada pelo importador de imagens OCI.", "This host has no active subscription, switch to the no-subscription repository? The inaccessible Enterprise PVE source will be disabled. Enterprise Ceph sources, if present, will be disabled without choosing a replacement Ceph channel; configure Ceph separately if needed.": "Este host não tem assinatura ativa, mudar para o repositório sem assinatura? A fonte Enterprise PVE inacessível será desativada. As fontes Enterprise Ceph, se presentes, serão desativadas sem a escolha de um canal substituto do Ceph; configure o Ceph separadamente, se necessário.", + "This host runs {name} on {suite}, but these {name} repositories are for another suite: {details}. Disable or remove them in {ui} and run the update again; no repository changed.": "Este host executa {name} em {suite}, mas estes repositórios {name} são de outra suite: {details}. Desative-os ou elimine-os em {ui} e execute a atualização novamente; nenhum repositório foi alterado.", "This image cannot be installed as it is described:": "Esta imagem não pode ser instalada como está descrita:", "This image has no compatible Linux image for this host ({architecture}).": "Esta imagem não possui imagem Linux compatível para este host ({architecture}).", "This image requires the host module": "Esta imagem requires o módulo da máquina", @@ -6947,6 +7118,7 @@ "This will add the mount to /etc/fstab so it persists after reboot.": "Isso adicionará a montagem ao /etc/fstab para que persista após a reinicialização.", "This will completely remove Fail2Ban and its configuration. Continue?": "Isso removerá completamente o Fail2Ban e sua configuração. Continuar?", "This will completely remove Lynis from the system. Continue?": "Isso removerá completamente Lynis do sistema. Continuar?", + "This will create a New %s. Proceed?": "Isto irá criar uma nova %s. Continuar?", "This will create a new VM": "Isso criará uma nova VM", "This will deploy a Tailscale VPN gateway for secure remote access.": "Isso implantará um gateway VPN Tailscale para acesso remoto seguro.", "This will install and configure Fail2Ban with:": "Isto irá instalar e configurar o Fail2Ban com:", @@ -7053,6 +7225,8 @@ "Umbrel OS installer script by Helper Scripts\n\nVisit the GitHub repo to learn more, contribute, or support the project:\n\nhttps://community-scripts.github.io/ProxmoxVE/scripts?id=umbrel-os-vm": "Script de instalação do Umbrel OS por Helper Scripts\n\nVisite o repositório GitHub para saber mais, contribuir ou apoiar o projeto:\n\nhttps://community-scripts.github.io/ProxmoxVE/scripts?id=umbrel-os-vm", "Unable to detect Proxmox version": "Não foi possível detectar a versão do Proxmox", "Unable to detect Proxmox version.": "Não foi possível detectar a versão do Proxmox.", + "Unable to detect a valid storage location for EFI disk.": "Não é possível detetar um local de armazenamento válido para o disco EFI.", + "Unable to detect a valid storage location.": "Não é possível detetar um local de armazenamento válido.", "Unable to determine the installed memory.": "Não é possível determinar a memória instalada.", "Unable to identify the root filesystem. Aborting.": "Não foi possível identificar o sistema de arquivos raiz. Abortando.", "Unable to resolve system ZFS pool disks. Aborting.": "Não foi possível resolver os discos do pool ZFS do sistema. Abortando.", @@ -7156,6 +7330,7 @@ "Unsupported OCI digest:": "Digerir OCI não suportado:", "Unsupported OCI-LXC AppArmor profile:": "Perfil do AppArmor OCI-LXC não suportado:", "Unsupported OCI-LXC seccomp profile:": "Perfil OCI-LXC seccomp não suportado:", + "Unsupported Proxmox suite; no repository changed.": "Suite do Proxmox não suportada; nenhum repositório foi alterado.", "Unsupported Terminal": "Terminal não suportado", "Unsupported architecture for Figurine:": "Arquitetura não suportada pelo Figurine:", "Unsupported architecture:": "Arquitetura não suportada:", @@ -7167,6 +7342,7 @@ "Unsupported device type:": "Tipo de dispositivo não suportado:", "Unsupported dynamic NVIDIA capabilities:": "Capacidades NVIDIA dinâmicas não suportadas:", "Unsupported format. Only .ova and .ovf files are supported.": "Formato não suportado. Somente arquivos .ova e .ovf são suportados.", + "Unsupported host architecture:": "Arquitetura do host não suportada:", "Unsupported kept setting:": "configuração mantida não suportada:", "Unsupported media storage mode:": "Modo de armazenamento de mídia não suportado:", "Unsupported mount options": "opções de montagem não suportadas", @@ -7214,6 +7390,8 @@ "Update completed. Press Enter to continue...": "Atualização concluída. Pressione Enter para continuar...", "Update credentials": "Atualizar credenciais", "Update every container of the application": "Atualizar cada recipiente do aplicativo", + "Update for %s completed.": "Atualização de %s concluída.", + "Update for %s exited with status %s.": "A atualização de %s terminou com o estado %s.", "Update kernel to compatible version": "Atualize o kernel para uma versão compatível", "Update now?": "Actualizar agora?", "Update package index:": "Atualizar índice do pacote:", @@ -7222,6 +7400,7 @@ "Update system to latest PVE 8.4+ (if not done already):": "Atualize o sistema para o PVE 8.4+ mais recente (se ainda não tiver feito):", "Update the image with the saved configuration": "Atualizar a imagem com a configuração salva", "Update the whole stack?": "Atualizar toda a pilha?", + "Update, modify or recreate one installed OCI instance": "Atualizar, modificar ou recriar uma instância OCI instalada", "Updated": "Atualizado", "Updated sharedfiles group to GID: 101000": "Grupo de arquivos compartilhados atualizado para GID: 101000", "Updated stack checked": "Stack atualizado verificado", @@ -7233,6 +7412,7 @@ "Updates available": "Atualizações disponíveis", "Updates file is empty or unreadable.": "O arquivo de atualizações está vazio ou ilegível.", "Updating": "Actualização", + "Updating %s (running %s from %s flow)...": "A atualizar %s (a executar %s do fluxo %s)...", "Updating APT package lists...": "Atualizando listas de pacotes APT...", "Updating Debian Bookworm → Trixie in sources.list...": "A atualizar Debian Bookworm → Trixie em sources.list...", "Updating Figurine binary...": "Atualizando o binário da estatueta...", @@ -7333,7 +7513,20 @@ "Username on the Borg server that runs \"borg serve\" (typically \"borg\"). This is NOT the admin/root user of the server — that one is asked later only if you choose \"Generate a new key and authorize it\".": "Nome de usuário no servidor Borg que executa \"borg serve\" (normalmente \"borg\").Este NÃO é o usuário administrador/root do servidor - esse será solicitado posteriormente apenas se você escolher \"Gerar uma nova chave e autorizá-la\".", "Username:": "Nome de usuário:", "Users:": "Usuários:", + "Using Advanced Settings": "A utilizar definições avançadas", + "Using BIOS Type:": "A utilizar o tipo de BIOS:", + "Using Bridge:": "A utilizar a bridge:", + "Using CPU Model:": "A utilizar o modelo de CPU:", + "Using Custom Image:": "A utilizar a imagem personalizada:", + "Using Default Settings": "A utilizar definições predefinidas", + "Using Hostname:": "A utilizar o nome de anfitrião:", + "Using Interface MTU Size:": "A utilizar o tamanho da MTU da interface:", + "Using MAC Address:": "A utilizar o endereço MAC:", + "Using Machine Type:": "A utilizar o tipo de máquina:", "Using UUID is recommended over /dev/sdX.": "O uso de UUID é recomendado em /dev/sdX.", + "Using VLAN:": "A utilizar a VLAN:", + "Using Virtual Machine ID:": "A utilizar o ID da máquina virtual:", + "Using Vlan:": "A utilizar a Vlan:", "Using advanced configuration": "Usando configuração avançada", "Using default Proxmox logo...": "Usando o logotipo padrão do Proxmox...", "Using existing encryption key:": "Usando a chave de criptografia existente:", @@ -7357,6 +7550,8 @@ "VFIO orphans cleared and initramfs rebuilt — next boot will free the GPU.": "órfãos VFIO limpos e initramfs reconstruídos – a próxima inicialização irá liberar a GPU.", "VFIO orphans cleared but initramfs rebuild failed; check /var/log/proxmenux logs.": "órfãos VFIO eliminados, mas a reconstrução do initramfs falhou;verifique os logs /var/log/proxmenux.", "VFS cache mode": "Modo de cache VFS", + "VIRTUAL DISK": "DISCO VIRTUAL", + "VIRTUAL MACHINE ID": "ID DA MÁQUINA VIRTUAL", "VLAN": "VLAN", "VLC Media Player is a free and open source cross-platform multimedia player and framework that delivers dependable performance across multiple devices.": "Mídia VLC O Player é um player multiplataforma multiplataforma gratuito e aberto que oferece desempenho confiável em vários dispositivos.", "VM": "VM", @@ -7368,6 +7563,7 @@ "VM Storage (images, backup)": "Armazenamento VM (imagens, backup)", "VM and CT Management Commands": "Comandos de gerenciamento de VM e CT", "VM and CT backup jobs (Datacenter > Backup)": "Tarefas de backup VM e CT (Datacenter > Backup)", + "VM created with errors. Check configuration.": "VM criada com erros. Verifique a configuração.", "VM creation cancelled before disk planning.": "A criação da VM foi cancelada antes do planejamento do disco.", "VM creation cancelled by user.": "Criação de VM cancelada pelo usuário.", "VM creation completed": "Criação de VM concluída", @@ -7461,6 +7657,7 @@ "Virtual Function": "Função virtual", "Virtual Function (parent PF:": "Função Virtual (PF pai:", "Virtual Machine ID": "ID da máquina virtual", + "Virtual Machine ID:": "ID da máquina virtual:", "Virtual disk": "Disco virtual", "Virtual disks": "Discos virtuais", "Virtual display already set to": "Exibição virtual já configurada para", @@ -7477,6 +7674,7 @@ "Volume configuration cancelled": "Configuração do volume cancelada", "Volume options are not yet supported": "As opções de volume ainda não são suportadas", "Volume size in GB": "Tamanho do volume em GB", + "Volumes": "Volumes", "Volumes attached": "Volumes anexados", "Volumes prepared for the first start:": "Volumes preparados para o primeiro início:", "Volumes shared between services are not yet supported": "Volumes compartilhados entre serviços ainda não são suportados", @@ -7677,6 +7875,7 @@ "ZRAM profile removed, but package purge failed": "Perfil ZRAM removido, mas falha na limpeza do pacote", "ZRAM still holds pages; configuration was preserved": "Mensagem técnica para Proxmox e TI.Traduza: ZRAM ainda contém páginas; configuração foi preservada", "ZRAM still holds pages; profile remains active": "Mensagem técnica para Proxmox e TI.Traduza: ZRAM ainda contém páginas; perfil permanece ativo", + "ZRAM swap profile": "Perfil de swap ZRAM", "ZRAM swap profile enabled": "Perfil de troca ZRAM ativado", "ZRAM swap profile removed": "Perfil de troca ZRAM removido", "ZSTD - fast, good ratio (recommended)": "ZSTD - proporção rápida e boa (recomendado)", @@ -7743,6 +7942,7 @@ "chmod 1777 + setfacl o::rwx (applied on the NFS share from this host)": "chmod 1777 + setfacl o::rwx (aplicado no compartilhamento NFS deste host)", "chmod failed — NFS server may be restricting changes from root": "chmod falhou — O servidor NFS pode estar restringindo alterações do root", "chown/chmod failed — likely unprivileged CT against host bind mount. Falling back to ACL.": "chown/chmod falhou — provavelmente CT sem privilégios contra montagem de ligação do host. Voltando ao ACL.", + "clone source mount tree": "clonar a árvore de montagem de origem", "containers": "recipientes", "containers of": "Contentores de", "content:": "contente:", @@ -7782,6 +7982,7 @@ "driver:": "driver:", "e.g.": "Por exemplo:", "empty = generate": "vazio = gerar", + "enter container namespace": "entrar no namespace do contentor", "exFAT (portable: Windows/Linux/macOS)": "exFAT (portátil: Windows/Linux/macOS)", "exFAT tools installed successfully.": "Ferramentas exFAT instaladas com sucesso.", "experimental on this GPU": "experimental nesta GPU", @@ -7814,10 +8015,12 @@ "fstab entry exists": "existe entrada fstab", "fstab line:": "linha fstab:", "fstab references UUIDs/devices not present on this host:": "fstab faz referência a UUIDs/dispositivos não presentes neste host:", + "function '%s' is not defined in the %s flow.": "a função '%s' não está definida no fluxo %s.", "gasket DKMS entries removed.": "Entradas DKMS de gasket removidas.", "gasket-dkms has been fully removed from this system.": "gasket-dkms foi totalmente removido deste sistema.", "gasket-dkms is still reported by dpkg in state:": "gasket-dkms ainda é indicado pelo dpkg no estado:", "gawk installed": "gawk instalado", + "genisoimage/mkisofs not found.": "genisoimage/mkisofs não encontrado.", "go2rtc WebUI": "go2rtc WebUI", "google/gasket-driver cloned (fallback — will apply local patches).": "google/gasket-driver clonado (substituto – aplicará patches locais).", "gpg not found; trying apt-key fallback": "gpg não encontrado; tentando substituto do apt-key", @@ -7861,6 +8064,7 @@ "individual template is blocked": "o modelo individual está bloqueado", "initramfs updated": "initramfs atualizado", "initramfs updated.": "initramfs atualizado.", + "installable": "instalável", "installed": "instalado", "installed but command not immediately available": "instalado, mas o comando não está imediatamente disponível", "installed correctly and available": "instalado corretamente e disponível", @@ -7877,6 +8081,7 @@ "intel_iommu/amd_iommu is set in cmdline but no IOMMU groups exist — IOMMU appears disabled in BIOS. Enable VT-d / AMD-Vi in firmware before continuing.": "intel_iommu/amd_iommu está definido no cmdline, mas não existem grupos IOMMU – IOMMU aparece desabilitado no BIOS. Habilite VT-d/AMD-Vi no firmware antes de continuar.", "interfaces": "interfaces", "into an LXC.": "em um LXC.", + "invalid source '%s' (must be 'auto', 'custom', or 'detected')": "origem inválida '%s' (deve ser 'auto', 'custom' ou 'detected')", "iperf3 - Bandwidth test": "iperf3 - teste de largura de banda", "iperf3 - Bandwidth test (Client mode)": "iperf3 - Teste de largura de banda (modo cliente)", "iperf3 - Bandwidth test (Server mode)": "iperf3 - Teste de largura de banda (modo servidor)", @@ -7903,9 +8108,12 @@ "is one of the": "é um dos", "is referenced in the following stopped VM(s)/CT(s):": "é referenciado nas seguintes VM(s)/CT(s) interrompidas:", "it asks for the network of the host; the container gets its own address instead": "ele pede a rede do host; o recipiente recebe seu próprio endereço", + "it asks for two different memory limits": "pede dois limites de memória diferentes", "it could not be started:": "não foi possível iniciar:", + "it describes more than one image": "descreve mais do que uma imagem", "it is locked or its disk could not be mounted": "está bloqueado ou seu disco não pôde ser montado", "it publishes no other architecture": "não publica nenhuma outra arquitetura", + "it uses Compose configs, which have no equivalent here": "utiliza configs do Compose, que não têm equivalente aqui", "it uses an NVIDIA GPU and this host has no working NVIDIA driver and Container Toolkit. Install them and run the recovery again.": "ele usa uma GPU NVIDIA e este host não possui um driver NVIDIA funcional nem o Container Toolkit. Instale-os e execute a recuperação novamente.", "it uses the Compose option": "usa a opção Compose", "its NVIDIA runtime could not be rebuilt for the driver of this host; the container will not start until it is installed again:": "seu runtime da NVIDIA não pôde ser reconstruído para o driver deste host; o contêiner não será iniciado até que seja instalado novamente:", @@ -7913,10 +8121,13 @@ "its Rclone mount is published by a host script that a backup does not include. Enable the mount again from the Rclone entry of the catalog before starting it.": "sua montagem Rclone é publicada por um script de host que um backup não inclui. Habilite a montagem novamente na entrada Rclone do catálogo antes de iniciá-la.", "its backup was made before ProxMenux kept the record inside the container": "o backup dele foi feito antes de o ProxMenux manter o registro dentro do contêiner", "its configuration could not be read": "sua configuração não pôde ser lida", + "its health check is not written in a way that can be read": "a sua verificação de estado (health check) não está escrita de forma legível", "its hookscript does not exist on this host:": "seu hookscript não existe neste host:", "its host firewall rule was not added:": "sua regra de firewall do host não foi adicionada:", "its include exists with other content:": "seu include existe com outro conteúdo:", "its record is missing and it was not found among the restored containers": "seu registro está faltando e ele não foi encontrado entre os contêineres restaurados", + "its shared memory size is not written in a way that can be read": "o seu tamanho de memória partilhada não está escrito de forma legível", + "its stop timeout is not written in a way that can be read": "o seu tempo limite de paragem não está escrito de forma legível", "journald MaxLevelStore is adequate for auth logging": "journald MaxLevelStore é adequado para registro de autenticação", "journald drop-in created: /etc/systemd/journald.conf.d/proxmenux-loglevel.conf": "Drop-in do journald criado: /etc/systemd/journald.conf.d/proxmenux-loglevel.conf", "journald log level restored": "nível de log do journald restaurado", @@ -7932,6 +8143,7 @@ "keep-weekly (0 disables)": "manter semanalmente (0 desabilita)", "keep-yearly (0 disables)": "manter anual (0 desabilita)", "keeping current settings": "mantendo as configurações atuais", + "kernel": "kernel", "kexec configured successfully. Use the command: reboot-quick": "kexec configurado com sucesso. Use o comando: reinicialização rápida", "kexec-pve service enabled": "serviço kexec-pve habilitado", "kexec-pve service file created": "arquivo de serviço kexec-pve criado", @@ -7944,12 +8156,15 @@ "layers": "camadas", "legacy .link file(s) to the ProxMenux-managed format": "arquivo(s) .link herdado(s) para o formato gerenciado pelo ProxMenux", "log2ram completely removed from system": "log2ram completamente removido do sistema", + "main container of the application": "contentor principal da aplicação", + "make cloned mount tree read-only": "tornar só de leitura a árvore de montagem clonada", "manually inside the container before starting it.": "manualmente dentro do contêiner antes de iniciá-lo.", "manually inside the container.": "manualmente dentro do contêiner.", "maximum performance": "desempenho máximo", "may be closed — trying discovery anyway...": "pode estar fechado - tentando a descoberta de qualquer maneira...", "melonDS aims at providing fast and accurate Nintendo DS emulation.": "melonDS visa fornecer emulação rápida e accurate Nintendo DS.", "members:": "membros:", + "memory": "memória", "minimum": "mínimo", "missing": "faltando", "mkfs.btrfs not found. Install btrfs-progs and retry.": "mkfs.btrfs não encontrado. Instale o btrfs-progs e tente novamente.", @@ -7964,6 +8179,7 @@ "needs a relaxed AppArmor or seccomp profile": "precisa de um perfil de AppArmor ou seccomp relaxado", "needs stack review": "precisa de revisão da pilha", "needs these external services, already running:": "precisa destes serviços externos, já em execução:", + "network": "rede", "never": "nunca", "next free": "livre seguinte", "next free block": "próximo bloco livre", @@ -7974,11 +8190,14 @@ "no declarative value": "sem valor declarativo", "no passphrase": "sem senha", "no password": "sem senha", + "no-subscription repository": "repositório no-subscription", "no_root_squash": "sem_root_squash", "non-ProxMenux .tar archive(s) in this path": "arquivo(s) .tar não-ProxMenux neste caminho", + "none": "nenhum", "not available yet": "não disponível ainda", "not changed": "não alterado", "not found.": "não encontrado.", + "not generated": "não gerado", "not installed": "não instalado", "not reliable on this hardware due to the following limitations": "não é confiável neste hardware devido às seguintes limitações", "nouveau driver has been blacklisted.": "O driver nouveau foi colocado na lista negra.", @@ -8018,6 +8237,7 @@ "pct exec authorization failed": "falha na autorização pct exec", "pct push failed. Check log:": "pct push falhou. Verifique o registro:", "pending (reboot required to enumerate full group)": "pendente (reinicialização necessária para enumerar o grupo completo)", + "pending adaptation": "adaptação pendente", "phpMyAdmin is installed with arbitrary server connections enabled: the login page has a Server field where the address of the MySQL or MariaDB server is entered, together with its user and password.": "phpMyAdmin é instalado com conexões de servidor arbitrárias habilitadas: a página de login tem um campo de servidor onde o endereço do servidor MySQL ou MariaDB é inserido, juntamente com seu usuário e senha.", "pigz configuration completed": "configuração do pigz concluída", "pigz enabled in vzdump configuration": "pigz habilitado na configuração do vzdump", @@ -8027,10 +8247,13 @@ "playit.gg has to claim this agent before it forwards anything. The agent prints a one-time claim link on the container console and keeps it there until the link is opened.": "playit.gg tem que reivindicar este agente antes que ele avance com qualquer coisa. O agente imprime um link de reivindicação única no console do contêiner e o mantém lá até que o link seja aberto.", "port": "porta", "portmapper/rpcbind has been disabled": "portmapper/rpcbind foi desativado", + "print the estimated unpacked size in MiB (0 when unknown)": "mostrar o tamanho estimado após descompactação em MiB (0 se desconhecido)", "private network assigned automatically": "rede privada atribuída automaticamente", "privileged LXC": "LXC privilegiado", + "provide either SOURCE_TYPE+FUNCTION_NAME (single mode) or FUNCTIONS_BATCH (batch mode).": "indique SOURCE_TYPE+FUNCTION_NAME (modo único) ou FUNCTIONS_BATCH (modo em lote).", "proxmox-backup-client reported:": "proxmox-backup-client relatado:", "proxmox-boot-tool refreshed": "ferramenta proxmox-boot atualizada", + "publish mount tree": "publicar a árvore de montagem", "pve-enterprise.list update skipped (no change)": "Atualização de pve-enterprise.list ignorada (sem alteração)", "pve-enterprise.list updated to Trixie": "pve-enterprise.list atualizado para Trixie", "pvecm command not found (might not be in a cluster)": "Comando pvecm não encontrado (pode não estar em um cluster)", @@ -8043,6 +8266,7 @@ "pvesm status failed": "O pvesm status falhou", "pyLoad is a Free and Open Source download manager written in Python and designed to be extremely lightweight, easily extensible and fully manageable via web.": "pyLoad é um gerenciador de download livre e Open Source escrito em Python e projetado para ser extremamente leve, facilmente extensível e totalmente gerenciável via web.", "pyLoad web interface": "interface web pyLoad", + "python3-jsonschema is required to generate templates": "É necessário o python3-jsonschema para gerar modelos", "qBittorrent WebUI password (user: admin)": "Senha do WebUI do qBittorrent (utilizador: administrador)", "qBittorrent already has a configuration; it is not overwritten": "O qBittorrent já tem uma configuração; não é sobrescrito", "qBittorrent configured": "qBittorrent configurado", @@ -8064,12 +8288,14 @@ "removed from Proxmox": "removido do Proxmox", "removed in Proxmox": "removida no Proxmox", "removed successfully from Proxmox.": "removido com sucesso do Proxmox.", + "removed unused image archive: {path} ({size} bytes)": "arquivo de imagem não utilizado eliminado: {path} ({size} bytes)", "requires running the official installer, which restarts the Monitor service.": "requer a execução do instalador oficial, que reinicia o serviço Monitor.", "requires the package": "requer o pacote", "restarted successfully": "reiniciado com sucesso", "restoring /etc/network would lose connectivity": "restaurar /etc/network perderia conectividade", "restoring on:": "restaurando em:", "retries": "novas tentativas", + "return to host namespace": "regressar ao namespace do host", "reverse proxy": "proxy reverso", "root and real users only": "apenas usuários root e reais", "rpcbind could not be disabled completely": "rpcbind não pôde ser desativado completamente", @@ -8114,6 +8340,7 @@ "storage yet.": "armazenamento ainda.", "storage(s) from backup exist on target": "armazenamento(s) do backup existem no destino", "storage.": "armazenamento.", + "subscription banner": "banner de subscrição", "successfully formatted with": "formatado com sucesso com", "suggested:": "sugerido:", "switch_gpu_mode.sh was not found.": "switch_gpu_mode.sh não foi encontrado.", @@ -8122,18 +8349,22 @@ "systemctl restart networking failed:": "O systemctl restart networking falhou:", "systemd OnCalendar expression": "Expressão Systemd OnCalendar", "the API key was not generated on the first start": "a tecla API não foi gerada no primeiro início", + "the GPU did not answer in time": "a GPU não respondeu a tempo", "the NVIDIA hook of the container is not available:": "o hook NVIDIA do contêiner não está disponível:", "the bridge does not exist on this host:": "a ponte não existe neste host:", "the bridge exists on this host with another network:": "a ponte existe neste host com outra rede:", "the container has its own address, so the port Docker published on the host is not needed": "o recipiente tem seu próprio endereço, então a porta Docker publicada no host não é necessária", "the containers do not agree on the private network of": "os contêineres não concordam quanto à rede privada de", "the device does not exist on this host:": "o dispositivo não existe neste host:", + "the devices it asks for are not written in a way that can be read": "os dispositivos que pede não estão escritos de forma legível", "the host directory does not exist:": "o diretório host não existe:", "the host firewall rule of the installation is not added again; allow its port in the firewall of this host if you use it.": "a regra de firewall do host da instalação não é adicionada novamente; permita sua porta no firewall deste host se você usá-lo.", + "the memory limit it asks for cannot be applied": "o limite de memória que pede não pode ser aplicado", "the minimum number of characters is": "o número mínimo de caracteres é", "the qBittorrent schema is not available": "o esquema qBittorrent não está disponível", "the record it carries does not belong to this container": "o registro que ele carrega não pertence a este contêiner", "the record of the application does not list this container": "o registro da aplicação não lista este contêiner", + "the resource limits it asks for cannot be applied": "os limites de recursos que pede não podem ser aplicados", "the settings of its include are not in the record:": "as configurações do seu include não estão no registro:", "the start order of its dependencies is not in the record": "a ordem de inicialização de suas dependências não está no registro", "this configuration needs the device": "esta configuração necessita do dispositivo", @@ -8158,6 +8389,7 @@ "unsupported dependency condition": "condição de dependência não suportada", "unsupported external credential or boolean": "credential ou booleano não suportado", "unsupported variable": "variável não suportada", + "update for %s exited with status %s.": "a atualização de %s terminou com o estado %s.", "updating": "atualização", "updating NVIDIA userspace libs": "atualizando bibliotecas de espaço de usuário NVIDIA", "user packages missing — will be installed automatically:": "pacotes de usuário ausentes — serão instalados automaticamente:", @@ -8186,6 +8418,7 @@ "with Proxmox": "com Proxmox", "with prefix, e.g.": "com prefixo, por exemplo.", "with the password you provided.": "com a senha que você forneceu.", + "x-casaos.main must name an existing service.": "x-casaos.main deve indicar um serviço existente.", "xemu is a free and open-source application that emulates the original Microsoft Xbox game console, enabling people to play their original Xbox games on Windows, macOS, and Linux systems.": "xemu é um aplicativo livre e de código aberto que emula o console original do jogo Microsoft Xbox, permitindo que as pessoas joguem seus jogos originais Xbox em sistemas Windows, macOS e Linux.", "xfs — Proxmox dir storage (large files and VMs)": "xfs — Armazenamento em diretório Proxmox (arquivos grandes e VMs)", "xfs — better for large files": "xfs — melhor para arquivos grandes", @@ -8201,6 +8434,7 @@ "zfs-auto-snapshot removed (existing snapshots preserved on the pool)": "zfs-auto-snapshot removido (instantâneos existentes preservados no pool)", "zpool command not found. Install zfsutils-linux and retry.": "Comando zpool não encontrado. Instale zfsutils-linux e tente novamente.", "zpool not found. Install zfsutils-linux and retry.": "zpool não encontrado. Instale zfsutils-linux e tente novamente.", + "{application} runs in {count} containers.": "{application} é executada em {count} contentores.", "{count} saved account.": "Conta salva {count}.", "{count} saved accounts.": "Contas salvas {count}.", "{path} already exists and belongs to another user of the host, so {app} cannot write to it.\n\nProxMenux can add access rules (ACL) to this directory, to everything inside it and to what is created there later, for the users and groups {app} runs as on the host (IDs {ids}). The owner of the files does not change and whatever reads or writes them today keeps doing so; the owner of the directory also gets access to the files {app} creates.\n\nGrant {app} access to this directory?": "{path} já existe e pertence a outro usuário do host, portanto {app} não pode gravar nele.\n\nProxMenux pode adicionar regras de acesso (ACL) a este diretório, a tudo o que ele contém e ao que for criado nele depois, para os usuários e grupos com os quais {app} é executado no host (IDs {ids}). O proprietário dos arquivos não muda e o que hoje os lê ou grava continua fazendo isso; o proprietário do diretório também obtém acesso aos arquivos que {app} cria.\n\nConceder acesso ao {app} a este diretório?", diff --git a/lang/sk.json b/lang/sk.json index 58b879dd..cf4da7f8 100644 --- a/lang/sk.json +++ b/lang/sk.json @@ -1,6 +1,7 @@ { "# Alternative if you prefer screen": "# Alternatíva, ak preferujete screen", "# Recommended: avoids disconnection during upgrade": "# Odporúčané: zabráni odpojeniu počas aktualizácie", + "'auto'/'local', or root@IP for development": "'auto'/'local' alebo root@IP pri vývoji", "(Checked entries will be removed. Uncheck to keep in VM.)": "(Označené položky sa odstránia. Zrušte označenie, ak ich chcete ponechať vo VM.)", "(Import is selected by default — required for disk image imports)": "(Import je vybraný predvolene - je potrebný na import diskových obrazov)", "(Only the host directory is modified. Nothing inside the container is changed.": "(Mení sa iba priečinok na hostovi. Vo vnútri kontajnera sa nemení nič.", @@ -42,59 +43,59 @@ ">> Create a new backup job <<": ">> Vytvoriť novú úlohu zálohovania <<", ">> Save and return <<": ">> Uložiť a vrátiť <<", "A GTK Broadway web UI for libvirt and virt-manager.": "GTK Broadway web UI pre libvirt a virt-manager.", - "A Personal Relationship Management tool to help you document your social life.": "Osobný vzťah Nástroj riadenia, ktorý vám pomôže zdokumentovať váš spoločenský život.", + "A Personal Relationship Management tool to help you document your social life.": "Nástroj na správu osobných vzťahov a zaznamenávanie spoločenského života.", "A VirtIO ISO already exists. Do you want to overwrite it?": "VirtIO ISO už existuje. Chcete ho prepísať?", "A ZFS pool with this name already exists.": "ZFS pool s týmto názvom už existuje.", "A ZFS pool with this name already exists:": "ZFS pool s týmto názvom už existuje:", - "A backup was modified": "Posily boli upravené", + "A backup was modified": "Záloha bola zmenená", "A command did not finish in time:": "Príkaz neskončil včas:", "A complete restore will:": "Úplná obnova vykoná:", - "A concurrent change was detected; the container is not removed": "Bola zistená súbežná zmena; obal sa neodstraňuje", - "A container mount has a source, backup or permission different from the saved record": "Montáž kontajnera má zdroj, zálohu alebo povolenie odlišné od uloženého záznamu", + "A concurrent change was detected; the container is not removed": "Bola zistená súbežná zmena; kontajner sa neodstráni", + "A container mount has a source, backup or permission different from the saved record": "Pripojenie v kontajneri má iný zdroj, nastavenie zálohovania alebo oprávnenia než uložený záznam", "A container without its record stays as an ordinary container and is not offered again.": "Kontajner bez záznamu zostane ako obyčajný kontajner a už sa neponúka.", - "A coordinated operation has a saved journal. Continuing attempts to recover the previous stack where needed, or finish cleanup for a completed operation. Recovery or cleanup can fail.": "Koordinovaná operácia má uložený záznam. Pokračovanie sa podľa potreby pokúsi obnoviť predchádzajúci stack alebo dokončiť čistenie už dokončenej operácie. Obnova alebo čistenie môžu zlyhať.", + "A coordinated operation has a saved journal. Continuing attempts to recover the previous stack where needed, or finish cleanup for a completed operation. Recovery or cleanup can fail.": "Koordinovaná operácia má uložený záznam priebehu. Pokračovanie sa podľa potreby pokúsi obnoviť predchádzajúci stav aplikácie alebo dokončiť upratovanie už dokončenej operácie. Obnova aj upratovanie môžu zlyhať.", "A coordinated operation is pending. The whole previous stack will be recovered, not only the selected member. If the operation already finished, the cleanup of its markers is completed.": "Koordinovaná operation čaká. Celý predchádzajúci stack bude obnovený, nielen vybraný člen. Ak už operation skončil, vyčistenie jeho markerov je ukončené.", - "A different host monitor include already exists; it is not overwritten:": "Iný hostiteľský monitor už existuje; nie je prepísaný:", + "A different host monitor include already exists; it is not overwritten:": "Už existuje iný pripojený konfiguračný súbor monitora hostiteľa; neprepíše sa:", "A fancy monitoring tool": "Nádherný monitorovací nástroj", - "A free and open-source cross-platform document-oriented database program. Classified as a NoSQL database program, MongoDB uses JSON-like documents with schemata.": "zadarmo a open-source cross-platform dokument-orientovaný databázový program. Utajené ako NoSQL databázový program, MongoDB používa JSON-like dokumenty so schémou.", - "A free reverse proxy for tunneling services (not self-hosted).": "Voľný spätný proxy pre tunelovanie služby (nie je self-hosted).", - "A free, self-hostable news aggregator…": "Slobodný agregácia správ...", - "A full-featured, open-source AI chat interface": "Full-featured, open-source AI chat rozhranie", + "A free and open-source cross-platform document-oriented database program. Classified as a NoSQL database program, MongoDB uses JSON-like documents with schemata.": "MongoDB je bezplatná multiplatformová dokumentová databáza s otvoreným zdrojovým kódom. Patrí medzi databázy NoSQL a používa dokumenty podobné JSON so schémami.", + "A free reverse proxy for tunneling services (not self-hosted).": "Bezplatný reverzný proxy na tunelovanie služieb (neprevádzkuje sa na vlastnom serveri).", + "A free, self-hostable news aggregator…": "Bezplatný agregátor správ na vlastnom serveri…", + "A full-featured, open-source AI chat interface": "Plnohodnotné chatové rozhranie pre AI s otvoreným zdrojovým kódom", "A gasket DKMS registration is still present:": "Stále existuje registrácia gasket DKMS:", "A host bind mount cannot be included in vzdump": "Pripojenie hostiteľa nemôže byť súčasťou vzdumpu", "A host firewall rule is only valid for a host-monitor profile": "Pravidlo firewallu hostiteľa je platné iba pre profil monitorovania hostiteľa", - "A host mount is not part of the journal; recovery blocked": "@ info: tooltip", + "A host mount is not part of the journal; recovery blocked": "Pripojenie adresára hostiteľa nie je uvedené v zázname operácie; obnova je zablokovaná", "A host reboot is required after this change.": "Po tejto zmene je potrebný reštart hosta.", "A host reboot is required before starting the VM. Reboot now?": "Pred spustením VM je potrebný reštart servera. Reštartovať teraz?", "A host script is not written over a symbolic link:": "Hostiteľský skript sa nepíše cez symbolický odkaz:", "A job with this ID already exists.": "Úloha s týmto ID už existuje.", - "A journal already exists; review or recover it before trying again": "Časopis už existuje; recenzia alebo obnoviť pred pokusom opäť", + "A journal already exists; review or recover it before trying again": "Záznam operácie už existuje; pred ďalším pokusom ho skontrolujte alebo vykonajte obnovu", "A keyfile is installed at:": "Keyfile je nainštalovaný v:", "A legacy gasket-dkms package was found on this host, but no Coral M.2 / PCIe hardware is present.": "Na tomto hostiteľovi sa našiel starý balík gasket-dkms, ale nie je prítomný žiadny hardvér Coral M.2 / PCIe.", "A managed rootfs and an unprivileged container are required": "Riadené rootfs a neprivilegovaný kontajner sú required", - "A managed volume with backup enabled is required": "Riadený objem so zapnutou zálohou je required", - "A matching managed host firewall rule may also be removed.": "Zhodné pravidlo brány firewall spravovaného hostiteľa môže byť tiež odstránené.", - "A member VMID is in use by another guest or is on another node": "Člen VMID používa iný hosť alebo je na inom uzle", - "A member configuration changed after the stack was checked": "Konfigurácia člena sa zmenila po kontrole zásobníka", + "A managed volume with backup enabled is required": "Vyžaduje sa spravovaný dátový zväzok so zapnutým zálohovaním", + "A matching managed host firewall rule may also be removed.": "Môže sa odstrániť aj zodpovedajúce spravované pravidlo firewallu hostiteľa.", + "A member VMID is in use by another guest or is on another node": "VMID člena aplikácie používa iný hosť alebo je kontajner na inom uzle", + "A member configuration changed after the stack was checked": "Nastavenie kontajnera sa po kontrole aplikácie zmenilo", "A member configuration changed during the preparation": "Konfigurácia člena sa počas prípravy zmenila", - "A member did not pass its service check:": "Člen neprešiel servisnou kontrolou:", - "A member has a pending operation": "Člen čaká na operation", - "A member has no reproducible service check": "Člen nemá reprodukovateľnú servisnú kontrolu", - "A member is missing before the replacement": "Člen je nezvestný pred nahradením", - "A member operation does not belong to the stack": "Člen operation nepatrí do stohu", - "A member stopped:": "Člen zastavil:", + "A member did not pass its service check:": "Kontajner neprešiel kontrolou služby:", + "A member has a pending operation": "Jeden z kontajnerov má nedokončenú operáciu", + "A member has no reproducible service check": "Jeden z kontajnerov nemá kontrolu služby, ktorú možno zopakovať", + "A member is missing before the replacement": "Pred nahradením chýba kontajner aplikácie", + "A member operation does not belong to the stack": "Operácia kontajnera nepatrí do tejto aplikácie", + "A member stopped:": "Kontajner bol zastavený:", "A member was modified after it was recovered": "Člen bol zmenený po tom, čo bol obnovený", "A modern wiki and knowledge base for teams": "Moderná wiki a vedomostná základňa pre tímy", "A multi-container application is not recreated: its containers are updated together.": "Aplikácia s viacerými kontajnermi sa nevytvorí znova: jej kontajnery sa aktualizujú spoločne.", "A new ProxMenux version is available:": "Je dostupná nová verzia ProxMenux:", "A new kernel is staged for the next boot:": "Na najbližší štart je pripravený nový kernel:", - "A newer kernel is installed. Reboot before the next backup window to use it.": "Je nainštalované novšie jadro. Aby ste ho mohli použiť, reštartujte ho pred ďalším oknom zálohy.", + "A newer kernel is installed. Reboot before the next backup window to use it.": "Je nainštalované novšie jadro. Pred ďalším plánovaným zálohovaním reštartujte server, aby sa použilo.", "A newer version is available:": "Je dostupná novšia verzia:", - "A pending operation exists for": "Čaká na operation existuje", - "A pending stack assembly already exists; it is not overwritten": "Nevyriešená zostava stohov už existuje; nie je prepísaná", + "A pending operation exists for": "Nedokončená operácia existuje pre", + "A pending stack assembly already exists; it is not overwritten": "Už existuje nedokončené zostavenie aplikácie; neprepíše sa", "A previous NVIDIA refresh is pending review": "Predchádzajúce obnovovanie NVIDIA čaká na preskúmanie", "A previous VFIO passthrough configuration was detected for the following NVIDIA GPU(s):": "Pre nasledujúce GPU NVIDIA bola zistená predchádzajúca konfigurácia priechodu VFIO:", - "A privacy-first, open-source platform for knowledge management and collaboration.": "Platforma pre riadenie znalostí a spoluprácu na prvom mieste ochrany súkromia s otvoreným zdrojom.", + "A privacy-first, open-source platform for knowledge management and collaboration.": "Platforma na správu znalostí a spoluprácu s otvoreným zdrojovým kódom a dôrazom na súkromie.", "A reboot is recommended before the GPU is guaranteed to stay on the native driver.": "Pred zaručením, že GPU zostane na natívnom ovládači, sa odporúča reštartovať.", "A reboot is required after installation to load the new kernel modules.": "Po inštalácii je potrebný reštart, aby sa načítali nové kernel moduly.", "A reboot is required for VFIO binding to take effect. Do you want to restart now?": "Na uplatnenie VFIO naviazania je potrebný reštart. Chcete reštartovať teraz?", @@ -102,35 +103,35 @@ "A reboot is required to finish the restore.": "Na dokončenie obnovy je potrebný reštart.", "A reboot will be required to complete the restore.": "Na dokončenie obnovy bude potrebný reštart.", "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 reproducible native startup is missing": "Chýba natívny spôsob spustenia, ktorý možno zopakovať", + "A rootfs adaptation is stored in persistent storage": "Úprava koreňového súborového systému je uložená v trvalom úložisku", + "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.", - "A self-improving AI agent with memory, skills, messaging, and a web dashboard.": "Self-zlepšenie AI agenta s pamäťou, zručnosti, správy, a webová palubná doska.", + "A self-hosted Bitwarden server": "Server Bitwarden na vlastnom serveri", + "A self-hosted, goal-free habit tracking tool.": "Nástroj na sledovanie návykov bez stanovovania cieľov, prevádzkovaný na vlastnom serveri.", + "A self-improving AI agent with memory, skills, messaging, and a web dashboard.": "Zdokonaľujúci sa agent AI s pamäťou, zručnosťami, komunikáciou a webovým panelom.", "A server reboot is recommended for all changes to take full effect.": "Odporúča sa reštart servera, aby sa všetky zmeny naplno prejavili.", "A shared directory was replaced during the installation": "Počas inštalácie bol vymenený zdieľaný adresár", "A shared source does not match its recorded identity": "Spoločný zdroj nezodpovedá jeho zaznamenanej identite", - "A simple, open-source file sharing host.": "Jednoduchý, open-source súbor zdieľanie hostiteľa.", + "A simple, open-source file sharing host.": "Jednoduchá služba na zdieľanie súborov s otvoreným zdrojovým kódom.", "A simple, private file server.": "Jednoduchý súkromný súborový server.", "A single matching image platform cannot be resolved": "Jedinú zodpovedajúcu obrazovú platformu nie je možné vyriešiť", - "A single-platform OCI archive is required": "Jednoplatformový OCI archív je required", - "A stack backup is missing; a partial restore is not allowed": "Chýba záloha stohu; čiastočná obnova nie je povolená", - "A stack member has a different identity": "Člen stohu má inú identitu", + "A single-platform OCI archive is required": "Vyžaduje sa archív OCI pre jedinú platformu", + "A stack backup is missing; a partial restore is not allowed": "Chýba záloha jedného z kontajnerov aplikácie; čiastočná obnova nie je povolená", + "A stack member has a different identity": "Kontajner zostavy má inú identitu", "A system reboot is recommended to ensure all changes take effect.": "Odporúča sa reštart systému, aby sa všetky zmeny bezpečne prejavili.", "A third party companion app available to Plex server owners to allow their users to request, review and discover content.": "Aplikácia tretej strany pre majiteľov serverov Plex, ktorá umožňuje ich používateľom požadovať, skúmať a objavovať obsah.", - "A third-party client for self-hosted server and self-hosted server, remote access management interface, remote access to installed applications.": "Klient tretej strany pre self-hosted server a self-hosted server, vzdialený prístup k nainštalovaným aplikáciám.", - "A tmpfs mount is not part of the journal; recovery blocked": "A tmpfs mount nie je súčasťou časopisu; zotavenie blokované", - "A tmpfs mount overlaps another mount": "Pripojenie tmpfs sa prekrýva s inou montážou", + "A third-party client for self-hosted server and self-hosted server, remote access management interface, remote access to installed applications.": "Klient tretej strany pre vlastný server s rozhraním na správu vzdialeného prístupu a prístup k nainštalovaným aplikáciám.", + "A tmpfs mount is not part of the journal; recovery blocked": "Pripojenie tmpfs nie je súčasťou záznamu operácie; obnova je zablokovaná", + "A tmpfs mount overlaps another mount": "Pripojenie tmpfs sa prekrýva s iným pripojením", "A tunneling daemon by Cloudflare that safely exposes your web servers into the internet.": "Tunelový démon Cloudflare, ktorý bezpečne vystavuje vaše webové servery na internet.", "A versatile file conversion tool that supports multiple formats.": "Univerzálny nástroj na konverziu súborov, ktorý podporuje viacero formátov.", "A web GUI client of Project V which supports VMess, VLESS, SS, SSR, Trojan, Tuic and Juicity protocols": "Webový GUI klient projektu V, ktorý podporuje protokoly VMess, VLESS, SS, SSR, Trojan, Tuic a Juicity", "A web app to listen Youtube audio source.": "Webová aplikácia na počúvanie zdroja zvuku Youtube.", - "A web app to manage your Two-Factor Authentication (2FA) accounts and generate their security codes": "Webová aplikácia na správu vašich dvoch autentifikácií (2FA) a generovanie ich bezpečnostných kódov", - "A web frontend for the motion daemon.": "Web frontend pre filmový démon.", + "A web app to manage your Two-Factor Authentication (2FA) accounts and generate their security codes": "Webová aplikácia na správu účtov dvojfaktorového overovania (2FA) a generovanie bezpečnostných kódov", + "A web frontend for the motion daemon.": "Webové rozhranie pre službu motion.", "A web-based file sharing and management protocol": "Webový protokol zdieľania a správy súborov", - "A well-designed cross-platform ChatGPT UI.": "Dobre navrhnutý cross-platform ChatGPT UI.", + "A well-designed cross-platform ChatGPT UI.": "Prehľadné multiplatformové rozhranie pre ChatGPT.", "ACL Status:": "Stav ACL:", "ACL permissions applied for local access for user:": "ACL oprávnenia boli nastavené pre lokálny prístup používateľa:", "ADVANCED SETTINGS COMPLETE": "POKROČILÉ NASTAVENIA SÚ HOTOVÉ", @@ -163,6 +164,7 @@ "APT configured to skip additional languages": "APT je nastavené tak, aby nesťahovalo ďalšie jazyky", "APT configured to skip downloading additional languages": "APT je nastavené tak, aby nesťahovalo ďalšie jazyky", "APT configured to use IPv4": "APT je nastavené na používanie IPv4", + "APT hook syntax issue, removing...": "Nesprávna syntax hooku APT; hook sa odstráni...", "APT index update failed after switching to no-subscription. See log:": "Aktualizácia APT indexu zlyhala aj po prepnutí na no-subscription. Pozrite záznam:", "APT index update failed. See log:": "Aktualizácia APT indexu zlyhala. Pozrite záznam:", "APT indexes updated for Trixie": "APT indexy boli aktualizované pre Trixie", @@ -180,24 +182,24 @@ "Absolute path to a file or directory you want backed up:": "Absolútna cesta k súboru alebo priečinku, ktorý chcete zálohovať:", "Acceleration": "Zrýchlenie", "Acceleration configuration cancelled": "Konfigurácia zrýchlenia zrušená", - "Acceleration for CodeProject.AI": "Zrýchlenie pre CodeProject. AI", + "Acceleration for CodeProject.AI": "Zrýchlenie pre CodeProject.AI", "Acceleration for Faster Whisper": "Zrýchlenie pre Faster Whisper", "Acceleration for Immich smart recognition": "Zrýchlenie pre Immich inteligentné uznanie", "Acceleration for Ollama": "Zrýchlenie pre Ollama", "Acceleration for Piper": "Zrýchlenie pre Piper", "Acceleration for llama.cpp": "Zrýchlenie pre llama.cpp", "Accept routes from other nodes?": "Prijímať trasy z iných uzlov?", - "Accept this host monitoring profile?": "Prijmite tento monitorovací profil hostiteľa?", + "Accept this host monitoring profile?": "Prijať tento profil monitorovania hostiteľa?", "Access Scope:": "Rozsah prístupu:", - "Access bridge": "Prístupový mostík", - "Access bridge for Immich": "Prístupový mostík pre Immich", - "Access bridge for Nextcloud": "Prístupový mostík pre Nextcloud", - "Access bridge for Paperless": "Prístupový mostík pre bezpapierové", - "Access bridge for Tandoor": "Prístupový mostík pre Tandoor", + "Access bridge": "Sieťový most (bridge)", + "Access bridge for Immich": "Sieťový most (bridge) pre Immich", + "Access bridge for Nextcloud": "Sieťový most (bridge) pre Nextcloud", + "Access bridge for Paperless": "Sieťový most (bridge) pre Paperless", + "Access bridge for Tandoor": "Sieťový most (bridge) 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 granted to the application on:": "Prístup udelený aplikácii dňa:", + "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:": "Aplikácii bol udelený prístup k:", "Access password of the web interface (optional)": "Heslo na prístup do webového rozhrania (voliteľné)", "Access profile:": "Profil prístupu:", "Access token of the Jupyter Lab web interface": "Prístupový token webového rozhrania Jupyter Lab", @@ -210,9 +212,10 @@ "Activate ProxMenux Monitor": "Zapnúť ProxMenux Monitor", "Active": "Aktívne", "Active Connections": "Aktívne pripojenia", + "Active ZRAM algorithm, capacity or swap sources did not match the profile": "Algoritmus kompresie, veľkosť alebo zdroje swapu aktívnej ZRAM nezodpovedajú profilu", "Active exports:": "Aktívne exporty:", "Active session:": "Aktívna relácia:", - "Actual device path on the host": "Skutočná dráha zariadenia na hostiteľovi", + "Actual device path on the host": "Skutočná cesta k zariadeniu na hostiteľovi", "Adaptation file too large": "Adaptačný súbor príliš veľký", "Adaptation file with unexpected permissions or owner": "Adaptačný súbor s neočakávanými oprávneniami alebo majiteľom", "Adblock & DNS": "Adblock a DNS", @@ -240,7 +243,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 +255,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:", @@ -260,9 +263,10 @@ "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 the host firewall rule of this container; one option for each confirmed rule": "Pridať pravidlo firewallu hostiteľa pre tento kontajner; jedna voľba pre každé potvrdené pravidlo", "Add unprivileged flag to container configuration:": "Pridať príznak neprivilegovaného kontajnera do nastavenia:", "Add virtual disk": "Pridať virtuálny disk", "Add: Mount Host Directory into LXC": "Pridať: pripojiť priečinok hosta do LXC", @@ -281,19 +285,19 @@ "Adding existing users to sharedfiles group...": "Pridávam existujúcich používateľov do skupiny sharedfiles...", "Adding iSCSI storage to Proxmox...": "Pridávam iSCSI úložisko do Proxmoxu...", "Adding new share to smb.conf...": "Pridávam nové zdieľanie do smb.conf...", - "Adding peers later means raising PEERS in /etc/pve/lxc/.conf and restarting the container. The existing peer keys are kept.": "Pridanie peerov neskôr znamená zvýšenie PEERS v /etc/pve/lxc/.conf a obnovenie kontajnera. Existujúce kľúče peer sú zachované.", + "Adding peers later means raising PEERS in /etc/pve/lxc/.conf and restarting the container. The existing peer keys are kept.": "Ďalších účastníkov pridáte zvýšením hodnoty PEERS v /etc/pve/lxc/.conf a reštartom kontajnera. Existujúce kľúče účastníkov zostanú zachované.", "Adding the mount points...": "Pridanie bodov pripojenia...", "Adding this NVMe as a PCIe device (via 'Add Controller or NVMe PCIe to VM') gives better performance.": "Pridanie tohto NVMe ako PCIe zariadenia (cez 'Pridať radič alebo NVMe PCIe do VM') dáva lepší výkon.", "Adding to /etc/fstab for permanent mounting...": "Pridávam do /etc/fstab pre trvalé pripojenie...", "Additional URL advertised by Plex (optional)": "Ďalšie URL inzerované Plex (voliteľné)", "Additional audio function(s) to be added": "Pridajú sa ďalšie audio funkcie", - "Additional media/GPU GIDs, comma-separated": "Dodatočné médiá/GPU GID, čiarovo oddelené", + "Additional media/GPU GIDs, comma-separated": "Ďalšie GID pre médiá a GPU oddelené čiarkami", "Additional paths for": "Ďalšie cesty pre", "Address BookStack will be opened at (for example http://192.168.1.50)": "Adresa, na ktorej bude BookStack dostupný (napríklad http://192.168.1.50)", "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", @@ -304,7 +308,7 @@ "Address used to reach wallabag (http://IP or https://wallabag.example.com)": "Adresa použitá na dosiahnutie wallabag (http://IP alebo https://wallabag.example.com)", "Addresses to update: ipv4, ipv6 or both (uses an external service)": "Adresy na aktualizáciu: ipv4, ipv6 alebo oboje (používa externú službu)", "Adguardhome Sync web interface": "Webové rozhranie Adguardhome Sync", - "Adguardhome-sync is a tool to synchronize AdGuardHome config to replica instances.": "Adguardhome-sync je nástroj na synchronizáciu adGuardHome config na opakovanie inštancií.", + "Adguardhome-sync is a tool to synchronize AdGuardHome config to replica instances.": "Adguardhome-sync synchronizuje nastavenia AdGuard Home do ďalších inštancií.", "Adjust network/CIDR to your environment.": "Upravte sieť/CIDR podľa svojho prostredia.", "Adjust options if needed (vers=4,hard,timeo,...).": "Podľa potreby upravte možnosti (vers=4,hard,timeo,...).", "Adjusting systemd-journald limits to match Log2RAM size...": "Upravujem limity systemd-journald podľa veľkosti Log2RAM...", @@ -333,7 +337,7 @@ "After the reboot, you will only be able to access the Proxmox host via:": "Po reštarte sa k Proxmox hostovi dostanete iba cez:", "After this LXC → VM switch, reboot the host so the new binding state is applied cleanly.": "Po tomto prepnutí LXC → VM reštartujte host, aby sa nové naviazanie použilo čisto.", "Airsonic Advanced web interface": "Webové rozhranie Airsonic Advanced", - "Airsonic-advanced is a free, web-based media streamer, providing ubiquitious access to your music. Use it to share your music with friends, or to listen to your own music while at work. You can stream to multiple players simultaneously, for instance to one player in your kitchen and another in your living room.": "Airsonic-pokročilé je zadarmo, web-založené mediálne streamer, poskytuje ubiquitious prístup k vašej hudbe. Pomocou neho zdieľať hudbu s priateľmi, alebo počúvať svoju vlastnú hudbu v práci. Môžete prúdiť do viacerých hráčov súčasne, napríklad do jedného hráča v kuchyni a ďalšie vo vašej obývacej izbe.", + "Airsonic-advanced is a free, web-based media streamer, providing ubiquitious access to your music. Use it to share your music with friends, or to listen to your own music while at work. You can stream to multiple players simultaneously, for instance to one player in your kitchen and another in your living room.": "Airsonic-advanced je bezplatný webový server na streamovanie hudby. Umožňuje zdieľať hudbu s priateľmi alebo počúvať vlastnú zbierku aj v práci. Podporuje súčasné prehrávanie na viacerých zariadeniach, napríklad v kuchyni a obývačke.", "Aliases added to .bashrc": "Aliasy boli pridané do .bashrc", "Alist Sync web interface": "Alist Sync webové rozhranie", "All": "Všetky", @@ -364,11 +368,11 @@ "All {count} containers of the application are updated together (main CT: {vmid}). If there are new versions, all images are downloaded and verified, the application is stopped, each container is backed up and replaced with its new image. If anything fails, the backups are restored.": "Všetky kontajnery {count} aplikácie sa aktualizujú spoločne (hlavný CT: {vmid}).Ak existujú nové verzie, všetky obrázky sa stiahnu a overia, aplikácia sa zastaví, každý kontajner sa zálohuje a nahradí sa novým obrázkom. Ak niečo zlyhá, zálohy sa obnovia.", "All {count} containers of the application are updated together (main CT: {vmid}). If there are new versions, all images are downloaded and verified, the application is stopped, each container is backed up and replaced with its new image. If the operation fails after a container was changed, the backups are restored. An operation that stops halfway is recovered from the OCI management menu.": "Všetkých {count} kontajnerov aplikácie sa aktualizuje spoločne (hlavný CT: {vmid}). Ak existujú nové verzie, všetky obrazy sa stiahnu a overia, aplikácia sa zastaví, každý kontajner sa zálohuje a nahradí sa novým obrazom. Ak operácia zlyhá po zmene kontajnera, zálohy sa obnovia. Operácia, ktorá sa zastaví v polovici, sa obnoví z ponuky správy OCI.", "All {count} containers of the application will be recreated from their saved image digests (main CT: {vmid}). The stack is stopped, every container is backed up and replaced, then checked. If anything fails, the backups are restored.": "Všetkých {count} kontajnerov aplikácie sa znovu vytvorí z uložených image digestov (hlavný CT: {vmid}). Stack sa zastaví, každý kontajner sa zazálohuje, nahradí a skontroluje. Ak niečo zlyhá, zálohy sa obnovia.", - "All {count} containers of the application will be recreated from their saved image digests (main CT: {vmid}). The stack is stopped, every container is backed up and replaced, then checked. If the operation fails after a container was changed, the backups are restored. An operation that stops halfway is recovered from the OCI management menu.": "Všetkých {count} kontajnerov aplikácie sa znovu vytvorí z uložených image digestov (hlavný CT: {vmid}). Stack sa zastaví, každý kontajner sa zazálohuje, nahradí a skontroluje. Ak operácia zlyhá po zmene kontajnera, zálohy sa obnovia. Operácia, ktorá sa zastaví v polovici, sa obnoví z ponuky správy OCI.", + "All {count} containers of the application will be recreated from their saved image digests (main CT: {vmid}). The stack is stopped, every container is backed up and replaced, then checked. If the operation fails after a container was changed, the backups are restored. An operation that stops halfway is recovered from the OCI management menu.": "Všetky kontajnery aplikácie ({count}, hlavný CT: {vmid}) sa znovu vytvoria z uložených identifikátorov obrazov (digestov). Aplikácia sa zastaví, každý kontajner sa zazálohuje, nahradí a skontroluje. Ak operácia zlyhá po zmene kontajnera, zálohy sa obnovia. Nedokončenú operáciu možno obnoviť z ponuky správy OCI.", "Allocate CPU Cores": "Prideliť CPU jadrá", "Allocate RAM in MiB": "Prideliť RAM v MiB", "Allow TCP port {port} from {subnet} through the host firewall? Existing firewall rules are not changed.": "Povoliť cez firewall hostiteľa TCP port {port} zo siete {subnet}? Existujúce pravidlá firewallu sa nemenia.", - "Allowed hosts (comma separated; * allows access through the assigned IP)": "Povolené hostiteľov (koma oddelené; * umožňuje prístup cez pridelený IP)", + "Allowed hosts (comma separated; * allows access through the assigned IP)": "Povolené názvy hostiteľov oddelené čiarkami (* povolí prístup cez pridelenú IP adresu)", "Allowed source subnet:": "Povolená zdrojová podsieť:", "Allowed web port:": "Povolený webový port:", "Already Mounted": "Už je pripojené", @@ -378,54 +382,56 @@ "Also comment any remaining 'bookworm' entries in *.list if present.": "Zakomentujte aj všetky zostávajúce položky 'bookworm' v *.list, ak existujú.", "Also install the VirtIO network driver during setup to enable network access.": "Počas inštalácie nainštalujte aj sieťový ovládač VirtIO, aby fungoval prístup k sieti.", "Although VFIO can bind to this device, full passthrough to a VM is": "Aj keď sa VFIO vie na toto zariadenie naviazať, úplný passthrough do VM je", - "Altus is an Electron-based WhatsApp client with themes and multiple account support.": "Altus je Electron-based WhatsApp klient s témami a viacerými podporou účtu.", - "Ambiguous mount points in the container": "Ambiciózne body upevnenia v kontajneri", - "Ambiguous or invalid environment variable": "Ambiciózna alebo neplatná premenná prostredia", + "Altus is an Electron-based WhatsApp client with themes and multiple account support.": "Altus je klient WhatsApp založený na Electrone s podporou tém a viacerých účtov.", + "Ambiguous mount points in the container": "Nejednoznačné body pripojenia v kontajneri", + "Ambiguous or invalid environment variable": "Nejednoznačná alebo neplatná premenná prostredia", "Amount of RAM in MiB (default: 4096)": "Množstvo RAM v MiB (predvolené: 4096)", "An AI model used to generate images conditioned on text descriptions.": "Model AI používaný na generovanie obrázkov podmienených textovými popismi.", "An AMD dedicated GPU has been detected without FLR support": "Bola zistená dedikovaná AMD GPU bez podpory FLR", "An AMD integrated GPU (APU) has been detected": "Bola zistená integrovaná AMD GPU (APU)", - "An Alist storage synchronization tool based on the Web interface.": "Nástroj na synchronizáciu pamäte Alist založený na webovom rozhraní.", - "An Industrial-Level Controllable and Efficient Zero-Shot Text-To-Speech System": "Priemyselná úroveň ovládateľná a efektívna zero-Shot Text-To-Speech System", + "An Alist storage synchronization tool based on the Web interface.": "Nástroj na synchronizáciu úložísk Alist cez webové rozhranie.", + "An Industrial-Level Controllable and Efficient Zero-Shot Text-To-Speech System": "Efektívny a ovládateľný systém prevodu textu na reč priemyselnej úrovne bez predchádzajúceho trénovania na cieľovom hlase", "An Intel dedicated GPU has been detected without FLR support": "Bola zistená dedikovaná Intel GPU bez podpory FLR", - "An accelerated video generation framework that speeds up end-to-end diffusion while preserving video quality": "Zrýchlený rámec tvorby videa, ktorý urýchľuje šírenie do konca a zároveň zachováva kvalitu videa", + "An accelerated video generation framework that speeds up end-to-end diffusion while preserving video quality": "Rámec na zrýchlené generovanie videa, ktorý urýchľuje celý difúzny proces pri zachovaní kvality videa", "An application changed since the update check. Check for updates again.": "Od poslednej kontroly sa aplikácia zmenila. Znova vyhľadajte aktualizácie.", - "An executable required by the adapter is missing in the new image": "V novom obrázku chýba spustiteľný requi.", + "An executable required by the adapter is missing in the new image": "V novom obraze chýba spustiteľný súbor vyžadovaný adaptérom", "An fstab entry already exists for:": "Záznam vo fstab už existuje pre:", "An image probe container was started externally": "Externe bola spustená obrazová sonda", - "An include is not part of the journal; recovery blocked": "Zahrnutie nie je súčasťou časopisu; obnova zablokovaná", - "An include was modified outside the journal; recovery blocked": "Zahrnutie bolo upravené mimo časopisu; regenerácia zablokovaná", - "An open source generative AI development platform for building AI Agents and LLM workflows": "Open source roding AI developing platform for building AI Agents and LLM workflows", - "An operation of this installation has not finished; recover it from the management menu before removing it": "operation tohto zariadenia ešte nie je dokončená; obnoviť ho z menu riadenia pred jeho odstránením", + "An include is not part of the journal; recovery blocked": "Pripojený konfiguračný súbor nie je súčasťou záznamu operácie; obnova je zablokovaná", + "An include was modified outside the journal; recovery blocked": "Pripojený konfiguračný súbor bol zmenený mimo záznamu operácie; obnova je zablokovaná", + "An open source generative AI development platform for building AI Agents and LLM workflows": "Vývojová platforma generatívnej AI s otvoreným zdrojovým kódom na tvorbu agentov AI a pracovných postupov s LLM", + "An operation of this installation has not finished; recover it from the management menu before removing it": "Operácia tejto inštalácie sa ešte nedokončila; pred odstránením ju obnovte v ponuke správy OCI", "An update does not accept configuration changes": "Aktualizácia neprijíma zmeny konfigurácie", "Analysis Tools": "Analytické nástroje", "Analysis software that shows your internet speed for up to 30 days.": "Analyzačný softvér, ktorý ukazuje rýchlosť internetu až 30 dní.", - "Analyze Bridge Configuration": "Analyzovať nastavenie bridge", + "Analyze Bridge Configuration": "Analyzovať nastavenie sieťového mosta (bridge)", "Analyze Network Configuration": "Analyzovať nastavenie siete", - "Analyzing Bridge Configuration - READ ONLY MODE": "Analyzujem nastavenie bridge - režim iba na čítanie", + "Analyzing Bridge Configuration - READ ONLY MODE": "Analyzujem nastavenie sieťového mosta (bridge) - režim iba na čítanie", "Analyzing Network Configuration - READ ONLY MODE": "Analyzujem nastavenie siete - režim iba na čítanie", "Analyzing selected disks...": "Analyzujem vybrané disky...", "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 registry. This operation was not started.": "Ďalšia OCI operation používa register. Táto operation sa nezačala.", + "Another OCI operation is using the instance registry": "Register inštancií používa iná operácia OCI", + "Another OCI operation is using the instance registry.": "Register inštancií používa iná operácia OCI.", + "Another OCI operation is using the instance registry. Wait for it to finish and open this menu again; no container is modified.": "Register inštancií používa iná operácia OCI. Počkajte na jej dokončenie a znova otvorte túto ponuku; žiadny kontajner sa nezmení.", + "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.": "Register používa iná OCI operácia. Táto operácia sa nespustila.", "Another ProxMenux OCI operation is running. Try again when it finishes.": "Prebieha ďalšia operácia ProxMenux OCI. Skúste to znova, keď to skončí.", "Another ZRAM configuration exists or could not be inspected; systemd-zram-generator was retained": "Existuje iná konfigurácia ZRAM alebo ju nebolo možné skontrolovať; systemd-zram-generator bol zachovaný", - "Another ZRAM generator configuration exists; refusing to overwrite it:": "Existuje iná konfigurácia generátora ZRAM; refusing to overwrite it:", + "Another ZRAM generator configuration exists; refusing to overwrite it:": "Existuje iná konfigurácia generátora ZRAM; neprepíše sa:", "Another ZRAM swap setup exists; refusing to replace it:": "Existuje ďalšie nastavenie výmeny ZRAM; odmietnutie jeho výmeny:", "Another device of the network already answers on this address:": "Na tejto adrese už odpovedá iné zariadenie v sieti:", - "Another instance uses": "Iný prípad použitia", + "Another instance uses": "Iná inštancia už používa", "Another job that writes to the same storage still starts them.": "Iná úloha, ktorá zapisuje do rovnakého úložiska, ich spúšťa naďalej.", "Another node, typed by hand": "Ďalší uzol, zadaný ručne", "Another registry account operation is running. Try again when it finishes.": "Prebieha iná operácia registrového účtu. Skúste to znova, keď to skončí.", - "Another stack operation is pending": "Ďalší zásobník operation čaká", - "Application": "Uplatňovanie", + "Another stack operation is pending": "Iná operácia celej aplikácie ešte nie je dokončená", + "Application": "Aplikácia", + "Application data": "Údaje aplikácie", "Application registered on this host:": "Aplikácia registrovaná na tomto hostiteľovi:", "Application responding:": "Aplikácia odpovedá:", "Application responding; checking its stability...": "Aplikácia reaguje; kontrola jej stability...", - "Application suite: one independent LXC per selected application": "Application suite: jeden nezávislý LXC na vybranú aplikáciu", - "Application:": "Použitie:", + "Application suite: one independent LXC per selected application": "Zostava aplikácií: samostatný kontajner LXC pre každú vybranú aplikáciu", + "Application:": "Aplikácia:", "Applications you can choose:": "Aplikácie si môžete vybrať:", "Apply": "Použiť", "Apply AMD CPU fixes": "Použiť opravy pre AMD procesory", @@ -438,9 +444,9 @@ "Apply fix now?": "Použiť opravu teraz?", "Apply fix now? (The share will be briefly remounted)": "Použiť opravu teraz? (zdieľanie sa na chvíľu znovu pripojí)", "Apply network optimizations": "Použiť sieťové optimalizácie", - "Apply optional security relaxation apparmor:rootlesskit": "Aplikovať voliteľný bezpečnostný relaxačný apartor:rootlesskit", - "Apply optional security relaxation apparmor:unconfined": "Aplikovať voliteľný bezpečnostný relaxačný apparmor:nekonfigurované", - "Apply optional security relaxation seccomp:unconfined": "Aplikovať voliteľné bezpečnostné relaxačné seccomp:unconfined", + "Apply optional security relaxation apparmor:rootlesskit": "Použiť voliteľné uvoľnenie bezpečnostných obmedzení apparmor:rootlesskit", + "Apply optional security relaxation apparmor:unconfined": "Použiť voliteľné uvoľnenie bezpečnostných obmedzení apparmor:unconfined", + "Apply optional security relaxation seccomp:unconfined": "Použiť voliteľné uvoľnenie bezpečnostných obmedzení seccomp:unconfined", "Apply options from the current catalog template? New required paths and settings may be requested. Review the resulting configuration before recreating the CT.": "Použiť možnosti z aktuálnej šablóny katalógu? Môžu sa vyžadovať nové požadované cesty a nastavenia. Pred opätovným vytvorením CT skontrolujte výslednú konfiguráciu.", "Apply read+write access for 'others' on the host directory?": "Nastaviť pre 'others' čítanie aj zápis na priečinku hosta?", "Apply the options from the current catalog template? Your data and configuration are kept.": "Aplikovať možnosti z aktuálnej katalógovej šablóny? Vaše dáta a konfigurácia sú uchovávané.", @@ -464,7 +470,7 @@ "Applying the LAN address to the application URLs...": "Aplikovať adresu LAN na URL aplikácie...", "Applying the initial Nextcloud settings...": "Aplikácia prvých nastavení Nextcloud...", "Applying the mount mode...": "Aplikácia režimu pripojenia...", - "Apprise-api Takes advantage of Apprise through your network with a user-friendly API.": "Apprese-api Využíva aplikáciu Apprise prostredníctvom vašej siete s užívateľsky prívetivým API.", + "Apprise-api Takes advantage of Apprise through your network with a user-friendly API.": "Apprise-api sprístupňuje funkcie Apprise cez sieť pomocou jednoduchého API.", "Architecture": "Architektúra", "Architecture:": "Architektúra:", "Architectures": "Architektúry", @@ -474,7 +480,7 @@ "Archive ready": "Archív pripravený", "Archive size:": "Veľkosť archívu:", "Archive:": "Archív:", - "Ardour is an open source, collaborative effort of a worldwide team including musicians, programmers, and professional recording engineers.": "Ardour je otvorený zdroj spolupráce celosvetového tímu vrátane hudobníkov, programátorov a profesionálnych nahrávacích inžinierov.", + "Ardour is an open source, collaborative effort of a worldwide team including musicians, programmers, and professional recording engineers.": "Ardour je projekt s otvoreným zdrojovým kódom, na ktorom spolupracuje celosvetový tím hudobníkov, programátorov a profesionálnych zvukárov.", "Are you absolutely sure?": "Ste si úplne istý?", "Are you sure you want to continue?": "Naozaj chcete pokračovať?", "Are you sure you want to delete this export?": "Naozaj chcete vymazať tento export?", @@ -486,7 +492,7 @@ "Are you sure you want to unmount this NFS share?": "Naozaj chcete odpojiť toto NFS zdieľanie?", "Are you sure you want to unmount this Samba share?": "Naozaj chcete odpojiť toto Samba zdieľanie?", "Are you sure?": "Ste si istý?", - "Arr suite: applications to install": "Arr suite: aplikácie na inštaláciu", + "Arr suite: applications to install": "Zostava Arr: aplikácie na inštaláciu", "As Proxmox storage": "Ako úložisko Proxmoxu", "As host fstab mount only": "Iba ako mount v host fstab", "Assign GPU PCI function to VM": "Priradiť PCI funkciu GPU k VM", @@ -505,9 +511,9 @@ "Attempting automatic repair...": "Skúšam automatickú opravu...", "Attempting passthrough with this GPU typically results in": "Pokus o passthrough s touto GPU zvyčajne vedie k", "Attention: Removing the subscription banner may cause issues in the web interface after a future update.": "Upozornenie: odstránenie hlásenia o predplatnom môže po budúcej aktualizácii spôsobiť problém vo webovom rozhraní.", - "Audacity is an easy-to-use, multi-track audio editor and recorder. Developed by a group of volunteers as open source.": "Audacity je ľahko použiteľný, multi-track audio editor a rekordér. Vyvinutá skupinou dobrovoľníkov ako open source.", - "Audio device directory": "Adresár audio zariadenia", - "Audiobookshelf is a self-hosted audiobook and podcast server.": "Audiobookshelf je samoobsluha audioknihy a podcast server.", + "Audacity is an easy-to-use, multi-track audio editor and recorder. Developed by a group of volunteers as open source.": "Audacity je jednoduchý viacstopový zvukový editor a rekordér, ktorý dobrovoľníci vyvíjajú ako softvér s otvoreným zdrojovým kódom.", + "Audio device directory": "Adresár zvukových zariadení", + "Audiobookshelf is a self-hosted audiobook and podcast server.": "Audiobookshelf je server na audioknihy a podcasty, ktorý prevádzkujete sami.", "Audit completed. Press Enter to continue...": "Audit dokončený. Pokračujte stlačením Enter...", "Audit socket disabled or not required": "Zásuvka auditu je zakázaná alebo sa nevyžaduje", "Auth key is required.": "Auth key je povinný.", @@ -533,10 +539,10 @@ "Auto-sync was not enabled": "Automatická synchronizácia nebola zapnutá", "Automated Post-Install Script": "Automatický skript po inštalácii", "Automated post-installation script": "Automatický skript po inštalácii", - "Automatic Video Library Manager for TV Shows. It watches for new episodes of your favorite shows, and when they are posted it does its magic.": "Automatický správca videoknižnice pre televízne programy. Sleduje nové epizódy vašich obľúbených šou, a keď sú zverejnené to robí jeho mágiu.", + "Automatic Video Library Manager for TV Shows. It watches for new episodes of your favorite shows, and when they are posted it does its magic.": "Automatický správca knižnice televíznych seriálov. Sleduje nové epizódy obľúbených seriálov a spracuje ich, keď sú dostupné.", "Automatic detection": "Automatická detekcia", - "Automatic private network allocation requires a /24 subnet": "Automatické pridelenie súkromných sietí requires a /24 subnet", - "Automatic video library manager for TV Shows": "Automatický správca video knižnice pre TV Shows", + "Automatic private network allocation requires a /24 subnet": "Automatické pridelenie súkromnej siete vyžaduje podsieť /24", + "Automatic video library manager for TV Shows": "Automatický správca knižnice televíznych seriálov", "Automatic/Unattended": "Automaticky/bez zásahu", "Automation & Scheduling": "Automatizácia a plánovanie", "Available": "Dostupné", @@ -566,17 +572,17 @@ "BIOS from": "BIOS z", "BIOS: OVMF (UEFI)": "BIOS: OVMF (UEFI)", "BOINC is a platform for high-throughput computing on a large scale (thousands or millions of computers). It can be used for volunteer computing (using consumer devices) or grid computing (using organizational resources). It supports virtualized, parallel, and GPU-based applications.": "BOINC je platforma pre vysokovýkonnú výpočtovú techniku vo veľkom meradle (v tisícoch alebo miliónoch počítačov). Môže byť použitý pre dobrovoľnú výpočtovú techniku (pomocou spotrebiteľských zariadení) alebo grid computing (pomocou organizačných zdrojov). Podporuje virtualizované, paralelné a GPU-založené aplikácie.", - "BRIDGE CONFIGURATION ANALYSIS": "ANALÝZA NASTAVENIA BRIDGE", + "BRIDGE CONFIGURATION ANALYSIS": "ANALÝZA NASTAVENIA SIEŤOVÉHO MOSTA (bridge)", "BTRFS:": "BTRFS:", "Baby Buddy web interface": "Webové rozhranie Baby Buddy", - "Babybuddy is a buddy for babies! Helps caregivers track sleep, feedings, diaper changes, tummy time and more to learn about and predict baby's needs without (as much) guess work.": "Babybuddy je kamarát pre deti! Pomáha opatrovateľom sledovať spánok, kŕmenie, zmeny plienky, čas bruška a ďalšie učiť sa a predvídať potreby dieťaťa bez (tak veľa) hádať prácu.", + "Babybuddy is a buddy for babies! Helps caregivers track sleep, feedings, diaper changes, tummy time and more to learn about and predict baby's needs without (as much) guess work.": "Baby Buddy pomáha pri starostlivosti o dieťa sledovaním spánku, kŕmenia, výmen plienok, času na brušku a ďalších činností. Uľahčuje porozumenie potrebám dieťaťa a ich predvídanie.", "Back": "Späť", "Back to job list": "Späť na zoznam úloh", "Back to previous menu or Esc + Enter": "Späť do predchádzajúceho menu alebo Esc + Enter", "Backed up and cleared": "Zálohovaná a vyčistená", "Backend": "Backend", "Backend:": "Backend:", - "Background archive extraction for Arr download queues. No web interface.": "Extrakcia archívu pozadia pre Arr download fronty. Žiadne webové rozhranie.", + "Background archive extraction for Arr download queues. No web interface.": "Rozbaľovanie archívov na pozadí pre fronty sťahovania aplikácií Arr. Bez webového rozhrania.", "Backup — VM and CT backups": "Backup — zálohy VM a CT", "Backup & Recovery": "Zálohovanie a obnova", "Backup Created": "Záloha bola vytvorená", @@ -607,7 +613,7 @@ "Backup kept in": "Záloha je uložená", "Backup location": "Umiestnenie zálohy", "Backup metadata": "Metadáta zálohy", - "Backup of the previous installation verified": "Zálohovanie predchádzajúcej inštalácie overené", + "Backup of the previous installation verified": "Záloha predchádzajúcej inštalácie je overená", "Backup on newer kernel:": "Záloha na novšom kerneli:", "Backup on older kernel:": "Záloha na staršom kerneli:", "Backup origin metadata:": "Metadáta pôvodu zálohy:", @@ -624,39 +630,41 @@ "Backups already on PBS were encrypted with the current key — downloading them will fail unless you first Download the current keyfile to keep a copy.": "Zálohy, ktoré už sú v PBS, boli zašifrované aktuálnym kľúčom - ich stiahnutie zlyhá, ak si najprv nestiahnete a neodložíte aktuálny keyfile.", "Backups already stored on PBS were encrypted with the current keyfile. After this action:": "Zálohy, ktoré sú už uložené v PBS, boli zašifrované aktuálnym keyfile. Po tejto akcii:", "Backups verified": "Potvrdené zálohy", - "Bambu Studio is an open-source, cutting-edge, feature-rich slicing software. It contains project-based workflows, systematically optimized slicing algorithms, and an easy-to-use graphical interface, bringing users an incredibly smooth printing experience.": "Bambu Studio je open-source, špičkový, funkcie-bohaté krájanie softvér. Obsahuje projektové pracovné postupy, systematicky optimalizované algoritmy krájania a ľahko použiteľné grafické rozhranie, ktoré používateľom prináša neuveriteľne hladký zážitok z tlače.", + "Bambu Studio is an open-source, cutting-edge, feature-rich slicing software. It contains project-based workflows, systematically optimized slicing algorithms, and an easy-to-use graphical interface, bringing users an incredibly smooth printing experience.": "Bambu Studio je moderný a funkčne bohatý nástroj s otvoreným zdrojovým kódom na prípravu vrstiev pre 3D tlač. Ponúka projektové pracovné postupy, optimalizované algoritmy a jednoduché grafické rozhranie na plynulú prípravu tlače.", "Bandwidth limit configured": "Limit priepustnosti je nastavený", "Bandwidth test (iperf3)": "Test priepustnosti (iperf3)", "Bandwidth test completed successfully": "Test priepustnosti bol úspešne dokončený", + "Banner removal cancelled by user.": "Odstránenie upozornenia na predplatné bolo zrušené používateľom.", "Base VM created with ID": "Základná VM bola vytvorená s ID", "Base VMID": "Základné VMID", "Base VMID (empty = next free block)": "Základné VMID (prázdne = ďalší voľný blok)", "Base VMID of Nextcloud (empty = next free block)": "Základné VMID Nextcloud (prázdne = ďalší voľný blok)", - "Base VMID of Paperless (empty = next free block)": "Základné VMID bezpapierové (prázdne = ďalší voľný blok)", + "Base VMID of Paperless (empty = next free block)": "Základné VMID Paperless (prázdne = ďalší voľný blok)", "Base VMID of Tandoor (empty = next free block)": "Základné VMID Tandooru (prázdne = ďalší voľný blok)", "Base VMID of the server (empty = next free block)": "Základné VMID servera (prázdne = ďalší voľný blok)", "Bash prompt path": "Cesta v príkazovom riadku Bash", "Bashrc customization completed": "Úprava bashrc je dokončená", "Basic Settings": "Základné nastavenia", "Basic Utilities": "Základné nástroje", - "Bazarr is a companion application to Sonarr and Radarr. It can manage and download subtitles based on your requirements. You define your preferences by TV show or movie and Bazarr takes care of everything for you.": "Bazarr je sprievodná aplikácia na Sonarr a Radarr. To môže spravovať a stiahnuť titulky na základe requirements. Definujete svoje preferencie pomocou TV show alebo filmu a Bazarr sa postará o všetko pre vás.", - "Beets is a music library manager and not, for the most part, a music player. It does include a simple player plugin and an experimental Web-based player, but it generally leaves actual sound-reproduction to specialized tools.": "Beets je manažérom hudobnej knižnice a väčšinou nie hudobným prehrávačom. To zahŕňa jednoduchý prehrávač plugin a experimentálny webový prehrávač, ale všeobecne ponecháva skutočný zvuk-reprodukciu špecializovaných nástrojov.", + "Bazarr is a companion application to Sonarr and Radarr. It can manage and download subtitles based on your requirements. You define your preferences by TV show or movie and Bazarr takes care of everything for you.": "Bazarr dopĺňa Sonarr a Radarr správou a sťahovaním titulkov. Nastavíte si požiadavky pre seriál alebo film a Bazarr sa postará o zvyšok.", + "Beets is a music library manager and not, for the most part, a music player. It does include a simple player plugin and an experimental Web-based player, but it generally leaves actual sound-reproduction to specialized tools.": "Beets je predovšetkým správca hudobnej knižnice. Obsahuje jednoduchý doplnok na prehrávanie a experimentálny webový prehrávač, samotné prehrávanie však spravidla ponecháva špecializovaným nástrojom.", "Before making any changes, we'll create a safety backup.": "Pred akoukoľvek zmenou vytvoríme bezpečnostnú zálohu.", "Beta (develop branch)": "Beta (vetva develop)", "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", - "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.", + "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 možno používať ako desktopového klienta na bežné platby alebo ako plnohodnotný serverový uzol pre obchodníkov a 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...", "Blacklisting nouveau driver...": "Pridávam ovládač nouveau na blacklist...", - "Blender is a free and open-source 3D computer graphics software toolset used for creating animated films, visual effects, art, 3D printed models, motion graphics, interactive 3D applications, virtual reality, and computer games. **This image does not support GPU rendering out of the box only accelerated workspace experience**": "Blender je bezplatný a open-source 3D počítačový grafický softvérový súbor používaný na vytváranie animovaných filmov, vizuálnych efektov, umenia, 3D tlačených modelov, pohybovej grafiky, interaktívnych 3D aplikácií, virtuálnej reality a počítačových hier. **Tento obrázok nepodporuje GPU vykresľovanie z krabice iba zrýchlený zážitok z pracovného priestoru", - "Blinko is an AI-powered card note-taking project. Designed for individuals who want to quickly capture and organize their fleeting thoughts. Blinko allows users to seamlessly jot down ideas the moment they strike, ensuring that no spark of creativity is lost.": "Blinko je projekt, ktorý berie na vedomie karty s umelým pohonom. Určené pre jednotlivcov, ktorí chcú quickly zachytiť a organizovať svoje letmé myšlienky. Blinko umožňuje používateľom bezproblémovo zatĺkať nápady v okamihu, keď udrú, takže žiadna iskra tvorivosti nie je stratená.", + "Blender is a free and open-source 3D computer graphics software toolset used for creating animated films, visual effects, art, 3D printed models, motion graphics, interactive 3D applications, virtual reality, and computer games. **This image does not support GPU rendering out of the box only accelerated workspace experience**": "Blender je bezplatný balík s otvoreným zdrojovým kódom na tvorbu 3D grafiky, animovaných filmov, vizuálnych efektov, umenia, modelov na 3D tlač, pohyblivej grafiky, interaktívnych aplikácií, virtuálnej reality a hier. **Tento obraz predvolene nepodporuje vykresľovanie pomocou GPU, iba zrýchlenie pracovného prostredia.**", + "Blinko is an AI-powered card note-taking project. Designed for individuals who want to quickly capture and organize their fleeting thoughts. Blinko allows users to seamlessly jot down ideas the moment they strike, ensuring that no spark of creativity is lost.": "Blinko je kartový poznámkový systém využívajúci AI. Pomáha rýchlo zachytiť a usporiadať myšlienky hneď, ako prídu, aby sa nestratil žiadny tvorivý nápad.", "Blocked GPU ID": "Blokované ID GPU", "Blocked GPU ID for VM Mode": "Blokované ID GPU pre VM režim", "Blocked device(s)": "Blokované zariadenia", "Blocked device(s):": "Blokované zariadenia:", + "Blockers": "Prekážky", "BookStack web interface": "Webové rozhranie BookStack", "Bookstack is a free and open source Wiki designed for creating beautiful documentation. Featuring a simple, but powerful WYSIWYG editor it allows for teams to create detailed and useful documentation with ease.": "Bookstack je bezplatný a open source Wiki navrhnutý pre vytvorenie krásnej dokumentácie. Vďaka jednoduchému, ale výkonnému WYSIWYG editoru umožňuje tímom jednoducho vytvárať podrobnú a užitočnú dokumentáciu.", "Boot Disk": "Bootovací disk", @@ -679,18 +687,19 @@ "Borg repository path:": "Cesta Borg repozitára:", "Borg restore error log": "Záznam chyby obnovy z Borg", "Borg server SSH user": "SSH používateľ Borg servera", - "Bridge": "Bridge", - "Bridge Analysis": "Analýza bridge rozhraní", - "Bridge Configuration Analysis": "Analýza nastavenia bridge", - "Bridge:": "Bridge:", - "Bridges analyzed": "Skontrolované bridge rozhrania", + "Bridge": "Sieťový most (bridge)", + "Bridge Analysis": "Analýza sieťových mostov (bridge)", + "Bridge Configuration Analysis": "Analýza nastavenia sieťového mosta (bridge)", + "Bridge:": "Sieťový most (bridge):", + "Bridges analyzed": "Skontrolované sieťové mosty (bridge)", "Broken gasket-dkms package state recovered.": "Poškodený stav balíka gasket-dkms bol opravený.", "Browse Your Life in Images": "Prehliadajte svoj život v obrazoch", "Browse manually (advanced)...": "Vybrať ručne (pokročilé)...", "Browsers & Web Desktops": "Prehliadače a webové plochy", "Build and install the gasket and apex kernel modules (DKMS)": "Zostaví a nainštaluje kernel moduly gasket a apex (DKMS)", "Build dependencies installed.": "Závislosti na zostavenie boli nainštalované.", - "Build your personal knowledge base with TriliumNext Notes": "Budujte si osobné znalosti základne s TriliumNext Poznámky", + "Build your personal knowledge base with TriliumNext Notes": "Vytvorte si osobnú znalostnú databázu s TriliumNext Notes", + "Bulk generation requires GITHUB_TOKEN to obtain an immutable revision per application": "Hromadné generovanie vyžaduje GITHUB_TOKEN na získanie nemennej revízie každej aplikácie", "Business & ERP": "Biznis a ERP", "CHANGES APPLIED SUCCESSFULLY": "ZMENY BOLI ÚSPEŠNE POUŽITÉ", "CIFS Client Tools: AVAILABLE": "Nástroje CIFS klienta: DOSTUPNÉ", @@ -713,20 +722,24 @@ "CPU Cores": "CPU jadrá", "CPU MODEL": "MODEL CPU", "CPU Model": "Model CPU", - "CPU cores": "Jadro procesora", + "CPU cores": "Počet jadier CPU", "CPU priority": "Priorita procesora", "CPU set to host,hidden=1,flags=+pcid": "CPU nastavené na host,hidden=1,flags=+pcid", "CPU vendor (intel/amd):": "Výrobca CPU (intel/amd):", "CRITICAL: The selected disk is referenced by a RUNNING VM or CT.": "KRITICKÉ: vybraný disk používa BEŽIACA VM alebo CT.", "CT": "CT", "CT started successfully.": "CT bol úspešne spustený.", + "CT {vmid} ({name}) could not be kept running; it is left stopped": "CT {vmid} ({name}) sa nepodarilo udržať v chode; zostáva zastavený", + "CT {vmid} ({name}) stopped on its own; starting it again (attempt {attempt})": "CT {vmid} ({name}) sa sám zastavil; spúšťa sa znova (pokus {attempt})", "CT {vmid} is a host monitor and had a rule in the host firewall. Allow TCP port {port} from {subnet} through the firewall of this host? Existing firewall rules are not changed.": "CT {vmid} je hostiteľský monitor a mal pravidlo v hostiteľskom firewalle. Povoliť TCP port {port} z {subnet} cez bránu firewall tohto hostiteľa? Existujúce pravidlá brány firewall sa nemenia.", - "CUDA requires a working NVIDIA driver": "CUDA requires pracovný ovládač NVIDIA", - "CUDA requires the NVIDIA Container Toolkit on the host": "CUDA requires the NVIDIA Container Toolkit na hostiteľovi", + "CT {vmid} is one of the {count} containers of {application}.": "CT {vmid} patrí do aplikácie {application} (počet kontajnerov: {count}).", + "CT {vmid}: DHCP client of {name} (IPv{version}) started again": "CT {vmid}: klient DHCP rozhrania {name} (IPv{version}) bol znova spustený", + "CUDA requires a working NVIDIA driver": "CUDA vyžaduje funkčný ovládač NVIDIA", + "CUDA requires the NVIDIA Container Toolkit on the host": "CUDA vyžaduje NVIDIA Container Toolkit na hostiteľovi", "Calculate all kinds of statistics from your (local) Emby or Jellyfin server": "Vypočítajte všetky druhy štatistík z vášho (miestneho) servera Emby alebo Jellyfin", - "Calibre is a powerful and easy to use e-book manager. Users say it's outstanding and a must-have. It'll allow you to do nearly everything and it takes things a step beyond normal e-book software. It's also completely free and open source and great for both casual users and computer experts.": "Calibre je výkonný a ľahko použiteľný e-kniha manažér. Užívatelia hovoria, že je vynikajúci a musí mať. To vám umožní robiť takmer všetko a to trvá veci krok za normálne e-knihy softvér. Je to tiež úplne zadarmo a otvorený zdroj a skvelé ako pre príležitostných užívateľov a počítačových odborníkov.", + "Calibre is a powerful and easy to use e-book manager. Users say it's outstanding and a must-have. It'll allow you to do nearly everything and it takes things a step beyond normal e-book software. It's also completely free and open source and great for both casual users and computer experts.": "Calibre je výkonný a ľahko použiteľný správca elektronických kníh. Ponúka rozsiahle možnosti nad rámec bežných nástrojov a používatelia ho vysoko hodnotia. Je úplne bezplatný, s otvoreným zdrojovým kódom a vhodný pre bežných používateľov aj odborníkov.", "Calibre-web is a web app providing a clean interface for browsing, reading and downloading eBooks using an existing Calibre database. It is also possible to integrate google drive and edit metadata and your calibre library through the app itself.": "Calibre-web je webová aplikácia poskytujúca čisté rozhranie pre prehliadanie, čítanie a sťahovanie elektronických kníh pomocou existujúcej databázy Calibre. Je tiež možné integrovať Google disk a upraviť metaúdaje a knižnicu calibre prostredníctvom samotnej aplikácie.", - "Calligra is an office and graphic art suite by KDE. It is available for desktop PCs, tablet computers, and smartphones. It contains applications for word processing, spreadsheets, presentation, vector graphics, and editing databases.": "Calligra je kancelársky a grafický apartmán KDE. Je k dispozícii pre stolové počítače, tabletové počítače a smartphony. Obsahuje aplikácie na spracovanie slov, tabuľky, prezentáciu, vektorovú grafiku a editačné databázy.", + "Calligra is an office and graphic art suite by KDE. It is available for desktop PCs, tablet computers, and smartphones. It contains applications for word processing, spreadsheets, presentation, vector graphics, and editing databases.": "Calligra je kancelársky a grafický balík od KDE pre počítače, tablety a smartfóny. Obsahuje aplikácie na spracovanie textu, tabuľky, prezentácie, vektorovú grafiku a úpravu databáz.", "Cancel": "Zrušiť", "Cancel restore": "Zrušiť obnovu", "Cancel this setup": "Zrušiť toto nastavenie", @@ -737,8 +750,9 @@ "Cannot continue": "Nedá sa pokračovať", "Cannot create:": "Nedá sa vytvoriť:", "Cannot detect filesystem on": "Nedá sa zistiť súborový systém na", + "Cannot determine installed systemd-zram-generator version": "Nepodarilo sa zistiť verziu nainštalovaného balíka systemd-zram-generator", "Cannot find": "Nedá sa nájsť", - "Cannot identify the vendor of the device:": "Nie je možné identifikovať predajcu zariadenia:", + "Cannot identify the vendor of the device:": "Nepodarilo sa určiť výrobcu zariadenia:", "Cannot inspect current swap configuration": "Nie je možné skontrolovať aktuálnu konfiguráciu výmeny", "Cannot inspect existing ZRAM configurations": "Nie je možné skontrolovať existujúce konfigurácie ZRAM", "Cannot inspect existing ZRAM generator configuration": "Nie je možné skontrolovať existujúcu konfiguráciu generátora ZRAM", @@ -754,8 +768,8 @@ "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.", - "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ť.", + "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": "Oprávnenia capabilities nemožno súčasne ponechať aj všetky odobrať", "Catalog options": "Možnosti katalógu", "Category": "Kategória", "Caution: Maximum mode generates more heat.": "Pozor: maximálny režim vytvára viac tepla.", @@ -783,18 +797,18 @@ "Ceph repository configured for PVE 9": "Repozitár Ceph je nastavený pre PVE 9", "Ceph repository signature verification failed; installation has been stopped": "Overenie podpisu úložiska Ceph zlyhalo;inštalácia bola zastavená", "Ceph version OK:": "Verzia Ceph je v poriadku:", - "Certificate errors are logged in /config/log/letsencrypt inside the container.": "Chyba certifikátu je prihlásená /config/log/letecrypt vo vnútri kontajnera.", + "Certificate errors are logged in /config/log/letsencrypt inside the container.": "Chyby certifikátov sa zaznamenávajú do /config/log/letsencrypt v kontajneri.", "Certificate fingerprint of the PBS server:": "Odtlačok certifikátu PBS servera:", - "Certificate provider: empty for Let's Encrypt, zerossl for ZeroSSL": "Poskytovateľ certifikátu: prázdny pre šifrovanie, nulassl pre ZeroSSL", + "Certificate provider: empty for Let's Encrypt, zerossl for ZeroSSL": "Poskytovateľ certifikátu: prázdne pre Let's Encrypt, zerossl pre ZeroSSL", "Change GPU acceleration?": "Zmeniť zrýchlenie GPU?", "Change Language": "Zmeniť jazyk", "Change Release Channel": "Zmeniť vetvu vydania", "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", - "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.", + "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é monitorovanie webových stránok, rozpoznávanie zmien a upozornenia s otvoreným zdrojovým kódom.", "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é.", "Changes have been applied to the configuration file.": "Zmeny boli zapísané do konfiguračného súboru.", @@ -803,8 +817,8 @@ "Changing Release Channel": "Mením vetvu vydania", "Changing between a privileged and an unprivileged container, or the host monitor mode, requires installing the application again": "Pri prepnutí medzi privilegovaným a neprivilegovaným kontajnerom alebo pri zmene režimu monitorovania hostiteľa je aplikáciu potrebné nainštalovať znova.", "Changing the machine type on an existing installed VM is not safe: it changes the chipset and PCI slot layout, which typically prevents the guest OS from booting.": "Meniť typ stroja na už nainštalovanej VM nie je bezpečné: zmení sa chipset a rozloženie PCI slotov, čo často zabráni štartu hosťovského OS.", - "Changing the rootfs or its storage requires a separate migration": "Zmena rootfs alebo jeho skladovanie requires samostatnú migráciu", - "Changing the storage or size of a disk requires a migration; empty disks are not created": "Zmena úložiska alebo veľkosti disku requires migrácie; prázdne disky nie sú vytvorené", + "Changing the rootfs or its storage requires a separate migration": "Zmena koreňového súborového systému alebo jeho úložiska vyžaduje samostatnú migráciu", + "Changing the storage or size of a disk requires a migration; empty disks are not created": "Zmena úložiska alebo veľkosti disku vyžaduje migráciu; prázdne disky sa nevytvoria", "Check": "Skontrolujte", "Check BIOS/UEFI in Hardware > BIOS — must match what the original VM used": "Skontrolujte BIOS/UEFI v Hardware > BIOS - musí sedieť s tým, čo používala pôvodná VM", "Check Coral USB/M.2 detection": "Skontrolovať detekciu Coral USB/M.2", @@ -816,7 +830,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 +844,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 +859,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ží...", @@ -856,18 +870,18 @@ "Checking the container before the update...": "Kontrola kontajnera pred aktualizáciou...", "Checking the container...": "Kontroluje sa kontajner...", "Checking the device permissions for the application user...": "Kontrola oprávnení zariadenia pre užívateľa aplikácie...", - "Checking the image compatibility:": "Kontrola kompatibility obrázku:", + "Checking the image compatibility:": "Kontroluje sa kompatibilita obrazu:", "Checking the image in the registry...": "Kontrola obrazu v registri...", - "Checking the interrupted operation...": "Kontrola prerušenia operation...", - "Checking the interrupted stack operation...": "Kontrola prerušeného zásobníka operation...", - "Checking the new image without starting it:": "Kontrola nového obrázku bez jeho spustenia:", - "Checking the recreated stack...": "Kontroluje sa znovu vytvorený stack...", - "Checking the remote...": "Kontrolujem ovládač...", + "Checking the interrupted operation...": "Kontrolujem prerušenú operáciu...", + "Checking the interrupted stack operation...": "Kontrolujem prerušenú operáciu celej aplikácie...", + "Checking the new image without starting it:": "Kontrolujem nový obraz bez jeho spustenia:", + "Checking the recreated stack...": "Kontrolujem znovu vytvorené kontajnery aplikácie...", + "Checking the remote...": "Kontroluje sa vzdialené úložisko...", "Checking the restored installation": "Kontrola obnovenej inštalácie", "Checking the restored installation...": "Kontrola obnovenej inštalácie...", - "Checking the stack before recreating...": "Kontrolujem stack pred opätovným vytvorením...", - "Checking the stack before the update...": "Kontrola zásobníka pred aktualizáciou...", - "Checking the updated stack...": "Kontrolujem aktualizovaný stack...", + "Checking the stack before recreating...": "Kontrolujem aplikáciu pred opätovným vytvorením kontajnerov...", + "Checking the stack before the update...": "Kontrolujem aplikáciu pred aktualizáciou...", + "Checking the updated stack...": "Kontrolujem aktualizovanú aplikáciu...", "Checklist post-upgrade finished. Warnings:": "Kontrola po aktualizácii dokončená. Varovania:", "Checklist pre-check finished. Warnings:": "Predbežná kontrola dokončená. Varovania:", "Checks for LVM and storage issues": "Skontroluje problémy s LVM a úložiskami", @@ -903,7 +917,7 @@ "Choose an action:": "Vyberte akciu:", "Choose an export to mount:": "Vyberte export, ktorý chcete pripojiť:", "Choose an option:": "Vyberte možnosť:", - "Choose another bridge for the container in Proxmox (Network) and run the recovery again.": "Vyberte iný most pre kontajner v Proxmox (Sieť) a znova spustite obnovu.", + "Choose another bridge for the container in Proxmox (Network) and run the recovery again.": "V Proxmoxe vyberte pre kontajner iný sieťový most (bridge) v časti Sieť a registráciu zopakujte.", "Choose any host path you want to share with CTs.": "Vyberte ľubovoľnú cestu na serveri, ktorú chcete zdieľať s CT.", "Choose conflict policy": "Vyberte, ako vyriešiť konflikt", "Choose conflict policy for the source VM:": "Vyberte pravidlo riešenia konfliktu pre zdrojovú VM:", @@ -921,7 +935,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ť:", @@ -935,7 +949,7 @@ "Choose what to do with the selected disk:": "Vyberte, čo sa má urobiť s vybraným diskom:", "Choose where to save the backup:": "Vyberte, kam uložiť zálohu:", "Chrome is the official web browser from Google, built to be fast, secure, and customizable.": "Chrome je oficiálny webový prehliadač z Google, postavený tak, aby bol rýchly, bezpečný a prispôsobiteľný.", - "Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.": "Chromium je open-source prehliadač projekt, ktorého cieľom je vybudovať bezpečnejší, rýchlejší a stabilnejší spôsob, ako pre všetkých užívateľov zažiť web.", + "Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.": "Chromium je projekt webového prehliadača s otvoreným zdrojovým kódom, ktorého cieľom je bezpečnejšie, rýchlejšie a stabilnejšie používanie webu.", "Circular dependency:": "Okružná závislosť:", "Clean disk metadata": "Vyčistiť metadáta disku", "Cleaned up": "Vyčistená", @@ -960,20 +974,20 @@ "Clearing login credentials...": "Mažem prihlasovacie údaje...", "Client (run a bandwidth test to a server)": "Klient (spustí test priepustnosti voči serveru)", "Client determines best version to use": "Klient si vyberie najvhodnejšiu verziu", - "Clients reach the VPN through the public address and the UDP port given during the installation, so that port must be forwarded to this container.": "Klienti sa dostanú k VPN prostredníctvom verejnej adresy a portu UDP daného počas inštalácie, takže port musí byť odoslaný do tohto kontajnera.", + "Clients reach the VPN through the public address and the UDP port given during the installation, so that port must be forwarded to this container.": "Klienti sa pripájajú k VPN cez verejnú adresu a port UDP zadané počas inštalácie. Tento port musí byť presmerovaný do kontajnera.", "Cloning Coral driver repository (feranick fork)...": "Klonujem repozitár ovládača Coral (feranick fork)...", "Cloning Lynis from GitHub...": "Klonujem Lynis z GitHubu...", "Cloning and applying NVIDIA patch (keylase/nvidia-patch)...": "Klonujem a používam NVIDIA patch (keylase/nvidia-patch)...", "Closed": "Zatvorené", - "Cloud Database Manager.": "Správca databázy cloud.", + "Cloud Database Manager.": "Správca cloudových databáz.", "Cloud storage synchronization and FUSE mounts": "Synchronizácia cloudového úložiska a pripojenia FUSE", "Cloud-Init Automated Installers": "Automatické inštalátory cez Cloud-Init", "Cluster certificates updated": "Certifikáty klastra aktualizované", "Cluster configuration (advanced)": "Nastavenie klastra (pokročilé)", "Cluster data will be applied automatically at next boot.": "Dáta klastra sa použijú automaticky pri ďalšom štarte.", "Cluster upgrade mode": "Režim aktualizácie klastra", - "Code-server is VS Code running on a remote server, accessible through the browser.": "Kód server je VS kód beží na vzdialenom serveri, prístupný cez prehliadač.", - "CodeProject.AI Server": "CodeProject. AI Server", + "Code-server is VS Code running on a remote server, accessible through the browser.": "Code-server spúšťa VS Code na vzdialenom serveri a sprístupňuje ho cez prehliadač.", + "CodeProject.AI Server": "CodeProject.AI Server", "Command": "Príkaz", "Command failed": "Príkaz zlyhal", "Command override for an unknown service:": "Prepísať príkaz pre neznámu službu:", @@ -981,10 +995,10 @@ "Commenting legacy PVE 8 repository .list files (if any)...": "Komentujem staré .list súbory repozitárov PVE 8 (ak existujú)...", "Commenting legacy ceph.list (if present)...": "Komentujem starý ceph.list (ak existuje)...", "Common Issues Check": "Kontrola bežných problémov", - "Common root for the published views": "Spoločný koreň uverejnených názorov", + "Common root for the published views": "Spoločný koreňový adresár sprístupnených pohľadov", "Communication & Community": "Komunikácia a komunita", "Community Scripts": "Komunitné skripty", - "Community single-container Home Assistant OS image": "Jednoduchý kontajner Spoločenstva Home Assistant OS image", + "Community single-container Home Assistant OS image": "Komunitný obraz Home Assistant OS pre jeden kontajner", "Compatibility check": "Kontrola kompatibility", "Compatibility check — OK": "Kontrola kompatibility - OK", "Compatibility check — issues detected": "Kontrola kompatibility - zistené problémy", @@ -999,7 +1013,7 @@ "Complete restore": "Úplná obnova", "Complete the DSM installation wizard": "Dokončite sprievodcu inštaláciou DSM", "Complete the ZimaOS installation wizard": "Dokončite sprievodcu inštaláciou ZimaOS", - "Complete the media server and Seerr accounts, the Bazarr providers and the SABnzbd Usenet credentials when they are selected.": "Dokončiť mediálny server a Seerr účtov, poskytovatelia Bazarr a SABnzbd Usenet credentials, keď sú vybraní.", + "Complete the media server and Seerr accounts, the Bazarr providers and the SABnzbd Usenet credentials when they are selected.": "Ak ste ich vybrali, dokončite účty mediálneho servera a Seerr, poskytovateľov Bazarr a prihlasovacie údaje Usenetu pre SABnzbd.", "Completed": "Dokončené", "Completed Successfully with GPU passthrough configured!": "Úspešne dokončené aj s nastaveným priamym priradením GPU.", "Completed Successfully!": "Úspešne dokončené.", @@ -1009,16 +1023,19 @@ "Completed. Disks added to CT {ctid}: {count}.": "Dokončené. Disky pridané do CT {ctid}: {count}.", "Completed. Disks added to VM {vmid}: {count}.": "Dokončené. Disky pridané do VM {vmid}: {count}.", "Completed. Press Enter to return to menu...": "Dokončené. Stlačte Enter pre návrat do menu...", - "Completing its final cleanup...": "Dokončiť záverečné čistenie...", + "Completing its final cleanup...": "Dokončujem záverečné upratovanie...", "Completing pending package configurations...": "Dokončenie čakajúcich konfigurácií balíka...", "Compliance checking (PCI-DSS, HIPAA, etc.)": "kontroly súladu (PCI-DSS, HIPAA atď.)", "Component to uninstall manually (no --auto-uninstall yet):": "Súčasť na ručné odinštalovanie (zatiaľ bez --auto-uninstall):", "Component was installed on the backup source but no matching hardware was found on this host.": "Súčasť bola nainštalovaná na zdrojovom hostovi zálohy, ale na tomto hostovi sa nenašiel zodpovedajúci hardvér.", "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 capabilities validated in the LXC user namespace:": "Oprávnenia capabilities zo súboru Compose boli overené v používateľskom mennom priestore LXC:", + "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 file of the application": "Súbor Compose aplikácie", + "Compose file of this host": "súboru Compose z tohto hostiteľa", + "Compose ports must be a list.": "Položka ports v súbore Compose musí byť zoznam.", + "Compose volumes must be a list.": "Položka volumes v súbore Compose musí byť zoznam.", "Compressed size:": "Veľkosť po kompresii:", "Compressing": "Komprimujem", "Compression": "Kompresia", @@ -1026,7 +1043,7 @@ "Concise output of logical volumes": "Stručný výpis logických zväzkov", "Concise output of physical volumes": "Stručný výpis fyzických zväzkov", "Concise output of volume groups": "Stručný výpis skupín zväzkov", - "Concurrent change while restoring the start at boot setting": "Súčasná zmena pri obnovení štartu pri štarte", + "Concurrent change while restoring the start at boot setting": "Pri obnove nastavenia automatického spustenia sa zistila súbežná zmena", "Configuration Analysis": "Analýza nastavenia", "Configuration Menu": "Nastavenia", "Configuration Summary:": "Zhrnutie nastavenia:", @@ -1057,12 +1074,13 @@ "Configure Proxmox APT repositories": "Nastaviť APT repozitáre Proxmoxu", "Configure Samba Client in LXC (only privileged)": "Nastaviť Samba klienta v LXC (iba privilegovaný)", "Configure Samba Server in LXC (only privileged)": "Nastaviť Samba server v LXC (iba privilegovaný)", + "Configure and install an application": "Nastaviť a nainštalovať aplikáciu", "Configure as guest (no authentication)": "Nastaviť ako hosť (bez prihlásenia)", "Configure backup destinations": "Nastaviť ciele záloh", "Configure backup destinations (PBS, Borg, local)": "Nastaviť ciele záloh (PBS, Borg, lokálne)", "Configure the Google Coral APT repository": "Nastaví Google Coral APT repozitár", "Configure the optional variable": "Nakonfigurujte voliteľnú premennú", - "Configure the remote in the Rclone Web UI first. Checking its name may start a stopped CT, even in a dry run. Applying the mount restarts the CT and attempts to publish two FUSE views on the host; a dry run does not publish them.": "Najprv nakonfigurujte diaľkové ovládanie vo webovom používateľskom rozhraní Rclone. Kontrola jeho názvu môže spustiť zastavený CT, dokonca aj pri chode nasucho. Použitie pripojenia reštartuje CT a pokúsi sa publikovať dva pohľady FUSE na hostiteľovi;suchý pokus ich nezverejňuje.", + "Configure the remote in the Rclone Web UI first. Checking its name may start a stopped CT, even in a dry run. Applying the mount restarts the CT and attempts to publish two FUSE views on the host; a dry run does not publish them.": "Najprv nastavte vzdialené úložisko vo webovom rozhraní Rclone. Kontrola jeho názvu môže spustiť zastavený kontajner aj pri skúšobnom behu. Použitie pripojenia kontajner reštartuje a pokúsi sa sprístupniť dva pohľady FUSE na hostiteľovi. Skúšobný beh tieto pohľady nesprístupňuje.", "Configure with username and password": "Nastaviť meno a heslo", "Configured Ports": "Nastavené porty", "Configured but doesn't exist": "Je nastavené, ale neexistuje", @@ -1131,7 +1149,7 @@ "Confirm export": "Potvrdiť export", "Confirm password for": "Potvrďte heslo pre", "Confirm recovery passphrase:": "Potvrďte obnovovaciu frázu:", - "Confirm that host data is not reverted": "Potvrďte, že údaje hostiteľa nie sú vrátené", + "Confirm that host data is not reverted": "Potvrďte, že údaje v adresároch hostiteľa sa pri obnove nevracajú do predchádzajúceho stavu", "Confirm the keyfile passphrase:": "Potvrďte frázu keyfile:", "Confirm the mount path is visible.": "Overte, že cesta pripojenia je viditeľná.", "Confirm the password:": "Potvrďte heslo:", @@ -1143,7 +1161,7 @@ "Conflicting path included in backup:": "Konfliktná cesta zahrnutá v zálohe:", "Conflicting utilities removed": "Konfliktné nástroje odstránené", "Connect a Coral Accelerator and try again.": "Pripojte Coral Accelerator a skúste to znova.", - "Connect it, or remove it from the container in Proxmox (Resources), and run the recovery again.": "Pripojte ho alebo ho odstráňte z kontajnera v Proxmox (zdroje) a znova spustite obnovenie.", + "Connect it, or remove it from the container in Proxmox (Resources), and run the recovery again.": "Pripojte zariadenie alebo ho odstráňte z konfigurácie kontajnera v Proxmoxe (Zdroje) a registráciu zopakujte.", "Connect your devices and users together in your own secure virtual private network.": "Spojte svoje zariadenia a užívateľov vo vlastnej zabezpečenej virtuálnej súkromnej sieti.", "Connect your devices into a secure WireGuard®-based overlay network with SSO, MFA and granular access controls.": "Pripojte svoje zariadenia do zabezpečenej prekryvnej siete založenej na WireGuard® s ovládacími prvkami SSO, MFA a granulovaného prístupu.", "Connected": "Pripojené", @@ -1161,6 +1179,7 @@ "Consider security implications for production environments": "V produkčnom prostredí zvážte bezpečnostné dôsledky", "Consider visiting the repository and supporting the project.": "Zvážte návštevu repozitára a podporu projektu.", "Console log:": "Konzolový log:", + "Consume/export": "Priečinky consume a export", "Container": "Kontajner", "Container — LXC root directories": "Kontajner — root priečinky LXC", "Container ID": "ID kontajnera", @@ -1172,10 +1191,10 @@ "Container Status": "Stav kontajnera", "Container checked": "Skontrolovaný kontajner", "Container configuration not found": "Nastavenie kontajnera sa nenašlo", - "Container configured (not started):": "Kontajner nastavený (nezačína sa):", + "Container configured (not started):": "Kontajner je nastavený (nie je spustený):", "Container converted to privileged": "Kontajner prevedený na privilegovaný", "Container created:": "Vytvorený kontajner:", - "Container data targeted for deletion:": "Údaje kontajnera zacielené na odstránenie:", + "Container data targeted for deletion:": "Údaje kontajnera určené na vymazanie:", "Container did not become ready in time. Skipping driver installation.": "Kontajner nebol včas pripravený. Inštaláciu ovládača preskakujem.", "Container did not start in time.": "Kontajner sa nestihol spustiť.", "Container distro": "Distribúcia kontajnera", @@ -1184,15 +1203,15 @@ "Container is already stopped.": "Kontajner už je zastavený.", "Container is running. Restart to apply changes?": "Kontajner beží. Reštartovať ho, aby sa zmeny prejavili?", "Container is stopped. Start it now to verify the mount works?": "Kontajner je zastavený. Spustiť ho teraz a overiť, či mount funguje?", - "Container kept with its data; the installation was not validated:": "Kontajner uchovávaný so svojimi údajmi; zariadenie nebolo potvrdené:", + "Container kept with its data; the installation was not validated:": "Kontajner aj jeho údaje zostávajú zachované; inštalácia nebola overená:", "Container mount point:": "Mount point v kontajneri:", "Container must be stopped before conversion": "Kontajner musí byť pred prevodom zastavený", - "Container prepared for the stack:": "Nádoba pripravená na zásobník:", - "Container recreated": "Zrekonštruovaný kontajner", + "Container prepared for the stack:": "Kontajner pripravený pre zostavu:", + "Container recreated": "Kontajner bol znova vytvorený", "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 +1219,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", @@ -1219,7 +1238,7 @@ "Containers that will be created (one LXC per service, on a private network):": "Kontajnery, ktoré budú vytvorené (jeden LXC na službu, na súkromnej sieti):", "Containers that will receive this device": "Kontajnery, ktoré dostanú toto zariadenie", "Containers that will receive this path": "Kontajnery, ktoré dostanú túto cestu", - "Containers:": "Obaly:", + "Containers:": "Kontajnery:", "Contains files": "Obsahuje súbory", "Contains:": "Obsahuje:", "Content Types": "Typy obsahu", @@ -1240,7 +1259,7 @@ "Continue: Proceed with conversion": "Pokračovať: spustiť prevod", "Continue?": "Pokračovať?", "Continuing with your selection.": "Pokračujem s vaším výberom.", - "Contradictory tmpfs options": "Možnosti kontrastných tmpfs", + "Contradictory tmpfs options": "Protichodné voľby tmpfs", "Controller": "Controller", "Controller + NVMe": "Controller + NVMe", "Controller + NVMe assignment will be written now and become active after host reboot.": "Priradenie Controller + NVMe sa teraz zapíše a aktivuje sa po reštarte servera.", @@ -1271,8 +1290,8 @@ "Converting image using command:": "Konvertujem obraz pomocou príkazu:", "Converting the container to privileged...": "Konverzia kontajnera na privilegovaný...", "Converts to deb822; keeps .list backups as .bak": "Prevedie na deb822; zálohy .list ponechá ako .bak", - "Coordinated backups require zstd": "Koordinované zálohy require zstd", - "Cops by Sébastien Lucas, now maintained by MikesPub, stands for Calibre OPDS (and HTML) Php Server.": "Cops by Sébastien Lucas, teraz udržiavané MikesPub, znamená Calibre OPDS (a HTML) Php Server.", + "Coordinated backups require zstd": "Koordinované zálohy vyžadujú zstd", + "Cops by Sébastien Lucas, now maintained by MikesPub, stands for Calibre OPDS (and HTML) Php Server.": "COPS od Sébastiena Lucasa, dnes spravovaný MikesPub, znamená Calibre OPDS (a HTML) PHP Server.", "Copy a peer configuration to the host with: pct pull /config/peer1/peer1.conf peer1.conf": "Kopírovať konfiguráciu peer k hostiteľovi s: pct pull /config/peer1/peer1.conf peer1.conf", "Copy failed": "Kopírovanie zlyhalo", "Copy that file offsite yourself, or download it from the Monitor.": "Skopírujte si tento súbor mimo servera sami alebo ho stiahnite z Monitoru.", @@ -1290,7 +1309,7 @@ "Coral M.2 Apex detected, configuring...": "Našiel sa Coral M.2 Apex, nastavujem...", "Coral PCIe/M.2": "Coral PCIe/M.2", "Coral PCIe/M.2 device node": "Uzol zariadenia Coral PCIe/M.2", - "Coral PCIe/M.2 node (e.g. /dev/apex_0)": "Coral PCIe/M.2 uzly (napr. /dev/apex_0)", + "Coral PCIe/M.2 node (e.g. /dev/apex_0)": "Uzol zariadenia Coral PCIe/M.2 (napr. /dev/apex_0)", "Coral TPU Installation": "Inštalácia Coral TPU", "Coral TPU Uninstall": "Odinštalovanie Coral TPU", "Coral TPU device nodes detected with correct group (apex).": "Uzly zariadenia Coral TPU sa našli so správnou skupinou (apex).", @@ -1308,18 +1327,19 @@ "Coral packages purged.": "Balíky Coral boli úplne odstránené.", "Coral uninstallation completed.": "Odinštalovanie Coral je hotové.", "Core Proxmox packages reinstalled successfully": "Základné balíky Proxmoxu boli úspešne preinštalované", - "Core is running, but not responding over HTTP on 80/8123": "Jadro beží, ale neodpovedá cez HTTP na 80/8123", - "Core is still on the initial installation page": "Jadro je stále na úvodnej inštalačnej stránke", + "Core is running, but not responding over HTTP on 80/8123": "Home Assistant Core beží, ale neodpovedá cez HTTP na porte 80 ani 8123", + "Core is still on the initial installation page": "Home Assistant Core je stále na úvodnej inštalačnej stránke", "Core packages": "Základné balíky", - "Cores": "Jadro", - "Corrupted gzip layer": "Vrstvená vrstva gzipu", + "Cores": "Počet jadier", + "Corrupted gzip layer": "Poškodená vrstva gzip", + "Could not activate dev-zram0.swap": "Nepodarilo sa aktivovať jednotku dev-zram0.swap", "Could not add": "Nepodarilo sa pridať", "Could not add disk": "Disk sa nepodarilo pridať", "Could not add the confirmed host firewall rule": "Potvrdené pravidlo firewallu hostiteľa sa nepodarilo pridať", "Could not add the device to the container:": "Nepodarilo sa pridať zariadenie do kontajnera:", "Could not add the mount point:": "Nepodarilo sa pridať bod pripojenia:", "Could not apply the Compose extra hosts": "Nepodarilo sa použiť extra hostiteľov", - "Could not apply the Compose supplementary groups": "Nepodarilo sa použiť zostavu doplnkových skupín", + "Could not apply the Compose supplementary groups": "Nepodarilo sa použiť doplnkové skupiny zo súboru Compose", "Could not apply the Jellyfin configuration:": "Nepodarilo sa použiť konfiguráciu Jellyfin:", "Could not apply the installer profile": "Nepodarilo sa použiť profil inštalátora", "Could not apply the pre-start repair:": "Nepodarilo sa použiť predštartovaciu opravu:", @@ -1329,12 +1349,14 @@ "Could not change VM virtual display to vga: std": "Virtuálne zobrazenie VM sa nepodarilo zmeniť na vga: std", "Could not check the NVIDIA GPU": "Nepodarilo sa skontrolovať GPU NVIDIA", "Could not clone any gasket-driver repository. Check your internet connection and": "Nepodarilo sa naklonovať žiadny repozitár gasket-driver. Skontrolujte internetové pripojenie a", - "Could not complete private network release:": "Nepodarilo sa dokončiť vydanie súkromnej siete:", + "Could not complete or verify the repository switch; changes may be partial and repository state is unknown. Inspect {ui} before retrying; no automatic rollback was attempted.": "Nepodarilo sa dokončiť alebo overiť zmenu repozitárov; zmeny môžu byť čiastočné a stav repozitárov je neznámy. Pred ďalším pokusom skontrolujte {ui}. Automatický návrat do pôvodného stavu sa nevykonal.", + "Could not complete private network release:": "Nepodarilo sa dokončiť uvoľnenie súkromnej siete:", "Could not configure IOMMU kernel parameters automatically. Configure manually and reboot.": "Parametre kernelu pre IOMMU sa nepodarilo nastaviť automaticky. Nastavte ich ručne a reštartujte.", "Could not convert the OCI rootfs to privileged": "Nepodarilo sa previesť OCI rootfs na privilegované", "Could not copy the PVE keyfile into place. Check permissions on:": "PVE keyfile sa nepodarilo skopírovať na správne miesto. Skontrolujte oprávnenia na:", "Could not copy the keyfile into place.": "Keyfile sa nepodarilo skopírovať na správne miesto.", "Could not copy the keyfile into place. Check permissions on:": "Keyfile sa nepodarilo skopírovať na správne miesto. Skontrolujte oprávnenia na:", + "Could not create ZRAM generator directory": "Nepodarilo sa vytvoriť adresár pre konfiguráciu generátora ZRAM", "Could not create a temporary directory for the NVIDIA Container Toolkit.": "Nepodarilo sa vytvoriť dočasný adresár pre NVIDIA Container Toolkit.", "Could not create converter directory:": "Priečinok pre konvertor sa nepodarilo vytvoriť:", "Could not create destination directory:": "Cieľový priečinok sa nepodarilo vytvoriť:", @@ -1354,7 +1376,7 @@ "Could not download recovery blob from PBS.": "Nepodarilo sa stiahnuť obnovovací balíček z PBS.", "Could not download the NVIDIA Container Toolkit repository definition.": "Nepodarilo sa stiahnuť definíciu úložiska NVIDIA Container Toolkit.", "Could not download the NVIDIA Container Toolkit signing key.": "Nepodarilo sa stiahnuť podpisový kľúč NVIDIA Container Toolkit.", - "Could not download the image": "Nepodarilo sa stiahnuť obrázok", + "Could not download the image": "Obraz sa nepodarilo stiahnuť", "Could not download the installer.": "Inštalátor sa nepodarilo stiahnuť.", "Could not enable the privileged profile before the first start": "Nepodarilo sa povoliť privilegovaný profil pred prvým začiatkom", "Could not export ZFS pool": "ZFS pool sa nepodarilo exportovať", @@ -1372,8 +1394,8 @@ "Could not install sshpass automatically (no internet?). Falling back to manual paste mode — you'll see the line to copy onto the server next.": "sshpass sa nepodarilo nainštalovať automaticky (bez internetu?). Prepínam na ručné vloženie - hneď uvidíte riadok, ktorý treba skopírovať na server.", "Could not install systemd-zram-generator": "Nepodarilo sa nainštalovať systemd-zram-generator", "Could not install the NVIDIA Container Toolkit signing key.": "Nepodarilo sa nainštalovať podpisový kľúč NVIDIA Container Toolkit.", - "Could not install the required packages:": "Nepodarilo sa nainštalovať required balíčky:", - "Could not install the stack startup hook": "Nepodarilo sa nainštalovať stack štartovací hák", + "Could not install the required packages:": "Požadované balíky sa nepodarilo nainštalovať:", + "Could not install the stack startup hook": "Spúšťací skript zostavy sa nepodarilo nainštalovať", "Could not install vzdump hook in /etc/vzdump.conf": "Nepodarilo sa nainštalovať vzdump hook do /etc/vzdump.conf", "Could not load shared functions. Script cannot continue.": "Nepodarilo sa načítať zdieľané funkcie. Skript nemôže pokračovať.", "Could not load the host kernel module:": "Nepodarilo sa načítať modul hostiteľského jadra:", @@ -1389,21 +1411,22 @@ "Could not prepare the file bind mount target:": "Nepodarilo sa pripraviť cieľ pripojenia súboru:", "Could not publish pending restore. Previous pending restore was kept.": "Nepodarilo sa zverejniť čakajúce obnovenie. Predchádzajúce čakajúce obnovenie bolo zachované.", "Could not push the key. Check the password and that": "Kľúč sa nepodarilo odoslať. Skontrolujte heslo a to, že", - "Could not query the image registry": "Nepodarilo sa nájsť obrazový register", + "Could not query the image registry": "Nepodarilo sa získať údaje z registra obrazov", "Could not reach {registry}. Check its address, DNS and network access.": "Nepodarilo sa dosiahnuť {registry}. Skontrolujte jeho adresu, DNS a prístup k sieti.", + "Could not reach {url} after 3 attempts: {reason}": "Adresa {url} nie je dostupná ani po 3 pokusoch: {reason}", "Could not read SMART data from": "SMART dáta sa nepodarilo prečítať z", "Could not read VM configuration.": "Nastavenie VM sa nepodarilo prečítať.", "Could not read the CUDA compute capability": "Nepodarilo sa prečítať výpočtovú schopnosť CUDA", "Could not read the NVIDIA driver version": "Nepodarilo sa prečítať verziu ovládača NVIDIA", "Could not read the host firewall rules": "Pravidlá firewallu hostiteľa sa nepodarilo načítať", - "Could not read the image from {registry}. Check the reference and sign in from Registry accounts.": "Nepodarilo sa prečítať obrázok z {registry}. Skontrolujte referenciu a prihláste sa z účtov Registra.", + "Could not read the image from {registry}. Check the reference and sign in from Registry accounts.": "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:", @@ -1423,6 +1446,7 @@ "Could not stage pending restore. Nothing new was scheduled.": "Nepodarilo sa pripraviť čakajúce obnovenie. Nič nové nebolo naplánované.", "Could not stop LXC": "LXC sa nepodarilo zastaviť", "Could not stop ZRAM swap; profile configuration remains": "Nepodarilo sa zastaviť výmenu ZRAM; konfigurácia profilu zostáva zachovaná", + "Could not stop existing dev-zram0.swap": "Nepodarilo sa zastaviť existujúcu jednotku dev-zram0.swap", "Could not translate the Compose command/entrypoint": "Nepodarilo sa preložiť príkaz/bod vstupu", "Could not unload nouveau module (may be in use). The blacklist will take effect after reboot. Installation will continue but a reboot will be required.": "Modul nouveau sa nepodarilo uvoľniť (možno sa práve používa). Blacklist sa prejaví po reštarte. Inštalácia bude pokračovať, ale reštart bude potrebný.", "Could not unmount": "Nepodarilo sa odpojiť", @@ -1430,7 +1454,9 @@ "Could not unmount the container filesystem:": "Nepodarilo sa odpojiť súborový systém kontajnera:", "Could not unmount — disk may be busy. Removing fstab entry anyway.": "Nepodarilo sa odpojiť - disk sa možno používa. Záznam z fstab aj tak odstraňujem.", "Could not update config file.": "Konfiguračný súbor sa nepodarilo aktualizovať.", - "Could not verify removal of the managed host firewall rule.": "Nepodarilo sa overiť odstránenie pravidla brány firewall spravovaného hostiteľa.", + "Could not verify removal of the managed host firewall rule.": "Nepodarilo sa overiť odstránenie spravovaného pravidla firewallu hostiteľa.", + "Could not write ZRAM generator configuration": "Nepodarilo sa zapísať konfiguráciu generátora ZRAM", + "Could not write ZRAM package ownership state": "Nepodarilo sa zapísať údaj o tom, či balík ZRAM nainštaloval ProxMenux", "Could not write to:": "Nepodarilo sa zapísať do:", "Crafty Controller default login": "Crafty Controller predvolené prihlásenie", "Create Directory": "Vytvoriť priečinok", @@ -1497,29 +1523,29 @@ "Creating pigz wrapper script...": "Vytváram wrapper skript pre pigz...", "Creating the backup": "Vytvorenie zálohy", "Creating the container...": "Vytváram kontajner...", - "Creating the container: applying the image configuration...": "Vytváranie kontajnera: použitie konfigurácie obrázka...", - "Creating the container: extracting the image": "Vytvorenie kontajnera: extrahovanie obrázka", + "Creating the container: applying the image configuration...": "Vytváranie kontajnera: používajú sa nastavenia obrazu...", + "Creating the container: extracting the image": "Vytváranie kontajnera: rozbaľuje sa obraz", "Creating the container: preparing its disk...": "Vytváranie kontajnera: príprava jeho disku...", - "Creating the container: reading the image...": "Vytváranie kontajnera: čítanie obrázka...", + "Creating the container: reading the image...": "Vytváranie kontajnera: načítava sa obraz...", "Creating the initial administrator...": "Vytvorenie počiatočného správcu...", "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é", "Cross-kernel — paths hidden from picker": "Rozdielny kernel - cesty skryté vo výbere", - "Cross-platform file sharing made easy.": "Cross-platform súboru zdieľanie jednoduché.", - "Cross-platform monitoring tool.": "Monitorovací nástroj s viacerými platformami.", + "Cross-platform file sharing made easy.": "Jednoduché zdieľanie súborov medzi platformami.", + "Cross-platform monitoring tool.": "Multiplatformový monitorovací nástroj.", "Cross-version detected — safe restore mode": "Zistená rozdielna verzia - bezpečný režim obnovy", "Current": "Aktuálne", "Current CIFS mounts:": "Aktuálne CIFS pripojenia:", @@ -1529,8 +1555,8 @@ "Current NFS client script supports privileged LXC only.": "Aktuálny skript NFS klienta podporuje iba privilegovaný LXC.", "Current NFS exports in CT": "Aktuálne NFS exporty v CT", "Current NFS mounts:": "Aktuálne NFS pripojenia:", - "Current NVIDIA inventory resolved: a refresh is required": "Aktuálne NVIDIA inventár vyriešený: obnovovanie je required", - "Current NVIDIA inventory resolved: no refresh is required": "Aktuálne NVIDIA inventár vyriešený: žiadne obnovenie je required", + "Current NVIDIA inventory resolved: a refresh is required": "Aktuálny zoznam zariadení NVIDIA bol zistený: je potrebné obnovenie", + "Current NVIDIA inventory resolved: no refresh is required": "Aktuálny zoznam zariadení NVIDIA bol zistený: obnovenie nie je potrebné", "Current Network Configuration": "Aktuálne nastavenie siete", "Current PBS Version": "Aktuálna verzia PBS", "Current PVE Version": "Aktuálna verzia PVE", @@ -1591,7 +1617,7 @@ "Customization": "Prispôsobenie", "Customize bashrc": "Prispôsobiť bashrc", "Customizing bashrc for root user...": "Upravujem bashrc pre používateľa root...", - "DB Browser for SQLite is a high quality, visual, open source tool to create, design, and edit database files compatible with SQLite.": "DB prehliadač pre SQLite je vysoko kvalitný, vizuálny, open source nástroj na vytváranie, navrhovanie a úpravu databázových súborov kompatibilných so SQLite.", + "DB Browser for SQLite is a high quality, visual, open source tool to create, design, and edit database files compatible with SQLite.": "DB Browser for SQLite je kvalitný vizuálny nástroj s otvoreným zdrojovým kódom na vytváranie, navrhovanie a úpravu databázových súborov SQLite.", "DHCP (automatic)": "DHCP (automatické)", "DISABLED unless you enable it": "VYPNUTÉ, kým to nezapnete", "DKMS add failed. Check": "Pridanie do DKMS zlyhalo. Skontrolujte", @@ -1605,11 +1631,11 @@ "DKMS registrations removed.": "registrácie DKMS boli odstránené.", "DNS Resolution": "Preklad DNS", "DNS lookup for a domain": "DNS vyhľadanie domény", - "DNS plugin used with dns validation (cloudflare, duckdns, ovh...)": "DNS plugin použitý s dns validácia (cloudflare, duckdns, ovh...)", + "DNS plugin used with dns validation (cloudflare, duckdns, ovh...)": "Doplnok DNS na overenie cez dns (cloudflare, duckdns, ovh...)", "DNS server written in the client configurations": "DNS server napísaný v klientskych konfiguráciách", - "DNS server written in the peer configurations (auto or an IP address)": "DNS server napísaný v peer konfiguráciách (auto alebo IP adresa)", - "DOGWALK is Blender Studio's long awaited second game project, focused on creating a bite-sized interactive storytelling playground. Play as a big adorable dog and explore the winter woods with a little kid.": "DOGWALK je Blender Štúdio dlho očakávaný druhý herný projekt, zameraný na vytvorenie uhryznutie-veľké interaktívne rozprávanie príbehov ihrisko. Hrať ako veľký rozkošný pes a preskúmať zimné lesy s malým dieťaťom.", - "DOSBox Staging is a modern continuation of DOSBox a free and open-source emulator that enables the execution of MS-DOS software, especially video games.": "DOSBox Staging je moderné pokračovanie DOSBoxu zadarmo a open-source emulátor, ktorý umožňuje realizáciu MS-DOS softvéru, najmä videohry.", + "DNS server written in the peer configurations (auto or an IP address)": "Server DNS zapisovaný do nastavení účastníkov (auto alebo IP adresa)", + "DOGWALK is Blender Studio's long awaited second game project, focused on creating a bite-sized interactive storytelling playground. Play as a big adorable dog and explore the winter woods with a little kid.": "DOGWALK je druhý herný projekt Blender Studio s krátkym interaktívnym príbehom. Hrajte za veľkého roztomilého psa a skúmajte zimný les s malým dieťaťom.", + "DOSBox Staging is a modern continuation of DOSBox a free and open-source emulator that enables the execution of MS-DOS software, especially video games.": "DOSBox Staging je moderným pokračovaním DOSBoxu, bezplatného emulátora s otvoreným zdrojovým kódom na spúšťanie softvéru MS-DOS, najmä hier.", "DVB device directory": "Adresár zariadení DVB", "Daily at 02:00": "Denne o 02:00", "Daily at 03:00": "Denne o 03:00", @@ -1617,8 +1643,8 @@ "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 volumes protected": "Chránené objemy údajov", + "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", "Database (a SQLite file, or postgresql://user:password@address:5432/name)": "Databáza (súbor SQLite alebo postgresql://user:password@address:5432/name)", @@ -1628,16 +1654,16 @@ "Database type (sqlite, mysql or pgsql)": "Typ databázy (sqlite, mysql alebo pgsql)", "Databases": "Databázy", "Datastore name:": "Názov datastore:", - "Davos is an FTP automation tool that periodically scans given host locations for new files. It can be configured for various purposes, including listening for specific files to appear in the host location, ready for it to download and then move, if required. It also supports completion notifications as well as downstream API calls, to further the workflow.": "Davos je nástroj na automatizáciu FTP, ktorý pravidelne skenuje ubytovacie miesta pre nové súbory. To môže byť nakonfigurovaný pre rôzne účely, vrátane počúvania pre konkrétne súbory sa objaví v mieste hostiteľa, pripravený na stiahnutie a potom presunúť, ak required. Podporuje aj oznámenia o dokončení, ako aj následné výzvy týkajúce sa API na podporu pracovného postupu.", - "Ddclient is a Perl client used to update dynamic DNS entries for accounts on Dynamic DNS Network Service Provider. It was originally written by Paul Burry and is now mostly by wimpunk. It has the capability to update more than just dyndns and it can fetch your WAN-ipaddress in a few different ways.": "Ddclient je Perl klient používaný na aktualizáciu dynamických položiek DNS pre účty na Dynamic DNS Network Service Provider. Pôvodne bol napísaný Paulom Burrym a teraz je väčšinou zbabelý. Má schopnosť aktualizovať viac ako len dyndns a môže priniesť WAN-ipaddress niekoľkými rôznymi spôsobmi.", + "Davos is an FTP automation tool that periodically scans given host locations for new files. It can be configured for various purposes, including listening for specific files to appear in the host location, ready for it to download and then move, if required. It also supports completion notifications as well as downstream API calls, to further the workflow.": "Davos automatizuje FTP prenosy pravidelným vyhľadávaním nových súborov na určených miestach servera. Vie čakať na konkrétne súbory, stiahnuť ich a podľa potreby presunúť. Podporuje upozornenia po dokončení aj následné volania API.", + "Ddclient is a Perl client used to update dynamic DNS entries for accounts on Dynamic DNS Network Service Provider. It was originally written by Paul Burry and is now mostly by wimpunk. It has the capability to update more than just dyndns and it can fetch your WAN-ipaddress in a few different ways.": "Ddclient je klient v Perle na aktualizáciu záznamov dynamického DNS u poskytovateľov tejto služby. Pôvodne ho napísal Paul Burry, dnes ho spravuje najmä wimpunk. Podporuje aj iné služby než dyndns a verejnú IP adresu siete WAN zisťuje viacerými spôsobmi.", "Deactivate Monitor": "Vypnúť Monitor", "Deactivate ProxMenux Monitor": "Vypnúť ProxMenux Monitor", "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)", - "DeepSeek Harness “Everything is a Plugin“.": "DeepSeek Harness, všetko je Plugin.", + "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 doplnok.", "Default ACLs applied for group inheritance.": "Predvolené ACL boli použité pre dedenie skupiny.", "Default Credentials": "Predvolené prihlasovacie údaje", "Default Gateway": "Predvolená brána", @@ -1664,14 +1690,14 @@ "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?", - "Delete the images to free the space?": "Odstrániť obrázky na voľné miesto?", + "Delete the image to free the space?": "Odstrániť obraz a uvoľniť miesto?", + "Delete the images to free the space?": "Odstrániť obrazy a uvoľniť miesto?", "Delete this corrupt archive and pick another": "Vymazať tento poškodený archív a vybrať iný", "Deleting job...": "Odstraňuje sa úloha...", - "Deluge is a lightweight, Free Software, cross-platform BitTorrent client.": "Deluge je ľahký, Free Software, cross-platform BitTorrent klient.", + "Deluge is a lightweight, Free Software, cross-platform BitTorrent client.": "Deluge je nenáročný multiplatformový klient BitTorrent so slobodnou licenciou.", "Dependencies installed successfully": "Závislosti boli úspešne nainštalované", "Deploy with this configuration?": "Nasadiť s týmto nastavením?", "Deploying Secure Gateway...": "Nasadzuje sa Secure Gateway...", @@ -1733,7 +1759,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 +1770,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", @@ -1760,8 +1786,8 @@ "Directory does not exist and was not created.": "Priečinok neexistuje a nebol vytvorený.", "Directory does not exist:": "Priečinok neexistuje:", "Directory error": "Chyba priečinka", - "Directory for the read-only view": "Adresár pre zobrazenie len na čítanie", - "Directory for the read/write view": "Adresár pre zobrazenie čítania/písania", + "Directory for the read-only view": "Adresár pohľadu iba na čítanie", + "Directory for the read/write view": "Adresár pohľadu na čítanie a zápis", "Directory not found": "Priečinok sa nenašiel", "Directory storage added successfully to Proxmox!": "Priečinkové úložisko bolo úspešne pridané do Proxmoxu!", "Directory successfully.": "Priečinok je pripravený.", @@ -1834,7 +1860,7 @@ "Display volume groups (LVM)": "Zobraziť skupiny zväzkov (LVM)", "Do not assume port 8123 remains active after onboarding on Home Assistant Core 2026.8 or newer.": "Nepredpokladajte, že port 8123 zostane aktívny po nalodení na Home Assistant Core 2026.8 alebo novšie.", "Do not claim in-place OCI image updates are validated until rootfs replacement and rollback have been tested without losing the managed /mnt/data volume.": "Nevyhlasujte, že aktualizácie obrazu OCI sú validované na mieste, kým sa neotestujú rootfs náhrada a rollback bez straty riadeného /mnt/data objemu.", - "Do not enable automatically on unsupported AMD integrated GPUs. HSA overrides are manual compatibility experiments, not a validated default.": "Nepovoľovať automaticky na nepodporovaných integrovaných GPU AMD. HSA sú manuálne kompatibilné experimenty, nie validované predvolené.", + "Do not enable automatically on unsupported AMD integrated GPUs. HSA overrides are manual compatibility experiments, not a validated default.": "Nepovoľujte automaticky na nepodporovaných integrovaných GPU AMD. Prepísanie nastavení HSA je ručný experiment s kompatibilitou, nie overené predvolené nastavenie.", "Do not mount": "Nepripojiť", "Do not run the upgrade from the Web UI virtual console (it will disconnect)": "Nespúšťajte aktualizáciu z virtuálnej konzoly vo webovom rozhraní (odpojí sa)", "Do not start the VM until the system has been rebooted.": "VM nespúšťajte, kým sa systém nereštartuje.", @@ -1880,25 +1906,25 @@ "Do you want to update the existing export?": "Chcete aktualizovať existujúci export?", "Do you want to update the existing share?": "Chcete aktualizovať existujúce zdieľanie?", "Do you want to view the selected backup before restoring?": "Chcete si vybranú zálohu pred obnovou pozrieť?", - "Docker Mods are only offered for compatible LinuxServer images": "Docker Mods sú ponúkané len pre kompatibilné LinuxServer obrázky", + "Docker Mods are only offered for compatible LinuxServer images": "Docker Mods sú dostupné iba pre kompatibilné obrazy LinuxServer", "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", - "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)", - "Doplarr is an *arr request bot for Discord.\"": "Doplarr je robot pre Discord.", - "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", + "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ý a všestranný wiki systém s otvoreným zdrojovým kódom, ktorý nevyžaduje databázu. Ponúka prehľadnú syntax a jednoduchú údržbu, zálohovanie aj integráciu. Vstavané riadenie prístupu a možnosti overovania sú vhodné aj pre firmy. Množstvo komunitných doplnkov rozširuje použitie nad rámec tradičnej 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 umožňuje hrať hry GameCube a Wii s grafickými vylepšeniami a ďalšími funkciami na zlepšenie herného zážitku.", + "Domain for the certificate (example.com)": "Doména pre certifikát (example.com)", + "Doplarr is an *arr request bot for Discord.\"": "Doplarr je robot pre Discord na zadávanie požiadaviek aplikáciám *arr.", + "Doplarr_rs is a Discord bot for requesting media through *arr backends, written in Rust.": "Doplarr_rs je robot pre Discord napísaný v Ruste na zadávanie požiadaviek na médiá cez aplikácie *arr.", + "Double Commander is a free cross platform open source file manager with two panels side by side. It is inspired by Total Commander and features some new ideas.": "Double Commander je bezplatný multiplatformový správca súborov s otvoreným zdrojovým kódom a dvoma panelmi vedľa seba. Inšpiruje sa Total Commanderom a pridáva vlastné funkcie.", + "Download Spotify music with album art and metadata": "Sťahovanie hudby zo Spotify s obalmi albumov a metadátami", + "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", "Download keyfile": "Stiahnuť keyfile", "Download latest VirtIO ISO automatically": "Stiahnuť najnovšie VirtIO ISO automaticky", - "Downloaded OCI images deleted:": "Stiahnuté obrázky OCI odstránené:", + "Downloaded OCI images deleted:": "Odstránené stiahnuté obrazy OCI:", "Downloaded amdgpu_top": "amdgpu_top bol stiahnutý", "Downloading": "Sťahujem", "Downloading Helper-Scripts logo...": "Sťahujem logo Helper-Scripts...", @@ -1908,10 +1934,10 @@ "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:", + "Downloading the image:": "Sťahuje sa obraz:", "Downloading the latest Fastfetch release...": "Sťahujem najnovšiu verziu Fastfetch...", "Driver blacklist entries removed": "Záznamy v blackliste ovládačov boli odstránené", "Driver blacklist removed for": "Blacklist ovládača odstránený pre", @@ -1919,61 +1945,62 @@ "Drivers :": "Ovládače :", "Drivers compiled and installed via DKMS.": "Ovládače boli skompilované a nainštalované cez DKMS.", "Dry run completed; mount configuration was not applied. The CT was already running.": "Suchý chod dokončený;konfigurácia pripojenia nebola použitá. CT už bežal.", - "Dry run completed; mount configuration was not applied. The CT was started for the remote check.": "Suchý chod dokončený;konfigurácia pripojenia nebola použitá. CT bol spustený na vzdialenú kontrolu.", + "Dry run completed; mount configuration was not applied. The CT was started for the remote check.": "Skúšobný beh bol dokončený; nastavenie pripojenia sa nepoužilo. Kontajner bol spustený na kontrolu vzdialeného úložiska.", "Dry run completed; no changes were made.": "Suchý beh dokončený; neboli vykonané žiadne zmeny.", "Dry run completed; no containers were created.": "Suchý beh dokončený; neboli vytvorené žiadne kontajnery.", "Dry run completed; the container and the mounts were not changed.": "Suchý chod dokončený; kontajner a držiaky neboli zmenené.", - "DuckDNS subdomain without .duckdns.org (comma separated for several)": "DuckDNS subdoména bez .duckdns.org (koma oddelené pre niekoľko)", + "DuckDNS subdomain without .duckdns.org (comma separated for several)": "Subdoména DuckDNS bez .duckdns.org (viac subdomén oddeľte čiarkami)", "DuckDNS token from your account at duckdns.org": "DuckDNS token z vášho účtu na duckdns.org", "DuckDNS updates the subdomain every 5 minutes. Without UPDATE_IP, DuckDNS itself detects the public IPv4 address of the request.": "DuckDNS aktualizuje subdoménu každých 5 minút. Bez UPDATE_IP samotná DuckDNS detekuje verejnú IPv4 adresu žiadosti.", - "DuckStation is a PS1 Emulator aiming for the best accuracy and game support.": "DuckStation je PS1 Emulátor zameraný na najlepšie accuracy a hernú podporu.", - "Duckdns is a free service which will point a DNS (sub domains of duckdns.org) to an IP of your choice. The service is completely free, and doesn't require reactivation or forum posts to maintain its existence.": "Duckdns je bezplatná služba, ktorá bude ukazovať DNS (pod domény duckdns.org) na IP podľa vášho výberu. Služba je úplne zadarmo, a nie je require reaktivácia alebo fóra príspevky udržať jeho existenciu.", + "DuckStation is a PS1 Emulator aiming for the best accuracy and game support.": "DuckStation je emulátor PS1 zameraný na čo najpresnejšiu emuláciu a podporu hier.", + "Duckdns is a free service which will point a DNS (sub domains of duckdns.org) to an IP of your choice. The service is completely free, and doesn't require reactivation or forum posts to maintain its existence.": "DuckDNS je bezplatná služba smerujúca subdomény duckdns.org na zvolenú IP adresu. Nevyžaduje opätovnú aktiváciu ani príspevky vo fóre na zachovanie účtu.", "Dumping AMD GPU ROM BIOS via sysfs...": "Vytváram dump AMD GPU ROM BIOS cez sysfs...", "Duplicate IP addresses found": "Našli sa duplicitné IP adresy", "Duplicate parameters cleaned": "Duplicitné parametre sú vyčistené", - "Duplicate variable in the contract; review it before editing": "Duplikovať premenné v zmluve; preskúmať pred úpravou", + "Duplicate variable in the contract; review it before editing": "Premenná je v definícii kontajnera uvedená viackrát; pred úpravou ju skontrolujte", "Duplicated GPU device in the container": "Duplikované GPU zariadenie v kontajneri", "Duplicated NVIDIA devices": "Duplikované zariadenia NVIDIA", "Duplicated VMID in the Proxmox inventory": "Duplikované VMID v inventári Proxmox", - "Duplicated native directive:": "Duplikát natívne smernice:", + "Duplicated native directive:": "Duplicitná natívna direktíva:", "Duplicated native option": "Duplikované natívne možnosti", - "Duplicated or invalid stack VMID": "Duplikované alebo neplatné stoh VMID", + "Duplicated or invalid stack VMID": "Duplicitné alebo neplatné VMID kontajnerov aplikácie", "Duplicati is a backup client that securely stores encrypted, incremental, compressed backups on local storage, cloud storage services and remote file servers. It works with standard protocols like FTP, SSH, WebDAV as well as popular services like Microsoft OneDrive, Amazon S3, Google Drive, box.com, Mega, B2, and many others.": "Duplicati je záložný klient, ktorý bezpečne ukladá šifrované, prírastkové, stlačené zálohy na lokálne úložisko, cloudové úložné služby a vzdialené súborové servery. Funguje so štandardnými protokolmi ako FTP, SSH, WebDAV, rovnako ako populárne služby ako Microsoft OneDrive, Amazon S3, Google Drive, box.com, Mega, B2, a mnoho ďalších.", "Duplicati web interface (password only)": "Duplicati webové rozhranie (iba heslo)", "Duration": "Trvanie", "Duration:": "Trvanie:", - "Dynamic NVIDIA is only validated for unprivileged containers. This profile uses static mounts and must be recreated after the host driver changes.": "Dynamická NVIDIA je validovaná len pre neprivilegované kontajnery. Tento profil používa statické pripojenia a musí byť znovu vytvorený po zmene hostiteľského vodiča.", + "Dynamic NVIDIA is only validated for unprivileged containers. This profile uses static mounts and must be recreated after the host driver changes.": "Dynamická NVIDIA je overená iba pre neprivilegované kontajnery. Tento profil používa statické pripojenia; po zmene ovládača na hostiteľovi je potrebné kontajner znovu vytvoriť.", "EFI disk created and configured on": "EFI disk bol vytvorený a nastavený na", "EFI storage selection cancelled.": "Výber úložiska pre EFI bol zrušený.", "EFI storage selection failed or was cancelled. VM creation aborted.": "Výber úložiska pre EFI zlyhal alebo bol zrušený. Vytvorenie VM bolo prerušené.", "EMERGENCY PROXMOX SYSTEM REPAIR": "NÚDZOVÁ OPRAVA SYSTÉMU PROXMOX", "ENABLED for restore": "ZAPNUTÉ pre obnovu", "EXISTS": "EXISTUJE", - "Each /request command needs a backend: add a [[backends]] block in the same file with the url and api_key of your Sonarr, Radarr or Seerr instance, then restart the container.": "Každý príkaz / žiadosť potrebuje backend: pridať [[[backends]]] blok v rovnakom súbore s url a api key vášho Sonarr, Radarr alebo Seerr inštancie, potom reštartujte kontajner.", + "Each /request command needs a backend: add a [[backends]] block in the same file with the url and api_key of your Sonarr, Radarr or Seerr instance, then restart the container.": "Každý príkaz /request vyžaduje backend. Do rovnakého súboru pridajte blok [[backends]] s url a api_key vašej inštancie Sonarr, Radarr alebo Seerr a kontajner reštartujte.", "Each LUN will appear as a block device assignable to VMs.": "Každý LUN sa zobrazí ako blokové zariadenie, ktoré sa dá priradiť k VM.", - "Each peer gets its configuration and its QR code inside the container: /config/peer1/peer1.conf and /config/peer1/peer1.png, or /config/peer_/peer_.conf when names were given.": "Každý peer dostane svoju konfiguráciu a QR kód vnútri kontajnera: /config/peer1/peer1.conf a /config/peer1/peer1.png, alebo /config/peer /peer .conf pri uvedení mien.", - "Ebook and audiobook collection manager for Usenet and BitTorrent users.": "Ebook a audioknihy správca zberu pre užívateľov Usenet a BitTorrent.", - "Eden is an experimental open-source emulator for the Nintendo Switch, built with performance and stability in mind.": "Eden je experimentálny open-source emulátor pre Nintendo Switch, postavený s výkonom a stabilitou na mysli.", + "Each peer gets its configuration and its QR code inside the container: /config/peer1/peer1.conf and /config/peer1/peer1.png, or /config/peer_/peer_.conf when names were given.": "Každý účastník má v kontajneri konfiguráciu a QR kód: /config/peer1/peer1.conf a /config/peer1/peer1.png alebo /config/peer_/peer_.conf, ak boli zadané mená.", + "Ebook and audiobook collection manager for Usenet and BitTorrent users.": "Správca zbierky elektronických kníh a audiokníh pre používateľov Usenetu a BitTorrentu.", + "Eden is an experimental open-source emulator for the Nintendo Switch, built with performance and stability in mind.": "Eden je experimentálny emulátor Nintendo Switch s otvoreným zdrojovým kódom a dôrazom na výkon a stabilitu.", "Edge TPU runtime installed.": "Edge TPU runtime bol nainštalovaný.", "Edit": "Upraviť", "Edit Job": "Upraviť úlohu", "Edit raw CT configuration file": "Upraviť konfiguračný súbor CT", "Edit raw VM configuration file": "Upraviť konfiguračný súbor VM", "Edit the VM machine type to q35 and try again.": "Zmeňte typ stroja VM na q35 a skúste to znova.", - "Email address for certificate expiry notices (required by ZeroSSL)": "E-mailová adresa pre oznámenia o uplynutí platnosti certifikátu (required by ZeroSSL)", + "Email address for certificate expiry notices (required by ZeroSSL)": "E-mail na upozornenia pred vypršaním certifikátu (vyžaduje ZeroSSL)", "Email address of the LibreDB Studio administrator": "E-mailová adresa správcu LibreDB Studio", "Email address of the NetBox admin account": "E-mailová adresa admin účtu NetBox", "Email address of the admin account": "E-mailová adresa účtu správcu", "Email address of the superuser account": "E-mailová adresa účtu superužívateľa", "Emby WebUI": "Emby WebUI", - "Emby organizes video, music, live TV, and photos from personal media libraries and streams them to smart TVs, streaming boxes and mobile devices. This container is packaged as a standalone emby Media Server.": "Emby organizuje video, hudbu, živú televíziu a fotografie z osobných mediálnych knižníc a prenáša ich do inteligentných televízorov, streamovacích skríň a mobilných zariadení. Tento kontajner je balený ako samostatný emby Media Server.", + "Emby organizes video, music, live TV, and photos from personal media libraries and streams them to smart TVs, streaming boxes and mobile devices. This container is packaged as a standalone emby Media Server.": "Emby usporadúva videá, hudbu, živú televíziu a fotografie z osobných knižníc a streamuje ich do inteligentných televízorov, prehrávačov a mobilných zariadení. Tento kontajner obsahuje samostatný Emby Media Server.", "Emergency Proxmox System Repair": "Núdzová oprava systému Proxmox", "Emergency recovery:": "Núdzová obnova:", + "Emit numeric progress for the OCI menu": "Vypisovať číselný priebeh pre ponuku OCI", "Empowering the smart home": "Posilnenie inteligentného domova", "Empty": "Prázdny", "Empty exec service check": "Prázdna kontrola exec služby", "Empty or duplicated NVIDIA identity": "Prázdna alebo duplikovaná identita NVIDIA", - "EmulatorJS is a Docker-based emulator application that can simulate various operating systems and device environments within containers for development, testing, and learning purposes.": "EmulatorJS je aplikácia Docker založená na emulátore, ktorá simuluje rôzne operatingové systémy a prostredia zariadení v kontajneroch pre vývoj, testovanie a učenie.", + "EmulatorJS is a Docker-based emulator application that can simulate various operating systems and device environments within containers for development, testing, and learning purposes.": "EmulatorJS je emulačná aplikácia založená na Dockeri, ktorá simuluje rôzne operačné systémy a prostredia zariadení v kontajneroch na vývoj, testovanie a vzdelávanie.", "Enable": "Zapnúť", "Enable / disable job timer": "Zapnúť / vypnúť timer úlohy", "Enable High Availability services": "Zapnúť služby High Availability", @@ -1981,24 +2008,25 @@ "Enable IOMMU support if not enabled": "Zapne podporu IOMMU, ak ešte nie je zapnutá", "Enable IOMMU, reboot the host, and try again.": "Zapnite IOMMU, reštartujte server a skúste to znova.", "Enable Intel/AMD VA-API video acceleration": "Povoliť video zrýchlenie Intel/AMD VA-API", - "Enable NVIDIA transcoding and HDR10/Dolby Vision to SDR tone mapping": "Povoliť transkódovanie NVIDIA a HDR10/Dolby Vision do mapovania SDR tónu", + "Enable NVIDIA transcoding and HDR10/Dolby Vision to SDR tone mapping": "Povoliť prevod videa cez NVIDIA a mapovanie tónov HDR10/Dolby Vision na SDR", "Enable Remote Desktop (RDP) before disabling the virtual display.": "Pred vypnutím virtuálneho zobrazenia zapnite Vzdialenú plochu (RDP).", "Enable SSD emulation for this disk?": "Zapnúť pre tento disk emuláciu SSD?", "Enable TCP BBR/Fast Open control": "Zapnúť TCP BBR/Fast Open", - "Enable VA-API transcoding and HDR10/Dolby Vision to SDR tone mapping": "Povoliť transkódovanie VA-API a HDR10/Dolby Vision do mapovania tónu SDR", - "Enable VA-API, hardware encoding and OpenCL tone mapping in Jellyfin": "Povoliť VA-API, kódovanie hardvéru a mapovanie OpenCL tónu v Jellyfin", + "Enable VA-API transcoding and HDR10/Dolby Vision to SDR tone mapping": "Povoliť prevod videa cez VA-API a mapovanie tónov HDR10/Dolby Vision na SDR", + "Enable VA-API, hardware encoding and OpenCL tone mapping in Jellyfin": "Povoliť VA-API, hardvérové kódovanie a mapovanie tónov pomocou OpenCL v Jellyfine", "Enable VFIO IOMMU support": "Zapnúť podporu VFIO/IOMMU", "Enable ZFS autotrim (SSD/NVMe pools)": "Zapnúť ZFS autotrim (SSD/NVMe pooly)", "Enable ZRAM swap profile": "Povoliť výmenný profil ZRAM", - "Enable a mount on an existing Rclone OCI container": "Povoliť montáž na existujúci Rclone OCI kontajner", - "Enable an optical drive for MakeMKV": "Povoliť optický pohon pre MakeMKV", + "Enable a mount on an existing Rclone OCI container": "Nastaviť pripojenie na existujúcom OCI kontajneri Rclone", + "Enable a mount on an installed Rclone OCI": "Nastaviť pripojenie v nainštalovanom OCI kontajneri Rclone", + "Enable an optical drive for MakeMKV": "Sprístupniť optickú mechaniku pre MakeMKV", "Enable auto-sync if /var/log exceeds 90% of its size?": "Zapnúť automatickú synchronizáciu, keď /var/log presiahne 90 % svojej veľkosti?", "Enable fast reboots": "Zapnúť rýchle reštarty", "Enable job": "Povoliť úlohu", "Enable restart on kernel panic": "Zapnúť reštart pri kernel panic", - "Enable the NVIDIA GPU requested by the image": "Povoliť NVIDIA GPU požadovanú obrázkom", - "Enable the NVIDIA GPU required by Open WebUI CUDA": "Povoliť NVIDIA GPU required by Open WebUI CUDA", - "Enable this FUSE mount now and restart the CT?": "Povoliť túto FUSE pripojiť teraz a reštartovať CT?", + "Enable the NVIDIA GPU requested by the image": "Povoliť GPU NVIDIA požadované obrazom", + "Enable the NVIDIA GPU required by Open WebUI CUDA": "Povoliť GPU NVIDIA vyžadované aplikáciou Open WebUI CUDA", + "Enable this FUSE mount now and restart the CT?": "Povoliť toto pripojenie FUSE teraz a reštartovať kontajner?", "Enable/Disable job": "Zapnúť/vypnúť úlohu", "Enabled": "Zapnuté", "Enabled (device pending — load apex module or reboot)": "Zapnuté (zariadenie čaká - načítajte modul apex alebo reštartujte)", @@ -2135,7 +2163,7 @@ "Enter the number or type the interface name:": "Zadajte číslo alebo napíšte názov rozhrania:", "Enter the password for Samba user:": "Zadajte heslo pre Samba používateľa:", "Enter the recovery passphrase set when the keyfile was created:": "Zadajte obnovovaciu frázu nastavenú pri vytvorení keyfile:", - "Enter the size in whole GB, for example": "Zadajte veľkosť v celej GB, napríklad", + "Enter the size in whole GB, for example": "Zadajte veľkosť v celých GB, napríklad", "Enter the value again.": "Zadajte hodnotu znova.", "Enter username for Samba server:": "Zadajte používateľské meno pre Samba server:", "Enter username:": "Zadajte používateľské meno:", @@ -2144,9 +2172,10 @@ "Enterprise repository present": "Enterprise repozitár existuje", "Enterprise repository returned 401 Unauthorized (no valid subscription). Switch to the no-subscription repository and retry?": "Enterprise repozitár vrátil 401 Unauthorized (žiadne platné predplatné). Prepnúť na no-subscription repozitár a skúsiť znova?", "Enterprise repository unauthorized and fallback declined by user": "Enterprise repozitár nie je autorizovaný a používateľ odmietol náhradné riešenie", + "Enterprise shares an APT stanza with other components. Split it in the Proxmox repository UI; no repository changed.": "Enterprise má spoločný záznam APT s ďalšími komponentmi. Rozdeľte ho v rozhraní repozitárov Proxmoxu; žiadny repozitár sa nezmenil.", "Entropy generation optimization removed": "Optimalizácia generovania entropie bola odstránená", - "Environment entry without an explicit value": "Vstup do životného prostredia bez explicitnej hodnoty", - "Environment override for an unknown service:": "Prostredie prepísať pre neznámu službu:", + "Environment entry without an explicit value": "Položka premennej prostredia bez výslovne zadanej hodnoty", + "Environment override for an unknown service:": "Prepísanie premenných prostredia pre neznámu službu:", "Equivalent manual flow of disk_host.sh: partition, format, mount, persist, register in Proxmox.": "Rovnaký ručný postup ako v disk_host.sh: rozdeliť, formátovať, pripojiť, uložiť natrvalo a zaregistrovať v Proxmoxe.", "Equivalent manual flow of iscsi_host.sh.": "Rovnaký ručný postup ako v iscsi_host.sh.", "Equivalent manual flow used by Local Shared Manager.": "Rovnaký ručný postup používa aj správca lokálneho zdieľania.", @@ -2168,12 +2197,12 @@ "Every 6 hours": "Každých 6 hodín", "Every fail2ban jail ships disabled. Enable the ones you need in /config/fail2ban/jail.local, taking the ready-made jails in /config/fail2ban/jail.d/ as reference, then restart the container.": "Každá fail2ban väzenská loď je vypnutá. Povoliť tie, ktoré potrebujete v /config/fail2ban/jail.local, pričom ready-made väzenia v /config/fail2ban/jail.d/ ako odkaz, potom reštartujte kontajner.", "Every hour": "Každú hodinu", - "Every member of the stack is back to its previous installation.": "Každý člen zásobníka je späť do svojej predchádzajúcej inštalácie.", + "Every member of the stack is back to its previous installation.": "Všetky kontajnery aplikácie sa vrátili k predchádzajúcej inštalácii.", "Every node of this cluster already has this file. A backup of the container does not include it: on another Proxmox host it is written again when the application is recovered from Manage installed OCI applications:": "Každý uzol tohto klastra už má tento súbor. Záloha kontajnera ho neobsahuje: na inom hostiteľovi Proxmox sa znova zapíše, keď sa aplikácia obnoví z Spravovať nainštalované aplikácie OCI:", "Every node of this cluster already has this file. If you restore this container on any other Proxmox host, copy it to the same path first, because the container backup does not include it:": "Každý uzol tohto klastra už má tento súbor. Ak obnovíte tento kontajner na akomkoľvek inom hostiteľovi Proxmox, najskôr ho skopírujte do rovnakej cesty, pretože záloha kontajnera ho neobsahuje:", "Every path in this backup is kernel-tied: the restore applies these paths automatically via the safe-subset filter and re-merges the operator's tuning.": "Každá cesta v tejto zálohe je viazaná na kernel: obnova tieto cesty použije automaticky cez filter bezpečnej podmnožiny a znovu zlúči vlastné ladenie správcu.", "Everything restorable in this backup will be restored": "Všetko obnoviteľné z tejto zálohy sa obnoví", - "Exact name of the remote": "Presný názov ovládača", + "Exact name of the remote": "Presný názov vzdialeného úložiska", "Example output: rootfs: local-lvm:vm-114-disk-0,size=8G": "Príklad výstupu: rootfs: local-lvm:vm-114-disk-0,size=8G", "Example target: /dev/sdb": "Príklad cieľa: /dev/sdb", "Example value:": "Príklad hodnoty:", @@ -2194,9 +2223,10 @@ "Execute destructive rollback?": "Vykonať deštruktívny rollback?", "Executing destructive rollback (operator confirmed) ...": "Vykonávam deštruktívny rollback (správca potvrdil) ...", "Executing:": "Spúšťam:", - "Execution engine for Index-TTS": "Vykonávací motor pre Index-TTS", + "Execution engine for Index-TTS": "Výpočtový engine pre Index-TTS", "Existing Groups": "Existujúce skupiny", "Existing TLS certificate reused:": "Existujúce osvedčenie TLS opätovne použité:", + "Existing ZRAM profile is active but does not match its configuration": "Existujúci profil ZRAM je aktívny, ale nezodpovedá svojej konfigurácii", "Existing file, re-downloading...": "Súbor už existuje, sťahujem ho znova...", "Existing filesystem:": "Existujúci súborový systém:", "Existing hostpci entries detected — they will be reused": "Zistené existujúce hostpci položky - použijú sa znova", @@ -2241,12 +2271,12 @@ "Extended Filesystem 4 (recommended)": "Extended Filesystem 4 (odporúčané)", "External ZFS ARC settings restored:": "Externé nastavenia ZFS ARC boli obnovené:", "External ZFS configuration changed after the ProxMenux migration; current file and backup preserved:": "Externá konfigurácia ZFS sa po migrácii ProxMenux zmenila; aktuálny súbor aj záloha zostali zachované:", - "External credential is empty or spans multiple lines": "Externý credential je prázdny alebo rozpätie viacerých liniek", + "External credential is empty or spans multiple lines": "Externý prihlasovací údaj je prázdny alebo obsahuje viac riadkov", "External disk for backup": "Externý disk na zálohu", "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...", @@ -2257,9 +2287,9 @@ "Extraction failed. Check log:": "Rozbalenie zlyhalo. Skontrolujte záznam:", "Extraction successful": "Rozbalenie bolo úspešné", "FAILED": "ZLYHALO", - "FFmpeg version the node uses (7 by default)": "FFmpeg verzia uzol používa (7 predvolene)", + "FFmpeg version the node uses (7 by default)": "Verzia FFmpeg používaná uzlom (predvolene 7)", "FINAL CONFIRMATION — DATA WILL BE ERASED": "POSLEDNÉ POTVRDENIE — DÁTA SA VYMAŽÚ", - "FIleZilla Client is a fast and reliable cross-platform FTP, FTPS and SFTP client with lots of useful features and an intuitive graphical user interface.": "FIleZilla Client je rýchly a spoľahlivý cross-platform FTP, FTPS a SFTP klient s množstvom užitočných funkcií a intuitívne grafické užívateľské rozhranie.", + "FIleZilla Client is a fast and reliable cross-platform FTP, FTPS and SFTP client with lots of useful features and an intuitive graphical user interface.": "FileZilla Client je rýchly a spoľahlivý multiplatformový klient FTP, FTPS a SFTP s množstvom funkcií a intuitívnym grafickým rozhraním.", "Fail2Ban - Intrusion Prevention": "Fail2Ban - ochrana prihlasovania", "Fail2Ban Management": "Správa Fail2Ban", "Fail2Ban has been removed": "Fail2Ban bol odstránený", @@ -2425,9 +2455,9 @@ "Failed. See log:": "Zlyhalo. Pozrite záznam:", "Falling back to each installer with --auto-reinstall...": "Prepínam na jednotlivé inštalátory s --auto-reinstall...", "Falling back to manual paste mode.": "Prepínam na ručné vloženie.", - "Fast Usenet downloader with a SABnzbd-compatible API": "Fast Usenet downloader s SABnzbd kompatibilným API", + "Fast Usenet downloader with a SABnzbd-compatible API": "Rýchly nástroj na sťahovanie z Usenetu s API kompatibilným so SABnzbd", "Fast, modern web interface for qBittorrent": "Rýchle, moderné webové rozhranie pre qBittorrent", - "Faster-whisper is a reimplementation of OpenAI's Whisper model using CTranslate2, which is a fast inference engine for Transformer models. This container provides a Wyoming protocol server for faster-whisper.": "Rýchlejšie-whisper je reimplementácia modelu Whisper OpenAI pomocou CTranslate2, ktorý je rýchlym vyvodzovacím motorom pre modely Transformer. Tento kontajner poskytuje Wyoming protokol server pre rýchlejšie-šepkať.", + "Faster-whisper is a reimplementation of OpenAI's Whisper model using CTranslate2, which is a fast inference engine for Transformer models. This container provides a Wyoming protocol server for faster-whisper.": "Faster-whisper je nová implementácia modelu Whisper od OpenAI pomocou CTranslate2, rýchleho výpočtového enginu pre modely Transformer. Tento kontajner poskytuje server protokolu Wyoming pre faster-whisper.", "Fastfetch Logo Selection": "Výber loga pre Fastfetch", "Fastfetch configuration updated": "Nastavenie Fastfetch bolo aktualizované", "Fastfetch download URL retrieved successfully.": "Adresa na stiahnutie Fastfetch bola úspešne získaná.", @@ -2439,13 +2469,13 @@ "Fastfetch now displays: System optimised by: ProxMenux": "Fastfetch teraz zobrazuje: Systém optimalizoval: ProxMenux", "Fastfetch removed from system": "Fastfetch bol odstránený zo systému", "Fastfetch will start automatically in the console": "Fastfetch sa bude v konzole spúšťať automaticky", - "Ferdium is a desktop app that helps you organize how you use your favourite apps by combining them into one application.": "Ferdium je desktopová aplikácia, ktorá vám pomôže zorganizovať, ako používate svoje obľúbené aplikácie pomocou combi.", + "Ferdium is a desktop app that helps you organize how you use your favourite apps by combining them into one application.": "Ferdium je desktopová aplikácia, ktorá spája obľúbené aplikácie do jedného rozhrania a pomáha usporiadať ich používanie.", "Fetching NVIDIA driver versions supported by your GPU...": "Načítavam verzie ovládača NVIDIA podporované vaším GPU...", "Figurine installation and configuration completed successfully.": "Inštalácia a nastavenie Figurine boli úspešne dokončené.", "Figurine is not installed.": "Figurine nie je nainštalovaný.", "Figurine removed from system": "Figurine bol odstránený zo systému", "File bind mounts do not support spaces:": "Pripojenie súborov nepodporuje medzery:", - "File processing made easy!": "Spracovanie súborov bolo jednoduché!", + "File processing made easy!": "Jednoduché spracovanie súborov!", "File:": "Súbor:", "FileBrowser Quantum": "FileBrowser Quantum", "FileBrowser Quantum (new installation)": "FileBrowser Quantum (nová inštalácia)", @@ -2453,19 +2483,19 @@ "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:", "Final Confirmation": "Posledné potvrdenie", - "Final cleanup of the stack operation completed": "Konečné vyčistenie stohu operation dokončené", + "Final cleanup of the stack operation completed": "Záverečné upratovanie operácie celej aplikácie je dokončené", "Final confirmation": "Posledné potvrdenie", "Final storage health/status check": "Záverečná kontrola stavu úložiska", "Finance & Budgeting": "Financie a rozpočet", "Find your device using https://finds.synology.com": "Zariadenie nájdete cez https://finds.synology.com", "Fingerprint:": "Odtlačok:", - "Firefly, the easiest using of WireGuard VPN server, plus version of wg-easy.": "Firefly, najjednoduchšie používanie WireGuard VPN servera, plus verzia wg-ľahké.", - "Firefox Browser, also known as Mozilla Firefox or simply Firefox, is a free and open-source web browser developed by the Mozilla Foundation and its subsidiary, the Mozilla Corporation. Firefox uses the Gecko layout engine to render web pages, which implements current and anticipated web standards.": "Firefox Browser, tiež známy ako Mozilla Firefox alebo jednoducho Firefox, je zadarmo a open-source webový prehliadač vyvinutý Mozilla nadácie a jej dcérskej spoločnosti, Mozilla Corporation. Firefox používa Gecko dispozičný motor na vytvorenie webových stránok, ktoré implementujú aktuálne a predpokladané webové štandardy.", + "Firefly, the easiest using of WireGuard VPN server, plus version of wg-easy.": "Firefly je jednoducho ovládateľný server WireGuard VPN, rozšírená verzia wg-easy.", + "Firefox Browser, also known as Mozilla Firefox or simply Firefox, is a free and open-source web browser developed by the Mozilla Foundation and its subsidiary, the Mozilla Corporation. Firefox uses the Gecko layout engine to render web pages, which implements current and anticipated web standards.": "Mozilla Firefox je bezplatný webový prehliadač s otvoreným zdrojovým kódom, ktorý vyvíjajú Mozilla Foundation a jej dcérska spoločnosť Mozilla Corporation. Na vykresľovanie webových stránok používa engine Gecko s podporou súčasných aj pripravovaných webových štandardov.", "Firewall allows port": "Firewall povoľuje port", "Firewall settings": "Nastavenia firewallu", "Firmware :": "Firmware :", @@ -2487,12 +2517,12 @@ "Fix: on the host, run": "Oprava: na hostovi spustite", "FlexGet web interface": "Webové rozhranie FlexGet", "Flexget is a multipurpose automation tool for all of your media.": "Flexget je viacúčelový automatizačný nástroj pre všetky vaše médiá.", - "Flowise 3.0.1 and later create the administrator account from the web interface, the first time it is opened.": "Flowise 3.0.1 a neskôr vytvoriť správca účtu z webového rozhrania, prvýkrát je otvorený.", - "Flycast is a multi-platform Sega Dreamcast, Naomi, Naomi 2, and Atomiswave emulator derived from reicast.": "Flycast je multiplatforma Sega Dreamcast, Naomi, Naomi 2, a atomiswave emulátor odvodený z reicastu.", + "Flowise 3.0.1 and later create the administrator account from the web interface, the first time it is opened.": "Flowise od verzie 3.0.1 vytvára účet správcu pri prvom otvorení webového rozhrania.", + "Flycast is a multi-platform Sega Dreamcast, Naomi, Naomi 2, and Atomiswave emulator derived from reicast.": "Flycast je multiplatformový emulátor Sega Dreamcast, Naomi, Naomi 2 a Atomiswave, odvodený z projektu reicast.", "Folder Name": "Názov priečinka", "Folders in /mnt": "Priečinky v /mnt", "Folders to share, separated by ; (for example /downloads/incoming;/my_movies)": "Priečinky na zdieľanie oddelené ;(napríklad /downloads/incoming;/my_movies)", - "Folding@home is a distributed computing project for simulating protein dynamics, including the process of protein folding and the movements of proteins implicated in a variety of diseases. It brings together citizen scientists who volunteer to run simulations of protein dynamics on their personal computers. Insights from this data are helping scientists to better understand biology, and providing new opportunities for developing therapeutics.": "Folding@home je distribuovaný počítačový projekt na simuláciu dynamiky bielkovín, vrátane procesu skladania bielkovín a pohybu proteínov, ktoré sa podieľajú na rôznych chorobách. To spája citizen vedci, ktorí dobrovoľne spustiť simulácie proteínovej dynamiky na svojich osobných počítačoch. Pohľady z týchto údajov pomáhajú vedcom lepšie pochopiť biológiu a poskytujú nové príležitosti na rozvoj terapií.", + "Folding@home is a distributed computing project for simulating protein dynamics, including the process of protein folding and the movements of proteins implicated in a variety of diseases. It brings together citizen scientists who volunteer to run simulations of protein dynamics on their personal computers. Insights from this data are helping scientists to better understand biology, and providing new opportunities for developing therapeutics.": "Folding@home je projekt distribuovaných výpočtov na simuláciu dynamiky bielkovín vrátane ich skladania a pohybov súvisiacich s rôznymi ochoreniami. Dobrovoľníci spúšťajú simulácie na svojich počítačoch a pomáhajú tak vedcom lepšie pochopiť biológiu a hľadať nové liečebné postupy.", "Follow post-restore progress live from ProxMenux Monitor → Backups tab after the reboot.": "Po reštarte sledujte priebeh po obnove naživo v ProxMenux Monitor → karta Backups.", "For LVM - Create mount directory and mount:": "Pre LVM - vytvoriť priečinok a pripojiť súborový systém:", "For ZFS, storage ID must start with a letter and use only letters, numbers, dot, dash, underscore or colon.": "Pri ZFS musí ID úložiska začínať písmenom a môže obsahovať iba písmená, čísla, bodku, pomlčku, podčiarkovník alebo dvojbodku.", @@ -2534,9 +2564,9 @@ "Free space on the host, or choose another storage for this backup from Manage installed OCI applications.": "Uvoľnite miesto na hostiteľskom serveri alebo v časti Spravovať nainštalované OCI aplikácie vyberte pre túto zálohu iné úložisko.", "Free up disk space": "Uvoľniť miesto na disku", "Free:": "Voľné:", - "FreeCAD is a general-purpose parametric 3D computer-aided design (CAD) modeler and a building information modeling (BIM) software application with finite element method (FEM) support.": "FreeCAD je všeobecné parametrická 3D modelka s počítačovou podporou (CAD) a softvérová aplikácia so stavebným informačným modelovaním (BIM) s podporou konečnej elementovej metódy (FEM).", + "FreeCAD is a general-purpose parametric 3D computer-aided design (CAD) modeler and a building information modeling (BIM) software application with finite element method (FEM) support.": "FreeCAD je univerzálny parametrický nástroj na počítačom podporované 3D navrhovanie (CAD) a informačné modelovanie stavieb (BIM) s podporou metódy konečných prvkov (FEM).", "French": "Francúzština", - "Freshrss is a free, self-hostable aggregator for rss feeds.": "Freshrss je voľný, self-hostinný aggregátor pre RSS kanály.", + "Freshrss is a free, self-hostable aggregator for rss feeds.": "FreshRSS je bezplatná čítačka a agregátor RSS kanálov na vlastnom serveri.", "Frigate WebUI": "Frigate WebUI", "Frigate uses the AMD GPU for detection once /config/config.yaml defines a detector with type: onnx.": "Frigate používa GPU AMD na detekciu, keď /config/config.yaml definuje detektor s type: onnx.", "Frigate uses the Coral once /config/config.yaml defines a detector with type: edgetpu and device: pci.": "Frigate používa Coral, keď /config/config.yaml definuje detektor s type: edgetpu a device: pci.", @@ -2553,7 +2583,7 @@ "Function Level Reset (FLR) not available": "Function Level Reset (FLR) nie je dostupný", "GID already in use:": "GID sa už používa:", "GID in CT": "GID v CT", - "GIMP is a free and open-source raster graphics editor used for image manipulation (retouching) and image editing, free-form drawing, transcoding between different image file formats, and more specialized tasks. It is extensible by means of plugins, and scriptable.": "GIMP je bezplatný a open-source rastrový editor, ktorý sa používa na manipuláciu s obrázkami (retušovanie) a úpravu obrázkov, kreslenie voľných foriem, transkódovanie medzi rôznymi formátmi obrazových súborov a ďalšie špecializované úlohy. Je rozšíriteľný pomocou pluginu, a skriptovateľné.", + "GIMP is a free and open-source raster graphics editor used for image manipulation (retouching) and image editing, free-form drawing, transcoding between different image file formats, and more specialized tasks. It is extensible by means of plugins, and scriptable.": "GIMP je bezplatný rastrový grafický editor s otvoreným zdrojovým kódom. Slúži na retušovanie a úpravu obrázkov, voľné kreslenie, prevod medzi obrazovými formátmi a ďalšie špecializované úlohy. Podporuje doplnky aj skriptovanie.", "GPU": "GPU", "GPU -> VM Mode Detected": "Zistený režim GPU -> VM", "GPU Already Added": "GPU už je pridaná", @@ -2596,10 +2626,10 @@ "GPU passthrough to VMs requires IOMMU to be enabled in the kernel.": "GPU passthrough do VM vyžaduje, aby bolo IOMMU zapnuté v kerneli.", "GPU passthrough was not applied.": "Priame priradenie GPU nebolo použité.", "GPU passthrough was skipped (no compatible GPU detected).": "Priame priradenie GPU bolo preskočené (nenašla sa vhodná GPU).", - "GPU recognition uses 8 GB of RAM and a limit of 4 CPU equivalents. These resources were tested in the lab and are not a universal minimum. Compatibility depends on the GPU, the models and the kernel. NVIDIA uses the GPUs of the Toolkit inventory; Intel keeps the CPU topology.": "Rozpoznávanie GPU používa 8 GB RAM a limit 4 CPU equivalentných. Tieto zdroje boli testované v laboratóriu a nie sú univerzálne minimum. Kompatibilita závisí od GPU, modelov a jadra. NVIDIA používa GPU inventára Toolkit; Intel udržuje topológiu CPU.", + "GPU recognition uses 8 GB of RAM and a limit of 4 CPU equivalents. These resources were tested in the lab and are not a universal minimum. Compatibility depends on the GPU, the models and the kernel. NVIDIA uses the GPUs of the Toolkit inventory; Intel keeps the CPU topology.": "Rozpoznávanie pomocou GPU používa 8 GB RAM a limit zodpovedajúci 4 CPU. Tieto prostriedky boli overené v laboratóriu a nie sú univerzálnym minimom. Kompatibilita závisí od GPU, modelov a jadra. NVIDIA používa GPU zo zoznamu Toolkit, Intel zachováva topológiu CPU.", "GPU removed from VM": "GPU odstránená z VM", "GPU removed from VM config": "GPU bola odstránená z nastavenia VM", - "GPU render device": "GPU zariadenie", + "GPU render device": "Vykresľovacie zariadenie GPU", "GPU switch complete: LXC mode prepared.": "Prepnutie GPU je hotové: LXC režim je pripravený.", "GPU switch complete: VM mode prepared.": "Prepnutie GPU je hotové: VM režim je pripravený.", "GPU switch mode completed. No reboot required.": "Režim GPU bol prepnutý. Reštart nie je potrebný.", @@ -2613,7 +2643,7 @@ "GRUB configuration updated": "Nastavenie GRUB bolo aktualizované", "GRUB_CMDLINE_LINUX_DEFAULT not found in GRUB config": "GRUB_CMDLINE_LINUX_DEFAULT sa v nastavení GRUB nenašlo", "GUI mode (if available)": "Grafický režim (ak je dostupný)", - "GZDoom is a feature centric port for all Doom engine games, based on ZDoom, adding an OpenGL renderer and powerful scripting capabilities.": "GZDoom je funkcia centrický port pre všetky hry Doom motora, založené na ZDoom, pridanie OpenGL kresbu a mocné skriptovanie schopnosti.", + "GZDoom is a feature centric port for all Doom engine games, based on ZDoom, adding an OpenGL renderer and powerful scripting capabilities.": "GZDoom je verzia enginu pre hry Doom založená na ZDoome. Pridáva vykresľovanie cez OpenGL a rozsiahle možnosti skriptovania.", "GZIP - slower, widely compatible": "GZIP - pomalší, široko kompatibilný", "Gaming & Leisure": "Hry a voľný čas", "Gateway is not installed.": "Brána nie je nainštalovaná.", @@ -2625,32 +2655,36 @@ "Generate a new key and authorize it on the server automatically (recommended)": "Vygenerovať nový kľúč a automaticky ho autorizovať na serveri (odporúčané)", "Generate a new key, show me the line to paste manually": "Vygenerovať nový kľúč a zobraziť riadok na ručné vloženie", "Generate a new keyfile": "Vygenerovať nový keyfile", - "Generated Paperless administrator": "Generovaný administrátor bez dokumentov", - "Generated Tandoor administrator": "Name", + "Generated Paperless administrator": "Vygenerovaný účet správcu Paperless", + "Generated Tandoor administrator": "Vygenerovaný účet správcu Tandoor", "Generated administrator login": "Prihlásenie generovaného správcu", + "Generated: {generated}; failed: {failed}; family: {provider}": "Vygenerované: {generated}; neúspešné: {failed}; rodina: {provider}", "Generating OVF descriptor...": "Vytváram OVF popisovač...", "Generating dkms.conf...": "Vytváram dkms.conf...", "Generating manifest...": "Vytváram manifest...", "Generating missing locale:": "Vytváram chýbajúce locale:", - "Generic SCSI device associated with the drive (e.g. /dev/sg2)": "Generické zariadenie SCSI spojené s pohonom (napr. /dev/sg2)", + "Generic SCSI device associated with the drive (e.g. /dev/sg2)": "Všeobecné zariadenie SCSI priradené k mechanike (napr. /dev/sg2)", "German": "Nemčina", "Get a list of all your containers:": "Zobraziť zoznam všetkých kontajnerov:", "Get the actual disk path:": "Zistiť skutočnú cestu k disku:", "Get the container's storage information:": "Zistiť informácie o úložisku kontajnera:", - "Get up and running with large language models locally": "Vstaňte a bežte s veľkými jazykovými modelmi lokálne", + "Get up and running with large language models locally": "Jednoduché lokálne spúšťanie veľkých jazykových modelov", "Git installed": "Git nainštalovaný", - "GitQlient is a multi-platform Git client originally forked from QGit. Nowadays it goes beyond of just a fork and adds a lot of new functionality.": "GitQlient je multiplatforma Git klient pôvodne fork od QGit. V súčasnej dobe ide nad rámec len fork a pridáva veľa nových funkcií.", - "Github Desktop is an open source Electron-based GitHub app. It is written in TypeScript and uses React.": "Github Desktop je open source Electron-based app GitHub. Je napísaný v TypeScript a používa React.", + "GitHub returned HTTP 403 for {url}. Set GITHUB_TOKEN to raise the API rate limit.": "GitHub vrátil HTTP 403 pre {url}. Nastavením GITHUB_TOKEN zvýšite limit požiadaviek API.", + "GitHub returned HTTP {status} for {url}.": "GitHub vrátil HTTP {status} pre {url}.", + "GitHub returned a truncated tree for the CasaOS catalogue": "GitHub vrátil neúplný strom súborov katalógu CasaOS", + "GitQlient is a multi-platform Git client originally forked from QGit. Nowadays it goes beyond of just a fork and adds a lot of new functionality.": "GitQlient je multiplatformový klient Git, ktorý vznikol ako odnož QGit. Dnes prináša množstvo vlastných nových funkcií.", + "Github Desktop is an open source Electron-based GitHub app. It is written in TypeScript and uses React.": "GitHub Desktop je aplikácia GitHub s otvoreným zdrojovým kódom založená na Electrone. Je napísaná v TypeScripte a používa React.", "Global settings and SSH jail configured": "Globálne nastavenia a SSH jail sú nastavené", - "Gluetun/VPN not yet available: this suite does not route downloads through a VPN.": "Gluetun/VPN zatiaľ nie je k dispozícii: tento suite nie je trasa sťahovania cez VPN.", + "Gluetun/VPN not yet available: this suite does not route downloads through a VPN.": "Gluetun/VPN zatiaľ nie je dostupné: táto zostava nesmeruje sťahovanie cez VPN.", "Go to \"Manage custom paths\" and remove your custom entry that includes the destination": "Prejdite do \"Spravovať vlastné cesty\" a odstráňte vlastnú položku, ktorá obsahuje cieľ", "Google only ships an official libedgetpu APT repository for Debian/Ubuntu. Hardware passthrough is already written to": "Google poskytuje oficiálny libedgetpu APT repozitár iba pre Debian/Ubuntu. Hardvérový passthrough už je zapísaný do", "Graceful shutdown timed out.": "Korektné vypnutie nestihlo dobehnúť.", - "Grafana is a complete observability stack that allows you to monitor and analyze metrics, logs and traces. It allows you to query, visualize, alert on and understand your data no matter where it is stored.": "Grafana je kompletný sledovateľnosť zásobníka, ktorý umožňuje sledovať a analyzovať metriky, protokoly a stopy. Umožňuje vyhľadávať, vizualizovať, upozorniť a porozumieť vašim údajom bez ohľadu na to, kde sú uložené.", + "Grafana is a complete observability stack that allows you to monitor and analyze metrics, logs and traces. It allows you to query, visualize, alert on and understand your data no matter where it is stored.": "Grafana je komplexná platforma na monitorovanie a analýzu metrík, denníkov a trasovaní. Umožňuje údaje vyhľadávať, vizualizovať, nastavovať upozornenia a porozumieť im bez ohľadu na miesto uloženia.", "Grafana web interface": "Webové rozhranie Grafana", "Grav is a Fast, Simple, and Flexible, file-based Web-platform.": "Grav je rýchla, jednoduchá a flexibilná webová platforma na báze súborov.", - "Grocy (new installation; restored data keeps its credentials)": "Grocy (nová inštalácia; obnovené údaje si zachovajú svoje poverenia)", - "Grocy is an ERP system for your kitchen! Cut down on food waste, and manage your chores with this brilliant utility.": "Grocy je ERP systém pre vašu kuchyňu! Znížte plytvanie potravinami a spravte si prácu s týmto skvelým prínosom.", + "Grocy (new installation; restored data keeps its credentials)": "Grocy (nová inštalácia; pri obnove údajov zostávajú pôvodné prihlasovacie údaje)", + "Grocy is an ERP system for your kitchen! Cut down on food waste, and manage your chores with this brilliant utility.": "Grocy je systém ERP pre vašu kuchyňu. Pomáha obmedziť plytvanie potravinami a spravovať domáce povinnosti.", "Group": "Skupina", "Group 'sharedfiles' already exists inside the CT": "Skupina 'sharedfiles' už existuje vo vnútri CT", "Group GID:": "GID skupiny:", @@ -2688,13 +2722,13 @@ "Guided Repair Available": "Dostupná oprava so sprievodcom", "HA groups will be migrated to HA rules automatically": "HA skupiny sa automaticky prevedú na HA pravidlá", "HA services disabled (configs preserved)": "HA služby boli vypnuté (nastavenia zostali zachované)", - "HAOS One is a community image that runs Docker inside the container. The LXC stays unprivileged, but the inner AppArmor profiles may not be available. The first start downloads Home Assistant Core and its add-ons. If the check fails, the CT and /mnt/data are kept for diagnosis.": "HAOS One je obraz spoločenstva, ktorý prevádzkuje Docker vnútri kontajnera. LXC zostáva neprivilegovaný, ale vnútorné profily AppArmor nemusí byť k dispozícii. Prvý štart stiahne Home Assistant jadro a jeho doplnky. Ak kontrola zlyhá, CT a / mnt/ dáta sa uchovávajú na určenie diagnózy.", - "HAOS One profile declined": "Profil HAOS One klesol", - "HAOS One requires an unprivileged unmanaged LXC with nesting and keyctl, 2 cores, 2048 MB RAM, rootfs of at least 12 GB and /mnt/data of at least 16 GB on a container volume included in backups": "HAOS One requires an unprivileged unmanaged LXC with nestering and keyctl, 2 cores, 2048 MB RAM, rootfs najmenej 12 GB a /mnt/data najmenej 16 GB on a container volume included in backions", - "HTML5 Network Speed Test Server.": "HTML5 Network Speed Test Server.", + "HAOS One is a community image that runs Docker inside the container. The LXC stays unprivileged, but the inner AppArmor profiles may not be available. The first start downloads Home Assistant Core and its add-ons. If the check fails, the CT and /mnt/data are kept for diagnosis.": "HAOS One je komunitný obraz, ktorý spúšťa Docker v kontajneri. LXC zostáva neprivilegovaný, vnútorné profily AppArmor však nemusia byť dostupné. Pri prvom spustení sa stiahne Home Assistant Core a jeho doplnky. Ak kontrola zlyhá, kontajner a /mnt/data zostanú zachované na diagnostiku.", + "HAOS One profile declined": "Profil HAOS One bol odmietnutý", + "HAOS One requires an unprivileged unmanaged LXC with nesting and keyctl, 2 cores, 2048 MB RAM, rootfs of at least 12 GB and /mnt/data of at least 16 GB on a container volume included in backups": "HAOS One vyžaduje neprivilegovaný kontajner LXC typu unmanaged s nesting a keyctl, 2 jadrá, 2048 MB RAM, koreňový súborový systém s najmenej 12 GB a /mnt/data s najmenej 16 GB na dátovom zväzku kontajnera zahrnutom do záloh", + "HTML5 Network Speed Test Server.": "Server na testovanie rýchlosti siete cez HTML5.", "HTTP service check without a saved URL": "Kontrola služby HTTP bez uloženého URL", - "Habridge emulates Philips Hue API to other home automation gateways such as an Amazon Echo/Dot Gen 1 (gen 2 has issues discovering ha-bridge) or other systems that support Philips Hue. The Bridge handles basic commands such as On, Off and brightness commands of the hue protocol. This bridge can control most devices that have a distinct API.": "Habridge napodobňuje Philipsa Spoločnosť Amazon tvrdí, že spoločnosť LuxOpCo by mala mať prístup k webovým stránkam spoločnosti LuxOpCo. Most riadi základné príkazy, ako je On, Off a jas príkazy protokolu odtieňov. Tento most môže ovládať väčšinu zariadení, ktoré majú odlišné API.", - "HandBrake is an open-source tool, built by volunteers, for converting video from nearly any format to a selection of modern, widely supported codecs.": "HandBrake je open-source nástroj, postavený dobrovoľníkmi, pre konverziu video z takmer akéhokoľvek formátu na výber moderných, široko podporovaných kodekov.", + "Habridge emulates Philips Hue API to other home automation gateways such as an Amazon Echo/Dot Gen 1 (gen 2 has issues discovering ha-bridge) or other systems that support Philips Hue. The Bridge handles basic commands such as On, Off and brightness commands of the hue protocol. This bridge can control most devices that have a distinct API.": "ha-bridge emuluje API Philips Hue pre brány domácej automatizácie, napríklad Amazon Echo/Dot prvej generácie (druhá má problémy s vyhľadaním ha-bridge), a ďalšie kompatibilné systémy. Spracúva základné príkazy protokolu Hue na zapnutie, vypnutie a jas. Dokáže ovládať väčšinu zariadení s vlastným API.", + "HandBrake is an open-source tool, built by volunteers, for converting video from nearly any format to a selection of modern, widely supported codecs.": "HandBrake je nástroj s otvoreným zdrojovým kódom vytvorený dobrovoľníkmi na prevod videa z takmer ľubovoľného formátu do moderných, široko podporovaných kodekov.", "Hardening SSH: setting MaxAuthTries to 3...": "Spevňujem SSH: nastavujem MaxAuthTries na 3...", "Hardware acceleration for Emby": "Zrýchlenie hardvéru pre Emby", "Hardware acceleration for FileFlows": "Zrýchlenie hardvéru pre FileFlows", @@ -2712,11 +2746,11 @@ "Have a Private Social Space Hosted on Your Site": "Majte na svojej stránke vlastný sociálny priestor", "Have valid backups of all VMs and containers": "Majte platné zálohy všetkých VM a kontajnerov", "Health check failed:": "Kontrola stavu zlyhala:", - "Healthchecks is a watchdog for your cron jobs. It's a web server that listens for pings from your cron jobs, plus a web interface.": "Healthchecks je strážny pes pre vaše Cron pracovných miest. Je to webový server, ktorý počúva na ping z vašich Cron jobs, plus webové rozhranie.", + "Healthchecks is a watchdog for your cron jobs. It's a web server that listens for pings from your cron jobs, plus a web interface.": "Healthchecks dohliada na úlohy cron. Webový server prijíma ich kontrolné hlásenia a zobrazuje ich vo webovom rozhraní.", "HedgeDoc gives you access to all your files wherever you are.": "HedgeDoc vám umožní prístup ku všetkým súborom kdekoľvek ste.", "HedgeDoc is a self-hosted collaborative Markdown editor for notes.": "HedgeDoc je vlastný spoločný editor Markdown pre poznámky.", "Heimdall is a way to organise all those links to your most used web sites and web applications in a simple way.": "Heimdall je spôsob, ako zorganizovať všetky tieto odkazy na vaše najpoužívanejšie webové stránky a webové aplikácie jednoduchým spôsobom.", - "Helium is a Chromium-based web browser made for people, with love. Privacy-first with unbiased ad-blocking.": "Helium je Chromium-založený webový prehliadač vyrobený pre ľudí, s láskou. Privacy-first with unsised ad-blocking.", + "Helium is a Chromium-based web browser made for people, with love. Privacy-first with unbiased ad-blocking.": "Helium je prehliadač založený na Chromiu, vytvorený s dôrazom na používateľa. Uprednostňuje súkromie a nestranné blokovanie reklám.", "Help & Info (commands)": "Pomoc a informácie (príkazy)", "Help & Information": "Pomoc a informácie", "Help and Info": "Pomoc a informácie", @@ -2729,14 +2763,14 @@ "High Availability services have been enabled successfully": "Služby High Availability boli úspešne zapnuté", "High Availability setup completed": "Nastavenie High Availability je dokončené", "High availability resources are not supported by this profile": "Tento profil nepodporuje vysoko dostupné zdroje", - "High availability resources are not supported for stacks": "Vysoká dostupnosť zdrojov nie sú podporované pre stohy", + "High availability resources are not supported for stacks": "Aplikácie s viacerými kontajnermi nepodporujú prostriedky spravované službou vysokej dostupnosti (HA)", "High risk confirmation": "Potvrdenie vysokého rizika", "High-Risk GPU Power State": "Rizikový stav napájania GPU", "Home Assistant": "Home Assistant", - "Home Assistant Core - Open source home automation that puts local control and privacy first. Powered by a worldwide community of tinkerers and DIY enthusiasts. Perfect to run on a Raspberry Pi or a local server": "Home Assistant Core - Open source domácej automatizácie, ktorá kladie miestne ovládanie a súkromie ako prvý. Poháňané celosvetovou komunitou drotárov a domácich nadšencov. Ideálne pre beh na Malinová Pi alebo miestny server", + "Home Assistant Core - Open source home automation that puts local control and privacy first. Powered by a worldwide community of tinkerers and DIY enthusiasts. Perfect to run on a Raspberry Pi or a local server": "Home Assistant Core je systém domácej automatizácie s otvoreným zdrojovým kódom, ktorý uprednostňuje lokálne ovládanie a súkromie. Rozvíja ho celosvetová komunita nadšencov a domácich majstrov. Hodí sa na Raspberry Pi alebo lokálny server.", "Home Assistant OS cannot be checked without an IP address": "Home Assistant OS nemožno skontrolovať bez IP adresy", - "Home Assistant OS did not pass the Supervisor, Core and Observer checks": "Home Assistant OS neprešiel dozorcom, základnými a pozorovateľmi", - "Home Assistant OS ready: Supervisor, Core and Observer running": "Home Assistant OS pripravený: Supervízor, jadro a pozorovateľ beží", + "Home Assistant OS did not pass the Supervisor, Core and Observer checks": "Home Assistant OS neprešiel kontrolami Supervisor, Core a Observer", + "Home Assistant OS ready: Supervisor, Core and Observer running": "Home Assistant OS je pripravený: Supervisor, Core a Observer bežia", "Home Assistant OS was not started: its addresses will be known once Core is running.": "Home Assistant OS sa nezačalo: jeho adresy budú známe po spustení Core.", "Home Assistant Observer": "Home Assistant Observer", "Home Automation systems": "Systémy domácej automatizácie", @@ -2767,7 +2801,7 @@ "Host Path": "Cesta na hostovi", "Host Path:": "Cesta na hostovi:", "Host Storage (NFS / Samba via Proxmox)": "Úložisko na serveri (NFS / Samba cez Proxmox)", - "Host USB bus": "Host USB autobus", + "Host USB bus": "USB zbernica hostiteľa", "Host USB node (e.g. /dev/ttyACM0 or /dev/bus/usb/003/004)": "Hostiteľský uzol USB (napr. /dev/ttyACM0 alebo /dev/bus/usb/003/004)", "Host VFIO config was already up to date — no reboot needed.": "VFIO nastavenie hosta už bolo aktuálne - reštart nie je potrebný.", "Host VFIO configuration already up to date": "VFIO nastavenie hosta je už aktuálne", @@ -2786,8 +2820,9 @@ "Host device node": "Uzol hostiteľského zariadenia", "Host directories are not included in the backup and are not reverted by a recovery.": "Hostiteľské adresáre nie sú zahrnuté do zálohy a nie sú vrátené zotavením.", "Host directories are not included in the backups and are not reverted by a recovery.": "Hostiteľské adresáre nie sú zahrnuté v zálohách a nie sú vrátené zotavením.", + "Host directories are not reverted by the backup (confirmed beforehand)": "Adresáre hostiteľa sa zo zálohy nevracajú do pôvodného stavu (vopred potvrdené)", "Host directories cannot be included in vzdump": "Hostiteľské adresáre nemožno zahrnúť do vzdump", - "Host directories cannot be part of the vzdump backup": "Hostiteľské adresáre nemôžu byť súčasťou zálohy", + "Host directories cannot be part of the vzdump backup": "Adresáre hostiteľa nemožno zahrnúť do zálohy vzdump", "Host directories that are kept, with their content:": "Hostiteľské adresáre, ktoré sú uchovávané, s ich obsahom:", "Host directory": "Adresár na serveri", "Host directory (created if it does not exist)": "Adresár na serveri (vytvorí sa, ak neexistuje)", @@ -2809,13 +2844,14 @@ "Host fstab NFS mounts (not registered with pvesm):": "NFS mounty v host fstab (nie sú registrované cez pvesm):", "Host fstab NFS mounts:": "NFS mounty v host fstab:", "Host fstab mounts (not registered as Proxmox storage):": "Mounty v host fstab (nie sú zaregistrované ako úložisko Proxmoxu):", + "Host has an active subscription but no active {short} repository. Configure its Enterprise source in {ui}; no repository changed.": "Server má aktívne predplatné, ale nemá aktívny repozitár {short}. Nastavte zdroj Enterprise v {ui}; žiadny repozitár sa nezmenil.", "Host identity (hostname, hosts)": "Identita hosta (hostname, hosts)", "Host kernel module loaded:": "Načítaný modul jadra hostiteľa:", "Host monitor configured: shared PID and network namespaces, LXCFS disabled in this container": "Konfigurovaný monitor hostiteľa: zdieľané PID a sieťové priestory, LXCFS vypnuté v tomto kontajneri", - "Host monitor verified: PID and network namespaces and memory match the host": "Monitor hostiteľa overený: PID a sieťové názvy a pamäť zodpovedajú hostiteľovi", - "Host monitor: shared PID/network and privileged access. A compromised image could affect Proxmox. Use only on trusted networks.": "Monitor hostiteľa: spoločná PID/sieť a privilegovaný prístup. Kompromisný obraz by mohol ovplyvniť Proxmox. Používajte len na dôveryhodných sieťach.", - "Host monitoring declined": "Monitorovanie hostiteľa sa znížilo", - "Host path for": "Hostiteľ cesta pre", + "Host monitor verified: PID and network namespaces and memory match the host": "Monitor hostiteľa je overený: menné priestory PID a siete aj pamäť zodpovedajú hostiteľovi", + "Host monitor: shared PID/network and privileged access. A compromised image could affect Proxmox. Use only on trusted networks.": "Monitorovanie hostiteľa so zdieľaným priestorom PID, sieťou a privilegovaným prístupom. Napadnutý obraz by mohol ohroziť Proxmox. Používajte iba v dôveryhodných sieťach.", + "Host monitoring declined": "Monitorovanie hostiteľa bolo odmietnuté", + "Host path for": "Cesta na hostiteľovi pre", "Host paths found in container configs or saved records (not targeted for removal):": "Cesty hostiteľa nájdené v konfiguráciách kontajnerov alebo v uložených záznamoch (neodstraňujú sa):", "Host permissions applied (o+rwx + default ACL) — unprivileged LXCs can read/write through bind-mounts": "Oprávnenia hosta boli nastavené (o+rwx + predvolené ACL) - neprivilegované LXC môžu čítať/zapisovať cez bind mounty", "Host system path": "Cesta k hostiteľskému systému", @@ -2841,7 +2877,7 @@ "ID already in use. Please choose another.": "Toto ID sa už používa. Vyberte iné.", "IGDB": "IGDB", "IGDB Client ID": "ID klienta IGDB", - "IGDB Client Secret": "IGDB klient tajomstvo", + "IGDB Client Secret": "Tajný kľúč klienta IGDB", "IMPORTANT": "DÔLEŽITÉ", "IMPORTANT NOTES:": "DÔLEŽITÉ POZNÁMKY:", "IMPORTANT PREREQUISITES:": "DÔLEŽITÉ PREDPOKLADY:", @@ -2880,17 +2916,18 @@ "IP": "IP", "IP address": "IP adresa", "IP address and firewall of the host": "IP adresa a firewall hostiteľa", - "IP address of this container for the certificate (0.0.0.0 if unknown)": "IP adresa tohto kontajnera pre osvedčenie (0,0.0, ak nie je známe)", + "IP address of this container for the certificate (0.0.0.0 if unknown)": "IP adresa tohto kontajnera pre certifikát (0.0.0.0, ak nie je známa)", "IP address:": "IP adresa:", "IP or hostname of the PVE node hosting the Borg server LXC:": "IP alebo hostname PVE uzla, na ktorom beží Borg server LXC:", "IPv4 address of the container": "IPv4 adresa kontajnera", "IPv4 address of the containers": "IPv4 adresa kontajnerov", - "IPv4 gateway (empty = no outbound route)": "Vstupná brána IPv4 (prázdna = žiadna úniková cesta)", + "IPv4 gateway (empty = no outbound route)": "Brána IPv4 (prázdne = bez odchádzajúcej trasy)", "ISO": "ISO", "ISO created successfully:": "ISO bolo úspešne vytvorené:", "ISO image — installation images": "ISO obraz — inštalačné obrazy", "ISO image downloaded": "ISO obraz bol stiahnutý", "ISO not found to mount on device": "ISO sa nenašlo na pripojenie k zariadeniu", + "Icons resolved: {resolved}; cleared: {cleared}; unchanged: {unchanged}; with a theme variant: {themed}": "Priradené ikony: {resolved}; vymazané: {cleared}; nezmenené: {unchanged}; s variantom témy: {themed}", "Identical:": "Zhodné:", "Identify candidate disk (never use system disk):": "Nájsť vhodný disk (nikdy nepoužívajte systémový disk):", "Identify persistent disk paths": "Zistiť trvalé cesty k diskom", @@ -2898,11 +2935,12 @@ "If Code 43 error appears, KVM hiding is already configured.": "Ak sa objaví chyba Code 43, KVM skrytie už je nastavené.", "If GUI does not load:": "Ak sa GUI nenačíta:", "If ZFS errors occur:": "Ak sa objavia chyby ZFS:", + "If a newer application image is available, the container is stopped and backed up, and the backup integrity is verified. The container is then updated using the new image.\n\nIf the update fails after the container was changed, ProxMenux attempts to restore the previous installation from the backup. If the operation remains incomplete, select the application in OCI management and choose \"Recover the previous installation\".\n\nHost directories mounted in the container are not restored by the container backup.": "Ak je dostupný novší obraz aplikácie, kontajner sa zastaví, vytvorí sa jeho záloha a overí sa jej integrita. Potom sa kontajner aktualizuje pomocou nového obrazu.\n\nAk aktualizácia po zmene kontajnera zlyhá, ProxMenux sa pokúsi obnoviť predchádzajúcu inštaláciu zo zálohy. Ak operácia zostane nedokončená, v správe OCI vyberte danú aplikáciu a možnosť „Obnoviť predchádzajúcu inštaláciu“.\n\nPripojené adresáre hostiteľa sa zo zálohy kontajnera neobnovujú.", "If booting in EFI mode with root on LVM: install GRUB for EFI": "Ak štartujete v EFI režime s root na LVM: nainštalujte GRUB pre EFI", "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):", @@ -2927,7 +2965,7 @@ "If you are sure you want to use it, remove the RAID metadata or format it manually using external tools.": "Ak ste sure, chcete ho použiť, odstráňte metadáta RAID alebo ich naformátujte manuálne pomocou externých nástrojov.", "If you choose No, install": "Ak vyberiete Nie, nainštalujte", "If you continue, some adjustments may be duplicated or conflict with those already made by xshok.": "Ak budete pokračovať, niektoré úpravy sa môžu zdvojiť alebo byť v konflikte s tým, čo už urobil xshok.", - "If you do not know what a variable does, answer No: the image keeps its own value.": "Ak neviete, čo premenná robí, odpovedzte Nie: obrázok si zachováva svoju vlastnú hodnotu.", + "If you do not know what a variable does, answer No: the image keeps its own value.": "Ak neviete, čo premenná robí, odpovedzte Nie. Obraz si zachová vlastnú hodnotu.", "If you have a Coral M.2 / PCIe device that is physically installed but not detected by lspci, cancel here and check your hardware first before proceeding.": "Ak máte zariadenie Coral M.2 / PCIe, ktoré je fyzicky nainštalované, ale nie je detekované lspci, zrušte to tu a pred pokračovaním najskôr skontrolujte hardvér.", "If you lose connectivity, you can restore from backup using the console.": "Ak stratíte pripojenie, môžete obnoviť zálohu cez konzolu.", "If you lose or reinstall this host without a copy of the passphrase somewhere else (password manager, offline note, another host, USB stick...), every encrypted archive in this Borg repository becomes UNRECOVERABLE.": "Ak tento host stratíte alebo preinštalujete bez kópie frázy niekde inde (správca hesiel, offline poznámka, iný host, USB kľúč...), každý šifrovaný archív v tomto Borg repozitári bude NEOBNOVITEĽNÝ.", @@ -2935,34 +2973,34 @@ "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 cache": "Comment", - "Image compatibility restored:": "Kompatibilita s obrázkom obnovená:", - "Image compatibility verified:": "Kompatibilita s obrázkom overená:", + "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": "Vyrovnávacia pamäť obrazov", + "Image compatibility restored:": "Kompatibilita obrazu bola obnovená:", + "Image compatibility verified:": "Kompatibilita obrazu bola 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 download failed:": "Sťahovanie obrazu zlyhalo:", + "Image downloaded": "Obraz bol stiahnutý", + "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 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:": "Image:", + "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": "Integrita obrazu bola overená", + "Image not allowed for the host monitor profile": "Obraz nie je povolený pre profil monitorovania hostiteľa", + "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:": "Obraz:", "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 CUDA requires NVIDIA driver 545 or later": "Immich CUDA vyžaduje ovládač NVIDIA verzie 545 alebo novší", + "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", - "Immich requires CUDA compute capability 5.2 or later": "Immich requires CUDA výpočtová schopnosť 5.2 alebo neskôr", - "Immich runtime without a validated translation": "Immich spustiť bez overeného prekladu", + "Immich requires CUDA compute capability 5.2 or later": "Immich vyžaduje výpočtovú schopnosť CUDA 5.2 alebo vyššiu", + "Immich runtime without a validated translation": "Prostredie Immich nemá overený prevod do natívneho LXC", "Immich server": "Server Immich", "Import — disk image imports": "Import — import diskových obrazov", "Import Disk Image to VM": "Importovať obraz disku do VM", @@ -3011,26 +3049,26 @@ "Incompatible instance directory": "Nekompatibilný inštančný adresár", "Incompatible instance record": "Nekompatibilný záznam o inštancii", "Incompatible record": "Nekompatibilný záznam", - "Incompatible stack assembly": "Nekompatibilná súprava stohov", + "Incompatible stack assembly": "Nekompatibilné zostavenie aplikácie", "Incompatible version": "Nekompatibilná verzia", "Incomplete NVIDIA identity": "Neúplná identita NVIDIA", "Incomplete NVIDIA inventory": "Neúplný inventár NVIDIA", "Incomplete Proxmox inventory": "Neúplný inventár Proxmox", "Incomplete Proxmox inventory; recovery blocked": "Neúplný inventár Proxmox; blokovaná obnova", - "Incomplete container removed:": "Neúplná odstránená nádoba:", + "Incomplete container removed:": "Nedokončený kontajner bol odstránený:", "Incomplete dependency order": "Neúplné poradie závislosti", "Incomplete device configuration": "Neúplná konfigurácia zariadenia", - "Incomplete file recipe or unknown paths": "Neúplný súbor recept alebo neznáme cesty", + "Incomplete file recipe or unknown paths": "Neúplný postup úpravy súborov alebo neznáme cesty", "Incomplete gzip layer": "Neúplná vrstva gzipu", "Incomplete mount configuration": "Neúplná konfigurácia pripojenia", "Incomplete or incompatible Proxmox inventory": "Neúplný alebo nezlučiteľný súpis Proxmox", "Incomplete primary network": "Neúplná primárna sieť", - "Incomplete stack order": "Neúplné poradie stohu", - "Incomplete stack removed": "Neúplný zásobník odstránený", + "Incomplete stack order": "Neúplné poradie kontajnerov aplikácie", + "Incomplete stack removed": "Nedokončená zostava bola odstránená", "Inconsistent adaptation profile and recipe": "Nekonzistentný adaptačný profil a recept", "Inconsistent host monitor profile": "Profil nekonzistentného monitora hostiteľa", - "Inconsistent stack identity": "Nejednotná identita stohu", - "Inconsistent stack membership for": "Nekonzistentný stack členstvo pre", + "Inconsistent stack identity": "Nekonzistentná identita aplikácie s viacerými kontajnermi", + "Inconsistent stack membership for": "Nekonzistentné členstvo kontajnera v aplikácii:", "Increase container RAM temporarily to": "Dočasne zvýšte RAM kontajnera na", "Increase file and process limits for advanced workloads": "Zvýšiť limity súborov a procesov pre náročnejšie použitie", "Increase various system limits": "Zvýšiť systémové limity", @@ -3038,9 +3076,10 @@ "Increasing maximum file system open files...": "Zvyšujem maximálny počet otvorených súborov v systéme...", "Increasing various system limits...": "Zvyšujem rôzne systémové limity...", "Independent LXC applications installed": "Inštalované nezávislé aplikácie LXC", - "Independent LXCs: no main container or hookscript. Each one keeps its own Start with Proxmox setting.": "Nezávislé LXCs: žiadny hlavný kontajner alebo hákový skript. Každý si ponechá svoj vlastný štart s nastavením Proxmox.", + "Independent LXCs: no main container or hookscript. Each one keeps its own Start with Proxmox setting.": "Samostatné kontajnery LXC bez hlavného kontajnera a skriptu hookscript. Každý si zachová vlastné nastavenie spúšťania spolu s Proxmoxom.", "Independent applications, without a main container.": "Nezávislé aplikácie bez hlavného kontajnera.", - "Indexers and quality profiles still need to be configured.": "Indexery a kvalitné profily ešte treba nakonfigurovať.", + "Index updated: {count} candidate applications": "Index bol aktualizovaný: {count} kandidátnych aplikácií", + "Indexers and quality profiles still need to be configured.": "Indexery a profily kvality ešte treba nastaviť.", "Inherited retention:": "Prevzaté uchovávanie:", "Inherited schedule:": "Prevzatý plán:", "Initial Nextcloud administrator": "Počiatočný správca Nextcloud", @@ -3048,7 +3087,7 @@ "Initial Paperless-ngx administrator": "Počiatočný správca Paperless-ngx", "Initial Tandoor administrator": "Počiatočný správca Tandoor", "Initial administrator created:": "Pôvodný správca vytvorený:", - "Initial administrator user": "Počiatočný užívateľ správcu", + "Initial administrator user": "Počiatočné používateľské meno správcu", "Initializing Borg repository if needed...": "Pripravujem Borg repozitár, ak je to potrebné...", "Initiator IQN is authorised on the target": "IQN iniciátora je na targete povolené", "Initiator IQN:": "IQN iniciátora:", @@ -3079,7 +3118,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 +3138,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", @@ -3110,14 +3149,17 @@ "Install with: apt-get install open-iscsi": "Nainštalujte cez: apt-get install open-iscsi", "Install/Update Coral TPU on Host": "Nainštalovať/aktualizovať Coral TPU na serveri", "Install/Update NVIDIA Drivers (Host + LXC)": "Nainštalovať/aktualizovať NVIDIA ovládače (server + LXC)", + "Install? [y/N]:": "Nainštalovať? [y/N]:", "Installation Complete": "Inštalácia dokončená", + "Installation blocked:": "Inštalácia je zablokovaná:", + "Installation cancelled.": "Inštalácia bola zrušená.", "Installation completed": "Inštalácia dokončená", "Installation completed.": "Inštalácia je dokončená.", "Installation completed. Please reboot the server manually as soon as possible.": "Inštalácia je dokončená. Čo najskôr ručne reštartujte server.", "Installation completed. Press Enter to continue...": "Inštalácia je dokončená. Pokračujte stlačením Enter...", "Installation failed": "Inštalácia zlyhala", "Installation finished but drivers are not loaded. A reboot may be required.": "Inštalácia sa dokončila, ale ovládače nie sú načítané. Možno bude potrebný reštart.", - "Installation incomplete. These containers and their data are kept:": "Inštalácia neúplná. Tieto nádoby a ich údaje sa uchovávajú:", + "Installation incomplete. These containers and their data are kept:": "Inštalácia nie je dokončená. Tieto kontajnery a ich údaje zostávajú zachované:", "Installation log:": "Záznam inštalácie:", "Installation settings": "Nastavenia inštalácie", "Installation summary": "Zhrnutie inštalácie", @@ -3179,17 +3221,18 @@ "Installing pigz...": "Inštalujem pigz...", "Installing required dependencies...": "Inštalujem potrebné závislosti...", "Installing required package: git": "Inštalujem potrebný balík: git", - "Installing required packages...": "Inštalujem required balíčky...", + "Installing required packages...": "Inštalujú sa požadované balíky...", "Installing required tools...": "Inštalujem potrebné nástroje...", "Installing selected utilities": "Inštalujem vybrané nástroje", "Installing system utilities...": "Inštalujem systémové nástroje...", - "Installing the new image": "Inštalácia nového obrázku", - "Installing the new image...": "Inštalujem nový obrázok...", - "Installing the new image:": "Inštalácia nového obrázku:", - "Installing the stack startup hook...": "Inštalácia stack startup...", + "Installing the new image": "Inštalácia nového obrazu", + "Installing the new image...": "Inštaluje sa nový obraz...", + "Installing the new image:": "Inštaluje sa nový obraz:", + "Installing the stack startup hook...": "Inštaluje sa spúšťací skript zostavy...", "Installing zfs-auto-snapshot package...": "Inštalujem balík zfs-auto-snapshot...", "Installs essential packages if missing": "Nainštaluje chýbajúce základné balíky", "Insufficient Disk Space": "Nedostatok miesta na disku", + "Insufficient disk space. Available:": "Nedostatok miesta na disku. Dostupné:", "Insufficient disk space. Skipping LXC": "Nedostatok miesta na disku. LXC preskakujem", "Insufficient memory. NVIDIA install aborted.": "Nedostatok pamäte. Inštalácia NVIDIA bola prerušená.", "Insufficient memory. Skipping LXC": "Nedostatok pamäte. LXC preskakujem", @@ -3206,12 +3249,12 @@ "Intel render device for recognition": "Zariadenie na rozpoznávanie informácií", "Intel/AMD (VA-API and QSV)": "Intel/AMD (VA-API a QSV)", "Intel/AMD (VA-API)": "Intel/AMD (VA-API)", - "Intel/AMD (streaming rendering and encoding)": "Intel/AMD (prevádzanie a kódovanie)", + "Intel/AMD (streaming rendering and encoding)": "Intel/AMD (vykresľovanie a kódovanie streamu)", "Intel/AMD DRM node (device only)": "Intel/AMD uzol DRM (iba zariadenie)", "Intel/AMD VA-API": "Intel/AMD VA-API", "Intel/AMD VA-API (no OpenCL mod)": "Intel/AMD VA-API (bez OpenCL mod)", - "Intel/AMD render node": "Uzol Intel/AMD", - "IntelliJ IDEA helps you write code faster with tools that eliminate tedious tasks and let you focus on what matters – building great software.": "IntelliJ IDEA vám pomôže napísať kód rýchlejšie s nástrojmi, ktoré eliminujú únavné úlohy a umožní vám sústrediť sa na to, čo je dôležité", + "Intel/AMD render node": "Vykresľovací uzol Intel/AMD", + "IntelliJ IDEA helps you write code faster with tools that eliminate tedious tasks and let you focus on what matters – building great software.": "IntelliJ IDEA pomáha písať kód rýchlejšie. Automatizuje zdĺhavé úlohy a umožňuje sústrediť sa na tvorbu kvalitného softvéru.", "Interactive (guided, prompts visible)": "Interaktívne (sprievodca, otázky viditeľné)", "Interactive process viewer (press q to exit)": "Interaktívny prehliadač procesov (ukončíte klávesom q)", "Interface": "Rozhranie", @@ -3225,13 +3268,16 @@ "Interfaces to Remove": "Rozhrania na odstránenie", "Internal error: NVIDIA installer path is empty or file not found.": "Vnútorná chyba: cesta k NVIDIA inštalátoru je prázdna alebo sa súbor nenašiel.", "Internal error: missing arguments in pmx_prepare_host_shared_dir": "Vnútorná chyba: chýbajú argumenty v pmx_prepare_host_shared_dir", - "Internal subnet of the tunnel (change it only if it clashes)": "Interný podsieť tunela (zmeniť ho, len ak sa zrazí)", - "Interrupted operation": "Prerušená operation", - "Interrupted operation:": "Prerušená operation:", - "Interrupted stack operation found": "Prerušený zásobník operation nájdený", + "Internal installer operation; not legacy adoption": "Interná operácia inštalátora; neslúži na prevzatie existujúceho kontajnera", + "Internal subnet of the tunnel (change it only if it clashes)": "Interná podsieť tunela (zmeňte ju iba pri konflikte)", + "Interrupted operation": "Prerušená operácia", + "Interrupted operation:": "Prerušená operácia:", + "Interrupted stack operation found": "Našla sa prerušená operácia celej aplikácie", "Invalid 'proxmox-ve' candidate (not 9.x or none). Please verify your repository configuration and network, then retry.": "Neplatný kandidát 'proxmox-ve' (nie je 9.x alebo chýba). Skontrolujte nastavenie repozitárov a sieť, potom skúste znova.", "Invalid ALLOWED_HOSTS value": "Neplatná hodnota ALLOWED_HOSTS", - "Invalid Home Assistant OS check timeout": "Neplatný čas odhlásenia Home Assistant OS", + "Invalid Compose port:": "Neplatný port v súbore Compose:", + "Invalid Compose volume path:": "Neplatná cesta dátového úložiska v súbore Compose:", + "Invalid Home Assistant OS check timeout": "Neplatný časový limit kontroly Home Assistant OS", "Invalid ID": "Neplatné ID", "Invalid IPv4 address": "Neplatná adresa IPv4", "Invalid IPv4 gateway": "Neplatná brána IPv4", @@ -3240,9 +3286,9 @@ "Invalid MAC address:": "Neplatná adresa MAC:", "Invalid NVIDIA destination": "Neplatné miesto určenia NVIDIA", "Invalid NVIDIA device:": "Neplatné NVIDIA zariadenie:", - "Invalid Nextcloud volume": "Neplatný objem Nextcloud", + "Invalid Nextcloud volume": "Neplatný dátový zväzok Nextcloud", "Invalid OCI Entrypoint": "Neplatný vstupný bod OCI", - "Invalid OCI digest": "Neplatná digescia OCI", + "Invalid OCI digest": "Neplatný identifikátor digest OCI", "Invalid OCR language:": "Neplatný jazyk OCR:", "Invalid Option": "Neplatná možnosť", "Invalid Path": "Neplatná cesta", @@ -3252,7 +3298,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", @@ -3260,21 +3306,22 @@ "Invalid VMID:": "Neplatný VMID:", "Invalid ZFS pool name.": "Neplatný názov ZFS poolu.", "Invalid absolute mount path": "Neplatná absolútna pripojovacia dráha", - "Invalid absolute path; avoid spaces, commas and relative segments": "Neplatná absolútna cesta; vyhnúť sa medzerám, čiarkam a relatívnym segmentom", + "Invalid absolute path; avoid spaces, commas and relative segments": "Neplatná absolútna cesta; nepoužívajte medzery, čiarky ani relatívne časti cesty", "Invalid acceleration profile": "Neplatný profil zrýchlenia", "Invalid access address:": "Neplatná adresa prístupu:", "Invalid action": "Neplatná akcia", "Invalid administrator email": "Neplatný administrátorský mail", "Invalid administrator user name": "Neplatné meno správcu", - "Invalid base VMID": "Neplatná základňa VMID", - "Invalid bridge": "Neplatný sieťový most", + "Invalid application identifier:": "Neplatný identifikátor aplikácie:", + "Invalid base VMID": "Neplatné základné VMID", + "Invalid bridge": "Neplatný sieťový most (bridge)", "Invalid check package:": "Neplatný kontrolný balík:", "Invalid configuration path:": "Neplatná konfiguračná dráha:", - "Invalid consume/export volumes": "Neplatné objemy spotreby/vývozu", + "Invalid consume/export volumes": "Neplatné dátové zväzky consume a export", "Invalid container path:": "Neplatná trasa kontajnera:", - "Invalid credential file path:": "Neplatná cesta k credential súboru:", + "Invalid credential file path:": "Neplatná cesta súboru s prihlasovacími údajmi:", "Invalid declarative entrypoint": "Neplatný deklaratívny vstupný bod", - "Invalid declarative stop signal": "Neplatná deklaratívna zastávka signal", + "Invalid declarative stop signal": "Neplatný deklaratívny signál zastavenia", "Invalid declarative working directory": "Neplatný deklaratívny pracovný adresár", "Invalid device UID": "Neplatné UID zariadenia", "Invalid device UID:": "Neplatné UID zariadenie:", @@ -3287,31 +3334,31 @@ "Invalid health check": "Neplatná kontrola zdravotného stavu", "Invalid healthcheck path": "Neplatná cesta kontroly zdravotného stavu", "Invalid healthcheck port": "Neplatný port na kontrolu zdravotného stavu", - "Invalid healthcheck request timeout": "Neplatná lehota na kontrolu zdravotného stavu", + "Invalid healthcheck request timeout": "Neplatný časový limit požiadavky kontroly stavu", "Invalid healthcheck scheme": "Neplatná schéma kontroly zdravotného stavu", - "Invalid healthcheck stability period": "Neplatná doba stability zdravotného poistenia", + "Invalid healthcheck stability period": "Neplatné obdobie overovania stability", "Invalid healthcheck timeout": "Neplatná lehota na kontrolu zdravotného stavu", "Invalid host kernel module name:": "Neplatné meno modulu jadra hostiteľa:", - "Invalid host monitor PID": "Neplatný monitor hostiteľa PID", + "Invalid host monitor PID": "Neplatné PID monitora hostiteľa", "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", "Invalid main member or duplicated members": "Neplatný hlavný člen alebo duplikovaný člen", "Invalid media path": "Neplatná mediálna cesta", - "Invalid media volume": "Neplatný objem média", - "Invalid mediafiles volume": "Neplatný objem súborov médií", + "Invalid media volume": "Neplatný dátový zväzok médií", + "Invalid mediafiles volume": "Neplatný dátový zväzok mediafiles", "Invalid minimum version:": "Neplatná minimálna verzia:", "Invalid mount name": "Neplatné meno pripojenia", "Invalid mount type": "Neplatný typ pripojenia", "Invalid name": "Neplatný názov", "Invalid name. Use only letters, numbers, hyphens and underscores.": "Neplatný názov. Použite iba písmená, čísla, pomlčky a podčiarkovníky.", - "Invalid native entrypoint": "Neplatný domáci vstupný bod", + "Invalid native entrypoint": "Neplatný natívny vstupný bod", "Invalid octal permissions": "Neplatné oktálne práva", "Invalid option": "Neplatná voľba", "Invalid option, please try again.": "Neplatná možnosť, skúste to znova.", @@ -3322,40 +3369,40 @@ "Invalid path": "Neplatná cesta", "Invalid path in the NVIDIA inventory": "Neplatná cesta v inventári NVIDIA", "Invalid post-start timeout in the configuration:": "Neplatný čas po štarte v konfigurácii:", - "Invalid private bridge": "Neplatný súkromný most", + "Invalid private bridge": "Neplatný súkromný sieťový most (bridge)", "Invalid private network": "Neplatná súkromná sieť", "Invalid prlimit value": "Neplatná hodnota prlimitu", "Invalid process limits format": "Neplatný formát obmedzení procesu", "Invalid read-only option": "Neplatná možnosť iba na čítanie", - "Invalid registry digest": "Neplatné trávenie registra", - "Invalid remote name": "Neplatné vzdialené meno", + "Invalid registry digest": "Neplatný identifikátor digest z registra", + "Invalid remote name": "Neplatný názov vzdialeného úložiska", "Invalid remote path": "Neplatná vzdialená cesta", "Invalid repair version:": "Neplatná verzia opravy:", "Invalid resource value": "Neplatná hodnota prostriedkov", "Invalid resources": "Neplatné zdroje", "Invalid restored volume path": "Neplatná cesta obnoveného objemu", - "Invalid running state": "Neplatný jazdný stav", - "Invalid saved image digest": "Uložený image digest nie je platný", - "Invalid security.unprivileged value:": "Neplatné zabezpečenie.neprivilegovaná hodnota:", + "Invalid running state": "Neplatný stav spustenia", + "Invalid saved image digest": "Neplatný uložený identifikátor digest obrazu", + "Invalid security.unprivileged value:": "Neplatná hodnota security.unprivileged:", "Invalid selection": "Neplatný výber", "Invalid service alias": "Neplatný alias služby", "Invalid service check URL": "Neplatné URL služby", "Invalid service check arguments": "Neplatné kontrolné argumenty služby", - "Invalid service check timeout": "Neplatný čas odhlásenia služby", + "Invalid service check timeout": "Neplatný časový limit kontroly služby", "Invalid shared path": "Neplatná spoločná cesta", "Invalid shutdown timeout": "Neplatný čas vypnutia", "Invalid size. Please enter a number in MB (e.g., 128, 256, 512).": "Neplatná veľkosť. Zadajte číslo v MB (napr. 128, 256, 512).", - "Invalid stack contract": "Neplatná zmluva o zásobníku", - "Invalid stack journal": "Neplatný zásobník", - "Invalid stack members": "Neplatní členovia stohu", - "Invalid stack name": "Neplatný názov stohu", - "Invalid stack operation": "Neplatný zásobník operation", + "Invalid stack contract": "Neplatná definícia zostavy", + "Invalid stack journal": "Neplatný záznam operácie aplikácie s viacerými kontajnermi", + "Invalid stack members": "Neplatní členovia aplikácie s viacerými kontajnermi", + "Invalid stack name": "Neplatný názov zostavy", + "Invalid stack operation": "Neplatná operácia aplikácie s viacerými kontajnermi", "Invalid storage": "Neplatné úložisko", "Invalid storage ID. Use only letters, numbers, hyphens and underscores.": "Neplatné ID úložiska. Použite iba písmená, čísla, pomlčky a podčiarkovníky.", "Invalid storage name": "Neplatný názov úložiska", - "Invalid suite application": "Neplatná aplikácia", + "Invalid suite application": "Neplatná aplikácia zostavy", "Invalid sysctl value:": "Neplatná sysctl hodnota:", - "Invalid template storage": "Neplatná pamäť šablóny", + "Invalid template storage": "Neplatné úložisko šablón", "Invalid template storage name.": "Neplatný názov úložiska šablóny.", "Invalid tmpfs options:": "Neplatné možnosti tmpfs:", "Invalid tmpfs path:": "Neplatná cesta tmpfs:", @@ -3363,9 +3410,9 @@ "Invalid username or password.": "Nesprávne meno používateľa alebo heslo.", "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 target": "Neplatný cieľ objemu", + "Invalid volume size": "Neplatná veľkosť dátového zväzku", + "Invalid volume size:": "Neplatná veľkosť trvalého úložiska:", + "Invalid volume target": "Neplatná cieľová cesta dátového zväzku", "IoT & Smart Home": "IoT a inteligentná domácnosť", "Is the value a password or secret?": "Je hodnota heslo alebo tajomstvo?", "Issue": "Problém", @@ -3379,30 +3426,32 @@ "It can be made on another storage of this host. This backup is temporary: it is deleted when the operation ends. The choice is remembered for the next operations of this application.": "Zálohu možno vytvoriť na inom úložisku tohto hostiteľa. Je dočasná a po skončení operácie sa odstráni. Táto voľba sa zapamätá aj pre ďalšie operácie aplikácie.", "It cannot be removed on its own, because the application would stop working: continuing removes the whole application.": "Nemôže sa odstrániť samostatne, pretože žiadosť by prestala fungovať: pokračuje v odstraňovaní celej aplikácie.", "It cannot be removed on its own, because the application would stop working: continuing targets the whole application for removal.": "Nedá sa odstrániť samostatne, pretože aplikácia by prestala fungovať: pokračovanie sa zameriava na odstránenie celej aplikácie.", - "It is created empty; existing data is not migrated automatically.": "Vytvára sa prázdny; existujúce údaje sa automaticky neprenášajú.", + "It is created empty; existing data is not migrated automatically.": "Nové úložisko bude prázdne; existujúce údaje sa doň automaticky neprenesú.", "It is recommended to create a backup before continuing.": "Pred pokračovaním sa odporúča vytvoriť zálohu.", "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ý.", "Its addresses are fixed and are not changed.": "Jeho adresy sú pevné a nemenia sa.", - "Its final cleanup did not complete. Select the stack again in the OCI management menu to complete it.": "Jeho záverečné vyčistenie sa nedokončilo. Ak ho chcete dokončiť, v ponuke Správca OCI aplikácií znova vyberte zásobník.", + "Its final cleanup did not complete. Select the stack again in the OCI management menu to complete it.": "Záverečné upratovanie sa nedokončilo. Ak ho chcete dokončiť, v ponuke správy OCI znova vyberte danú aplikáciu.", "Its labels are not applied: they are read by other Docker tools.": "Nepoužijú sa jej označenia: čítajú ich iné nástroje Docker.", "JC Channel logo applied": "Logo JC Channel bolo použité", - "JDownloader 2 with browser GUI and MyJDownloader support": "JDownloader 2 s podporou prehliadača a MyJDownloader", + "JDownloader 2 with browser GUI and MyJDownloader support": "JDownloader 2 s grafickým rozhraním v prehliadači a podporou MyJDownloader", "JDownloader WebUI": "JDownloader WebUI", "JSON output for scripts": "JSON výstup pre skripty", - "Jackett works as a proxy server: it translates queries from apps (Sonarr, SickRage, CouchPotato, Mylar, etc) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software. This allows for getting recent uploads (like RSS) and performing searches. Jackett is a single repository of maintained indexer scraping & translation logic - removing the burden from other apps.": "Jackett funguje ako proxy server: prekladá otázky z aplikácií (Sonarr, SickRage, CouchPotato, Mylar, atď) do tracker-site-specific http dotazov, analyzuje html odpoveď, potom pošle výsledky späť do žiadajúceho softvéru. To umožňuje získať najnovšie nahrávanie (ako RSS) a vykonávanie vyhľadávania. Jackett je jediný úložisko udržiavaného indexer škrabanie a preklad logiky - odstránenie záťaže z iných aplikácií.", + "Jackett works as a proxy server: it translates queries from apps (Sonarr, SickRage, CouchPotato, Mylar, etc) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software. This allows for getting recent uploads (like RSS) and performing searches. Jackett is a single repository of maintained indexer scraping & translation logic - removing the burden from other apps.": "Jackett funguje ako proxy server: dotazy z aplikácií Sonarr, SickRage, CouchPotato, Mylar a ďalších prevádza na HTTP dotazy pre jednotlivé trackery, spracuje ich HTML odpovede a výsledky vráti aplikácii. Umožňuje vyhľadávať aj získavať najnovšie príspevky cez RSS. Zdieľaná logika získavania a prevodu údajov z indexerov odbremeňuje ostatné aplikácie.", "Jellyfin WebUI": "Jellyfin WebUI", + "Jellyfin configuration already applied:": "Nastavenia Jellyfin už boli použité:", "Jellyfin configuration applied:": "Použitá konfigurácia Jellyfin:", - "Jellyfin did not create encoding.xml before the timeout": "Jellyfin nevytvoril kódovanie.xml pred prestávkou", - "Jellyfin has not created encoding.xml in any declared path": "Jellyfin nevytvoril kódovanie.xml v žiadnej deklarovanej ceste", + "Jellyfin configuration updated:": "Nastavenia Jellyfin boli aktualizované:", + "Jellyfin did not create encoding.xml before the timeout": "Jellyfin nevytvoril encoding.xml pred uplynutím časového limitu", + "Jellyfin has not created encoding.xml in any declared path": "Jellyfin nevytvoril encoding.xml v žiadnej deklarovanej ceste", "Jellyseerr is a free and open source software application for managing requests for your media library.": "Jellyseerr je bezplatná a open source softvérová aplikácia pre správu žiadostí o mediálnu knižnicu.", - "Jenkins Continuous Integration and Delivery server.": "Jenkins Nepretržitá integrácia a doručovací server.", - "Jenkins unlock": "Jenkins odomknúť", + "Jenkins Continuous Integration and Delivery server.": "Jenkins – server na priebežnú integráciu a dodávanie softvéru.", + "Jenkins unlock": "Odomknutie Jenkins", "Job": "Job", "Job ID (letters, numbers, - _)": "ID úlohy (písmená, čísla, - _)", "Job ID (optional)": "ID úlohy (voliteľné)", @@ -3415,7 +3464,7 @@ "Job enabled:": "Úloha zapnutá:", "Job selection returned empty id — aborting.": "Výber úlohy vrátil prázdne ID - prerušujem.", "Job updated successfully.": "Úloha bola úspešne aktualizovaná.", - "Joplin is a free, open source note taking and to-do application, which can handle a large number of notes organised into notebooks.": "Joplin je bezplatná, open source note, pričom a to-do aplikácie, ktoré dokážu zvládnuť veľký počet poznámok usporiadaných do notebookov.", + "Joplin is a free, open source note taking and to-do application, which can handle a large number of notes organised into notebooks.": "Joplin je bezplatná aplikácia s otvoreným zdrojovým kódom na poznámky a úlohy. Zvláda veľké množstvo poznámok usporiadaných do zápisníkov.", "Journald configuration adjusted to": "Nastavenie journald bolo upravené na", "Journald configuration is already optimized": "Nastavenie journald už je optimalizované", "Journald configuration updated and service restarted": "Nastavenie journald bolo aktualizované a služba reštartovaná", @@ -3426,12 +3475,12 @@ "KVM MSR options added to /etc/modprobe.d/kvm.conf": "Možnosti KVM MSR boli pridané do /etc/modprobe.d/kvm.conf", "KVM MSR options ensured in /etc/modprobe.d/kvm.conf": "Možnosti KVM MSR sú zaistené v /etc/modprobe.d/kvm.conf", "KVM MSR options not present, nothing to revert": "Možnosti KVM MSR nie sú prítomné, nie je čo vracať späť", - "Kali-linux - is an Advanced Penetration Testing Linux distribution used for Penetration Testing, Ethical Hacking and network security assessments. KALI LINUX ™ is a trademark of OffSec.": "Kali-linux - je Advanced Penetration Testing Linux distribúcia používaná pre Penetration Testing, Ethical Hacking a posúdenie bezpečnosti siete. KALI LINUX TM je ochranná známka OffSec.", - "Kasm Workspaces is a docker container streaming platform for delivering browser-based access to desktops, applications, and web services. Kasm uses devops-enabled Containerized Desktop Infrastructure (CDI) to create on-demand, disposable, docker containers that are accessible via web browser. Example use-cases include Remote Browser Isolation (RBI), Data Loss Prevention (DLP), Desktop as a Service (DaaS), Secure Remote Access Services (RAS), and Open Source Intelligence (OSINT) collections.": "Kasm Workspaces je docker kontajner streaming platforma pre poskytovanie prístupu prehliadača na desktopy, aplikácie a webové služby. Kasm používa devops-povolený Containerized Desktop Infrastructure (CDI) vytvoriť na požiadanie, jednorazové, docker kontajnery, ktoré sú prístupné prostredníctvom webového prehliadača. Príkladom prípadov použitia je izolácia diaľkového prehliadača (RBI), prevencia straty dát (DLP), zbierka Desktop ako služba (DaaS), Secure Remote Access Services (RAS) a Open Source Intelligence (OSINT).", - "Kavita is a fast, feature rich, cross platform reading server. Built with a focus for being a full solution for all your reading needs. Setup your own server and share your reading collection with your friends and family!": "Kavita je rýchly, funkcie bohatý, cross platform čítanie servera. Postavený so zameraním na to, že úplné riešenie pre všetky vaše potreby čítania. Nastavte si vlastný server a podeľte sa o kolekciu čítania so svojimi priateľmi a rodinou!", - "Kavita is a free and open source web based Comic and Book Server.": "Kavita je zadarmo a open source web based Comic and Book Server.", - "Kdenlive is a powerful free and open source cross-platform video editing program made by the KDE community. Feature rich and production ready.": "Kdenlive je výkonný voľný a otvorený zdroj multiplatformový program na úpravu videa vytvorený komunitou KDE. Motív bohatý a výroba pripravený.", - "KeePassXC is a free and open-source password manager. It started as a community fork of KeePassX (itself a cross-platform port of KeePass).": "KeePassXC je bezplatný a open-source správca hesiel. Začalo sa to ako komunita fork z KeePassX (samotne ako cross-platform port KeePass).", + "Kali-linux - is an Advanced Penetration Testing Linux distribution used for Penetration Testing, Ethical Hacking and network security assessments. KALI LINUX ™ is a trademark of OffSec.": "Kali Linux je linuxová distribúcia určená na penetračné testovanie, etický hacking a posudzovanie bezpečnosti sietí. KALI LINUX™ je ochranná známka spoločnosti OffSec.", + "Kasm Workspaces is a docker container streaming platform for delivering browser-based access to desktops, applications, and web services. Kasm uses devops-enabled Containerized Desktop Infrastructure (CDI) to create on-demand, disposable, docker containers that are accessible via web browser. Example use-cases include Remote Browser Isolation (RBI), Data Loss Prevention (DLP), Desktop as a Service (DaaS), Secure Remote Access Services (RAS), and Open Source Intelligence (OSINT) collections.": "Kasm Workspaces sprístupňuje pracovné plochy, aplikácie a webové služby v kontajneroch Docker cez prehliadač. Infraštruktúra CDI vytvára na požiadanie dočasné kontajnery. Využíva sa na izoláciu vzdialeného prehliadača (RBI), prevenciu úniku údajov (DLP), pracovnú plochu ako službu (DaaS), bezpečný vzdialený prístup (RAS) a získavanie informácií z otvorených zdrojov (OSINT).", + "Kavita is a fast, feature rich, cross platform reading server. Built with a focus for being a full solution for all your reading needs. Setup your own server and share your reading collection with your friends and family!": "Kavita je rýchly multiplatformový server na čítanie s množstvom funkcií. Ponúka úplné riešenie pre vašu knižnicu. Vytvorte si vlastný server a zdieľajte svoju zbierku s rodinou a priateľmi.", + "Kavita is a free and open source web based Comic and Book Server.": "Kavita je bezplatný webový server na komiksy a knihy s otvoreným zdrojovým kódom.", + "Kdenlive is a powerful free and open source cross-platform video editing program made by the KDE community. Feature rich and production ready.": "Kdenlive je výkonný bezplatný multiplatformový editor videa s otvoreným zdrojovým kódom od komunity KDE. Ponúka množstvo funkcií a je pripravený na profesionálnu prácu.", + "KeePassXC is a free and open-source password manager. It started as a community fork of KeePassX (itself a cross-platform port of KeePass).": "KeePassXC je bezplatný správca hesiel s otvoreným zdrojovým kódom. Vznikol ako komunitná odnož KeePassX, ktorý je multiplatformovou verziou KeePass.", "Keep GPU in LXC config (disable Start on boot)": "Ponechať GPU v nastavení LXC (vypnúť štart pri boote)", "Keep GPU in LXC config + disable Start on boot": "Ponechať GPU v nastavení LXC + vypnúť štart pri boote", "Keep GPU in VM config (disable Start on boot)": "Ponechať GPU v nastavení VM (vypnúť štart pri boote)", @@ -3440,6 +3489,7 @@ "Keep current version (N)": "Ponechať aktuálnu verziu (N)", "Keep current version (N) if modified": "Ponechať aktuálnu verziu (N), ak bola upravená", "Keep in source VM(s) + disable onboot + add to target VM": "Ponechať v pôvodných VM + vypnúť onboot + pridať do cieľovej VM", + "Keep the backup taken before the update in this Proxmox storage": "Ponechať zálohu vytvorenú pred aktualizáciou v tomto úložisku Proxmox", "Keeping GPU in source VM config": "Ponechávam GPU v nastavení zdrojovej VM", "Keeping the settings changed in Proxmox:": "Udržiavanie nastavenia v Proxmox:", "Kept sharedfiles group (has regular users assigned).": "Skupina sharedfiles zostala zachovaná (má priradených bežných používateľov).", @@ -3464,17 +3514,17 @@ "Keyfile recovery — pick source host": "Obnova keyfile - vyberte zdrojový host", "Keyfile removed.": "Keyfile odstránený.", "Keyrings method failed; trying apt-key fallback": "Metóda keyrings zlyhala; skúšam náhradný apt-key postup", - "KiCad - A Cross Platform and Open Source Electronics Design Automation Suite.": "KiCad - Cross Platform a Open Source Electronics Design Automation Suite.", + "KiCad - A Cross Platform and Open Source Electronics Design Automation Suite.": "KiCad – multiplatformový balík s otvoreným zdrojovým kódom na návrh elektroniky.", "Kimai has no default account. Enter the container with: pct enter {main_vmid}": "Kimai nemá predvolený účet. Do kontajnera vstúpite príkazom: pct enter {main_vmid}", - "Kimai is a professional grade time-tracking application, free and open-source.": "Kimai je profesionálna časová aplikácia, zadarmo a open-source.", - "Kometa is a powerful tool designed to give you complete control over your media libraries. With Kometa, you can take your customization to the next level, with granular control over metadata, collections, overlays, and much more.": "Kometa je výkonný nástroj navrhnutý tak, aby vám plnú kontrolu nad vaše mediálne knižnice. S Kometa, môžete vziať svoje prispôsobenie na ďalšiu úroveň, s granulovanou kontrolou nad metaúdaje, zbierky, prekrývanie, a oveľa viac.", - "Kometa reads its configuration from /config/config.yml and the container only ships /config/config.yml.template. Copy the template to config.yml, fill in the required Plex and TMDb connections, then restart the container.": "Kometa číta svoju konfiguráciu z /config/config.yml a kontajner iba lode /config/config.yml.templát. Skopírujte šablónu pre config.yml, vyplňte required Plex a TMDb pripojenia, potom reštartujte kontajner.", - "Komga is a media server for your comics, mangas, BDs, magazines and eBooks.": "Komga je mediálny server pre vaše komiksy, mangasy, BD, časopisy a eBooks.", - "Krita is a professional FREE and open source painting program. It is made by artists that want to see affordable art tools for everyone.": "Krita je profesionálny zadarmo a open source maliarsky program. Je vyrobený umelcami, ktorí chcú vidieť dostupné umelecké nástroje pre každého.", - "LAN access to the kept containers (stack configuration incomplete):": "Prístup LAN k uloženým kontajnerom (konfigurácia koša neúplná):", + "Kimai is a professional grade time-tracking application, free and open-source.": "Kimai je profesionálna bezplatná aplikácia na sledovanie pracovného času s otvoreným zdrojovým kódom.", + "Kometa is a powerful tool designed to give you complete control over your media libraries. With Kometa, you can take your customization to the next level, with granular control over metadata, collections, overlays, and much more.": "Kometa poskytuje podrobnú kontrolu nad mediálnymi knižnicami. Umožňuje prispôsobiť metadáta, kolekcie, grafické prekrytia a ďalšie prvky.", + "Kometa reads its configuration from /config/config.yml and the container only ships /config/config.yml.template. Copy the template to config.yml, fill in the required Plex and TMDb connections, then restart the container.": "Kometa číta nastavenia z /config/config.yml, kontajner však obsahuje iba /config/config.yml.template. Skopírujte šablónu do config.yml, vyplňte požadované pripojenia Plex a TMDb a kontajner reštartujte.", + "Komga is a media server for your comics, mangas, BDs, magazines and eBooks.": "Komga je mediálny server na komiksy, mangu, grafické romány, časopisy a elektronické knihy.", + "Krita is a professional FREE and open source painting program. It is made by artists that want to see affordable art tools for everyone.": "Krita je profesionálny bezplatný maliarsky program s otvoreným zdrojovým kódom. Vytvárajú ho umelci, ktorí chcú sprístupniť umelecké nástroje každému.", + "LAN access to the kept containers (stack configuration incomplete):": "Prístup z LAN k ponechaným kontajnerom (nastavenie zostavy nie je dokončené):", "LAN address applied to the application URLs": "LAN adresa použitá na URL aplikácie", "LLM App Development Platform": "Platforma vývoja aplikácií LLM", - "LM Studio can run local AI models like gpt-oss, Llama, Gemma, Qwen, and DeepSeek privately on your computer.": "LM Studio môže spustiť miestne modely AI ako Gpt-oss, Llama, Gemma, Qwen, a DeepSeek súkromne na vašom počítači.", + "LM Studio can run local AI models like gpt-oss, Llama, Gemma, Qwen, and DeepSeek privately on your computer.": "LM Studio umožňuje spúšťať modely AI ako gpt-oss, Llama, Gemma, Qwen a DeepSeek lokálne a súkromne na vašom počítači.", "LUNs appear as block devices assignable to VMs": "LUNy sa zobrazia ako blokové zariadenia priraditeľné k VM", "LVM PV headers check completed": "Kontrola LVM PV hlavičiek dokončená", "LVM physical volume detected": "Zistený fyzický zväzok LVM", @@ -3491,9 +3541,9 @@ "LXC containers with NVIDIA passthrough:": "LXC kontajnery s NVIDIA passthrough:", "LXC conversion from privileged to unprivileged completed successfully!": "Konverzia LXC z privilegovaného na neprivilegovaný kontajner bola úspešne dokončená.", "LXC conversion from unprivileged to privileged completed successfully!": "Konverzia LXC z neprivilegovaného na privilegovaný kontajner bola úspešne dokončená.", - "LXC entries outside the NVIDIA inventory of the journal": "LXC položiek mimo NVIDIA súpis časopisu", - "LXC entries outside the selected acceleration profile": "LXC položiek mimo zvoleného akceleračného profilu", - "LXC entry outside the read-only NVIDIA profile": "LXC vstup mimo profilu NVIDIA iba na čítanie", + "LXC entries outside the NVIDIA inventory of the journal": "Položky LXC mimo zoznamu zariadení NVIDIA v zázname operácie", + "LXC entries outside the selected acceleration profile": "Položky LXC mimo vybraného profilu zrýchlenia", + "LXC entry outside the read-only NVIDIA profile": "Položka LXC mimo profilu NVIDIA iba na čítanie", "LXC removed:": "LXC odstránený:", "LXC stopped": "LXC zastavený", "LXC update skipped by user.": "Aktualizácia LXC bola preskočená používateľom.", @@ -3501,18 +3551,18 @@ "LZO - fastest, weaker ratio": "LZO - najrýchlejší, slabší pomer", "Lab interruption after installing the new container": "Prerušenie laboratória po inštalácii nového kontajnera", "Lab interruption after protecting the data": "Prerušenie laboratória po ochrane údajov", - "Label Studio is an open source data labeling tool. It lets you label data types like audio, text, images, videos, and time series with a simple and straightforward UI and export to various model formats. It can be used to prepare raw data or improve existing training data to get more accurate ML models.": "Label Studio je open source nástroj na označovanie dát. Umožňuje označiť dátové typy ako audio, text, obrázky, videá a časové rady jednoduchým a jednoduchým UI a exportovať do rôznych formátov modelu. Môže sa použiť na prípravu nespracovaných údajov alebo zlepšenie existujúcich údajov o odbornej príprave s cieľom získať viac modelov accurate ML.", + "Label Studio is an open source data labeling tool. It lets you label data types like audio, text, images, videos, and time series with a simple and straightforward UI and export to various model formats. It can be used to prepare raw data or improve existing training data to get more accurate ML models.": "Label Studio je nástroj s otvoreným zdrojovým kódom na označovanie údajov, napríklad zvuku, textu, obrázkov, videa či časových radov. Ponúka jednoduché rozhranie a export do rôznych formátov pre modely. Pomáha pripraviť alebo zlepšiť tréningové údaje na presnejšie modely strojového učenia.", "Label:": "Štítok:", "Language Change": "Zmena jazyka", "Language changed to": "Jazyk bol zmenený na", - "Language/locale (e.g. es_ES.UTF-8; translation of every application is not guaranteed)": "Jazyk/lokál (napr. es ES.UTF-8; preklad každej aplikácie nie je zaručený)", + "Language/locale (e.g. es_ES.UTF-8; translation of every application is not guaranteed)": "Jazyk a miestne nastavenia (napr. es_ES.UTF-8; preklad každej aplikácie nie je zaručený)", "Last 50 kernel log lines": "Posledných 50 riadkov logu jadra", "Last run:": "Posledné spustenie:", "Last system boot time": "Čas posledného štartu systému", "Latest version:": "Najnovšia verzia:", "Launching GPU passthrough assistant for VM": "Spúšťam sprievodcu priamym priradením GPU pre VM", - "Lazylibrarian is a program to follow authors and grab metadata for all your digital reading needs. It uses a combination of Goodreads Librarything and optionally GoogleBooks as sources for author info and book info. This container is based on the DobyTang fork.": "Lazylibrarian je program sledovať autorov a chytiť metaúdaje pre všetky vaše potreby digitálneho čítania. Používa combination of Goodreads Librarything a voliteľne GoogleBooks ako zdroje pre autora info a book info. Tento kontajner je založený na DobyTang fork.", - "Ldap-auth software is for authenticating users who request protected resources from servers proxied by nginx. It includes a daemon (ldap-auth) that communicates with an authentication server, and a webserver daemon that generates an authentication cookie based on the user’s credentials. The daemons are written in Python for use with a Lightweight Directory Access Protocol (LDAP) authentication server (OpenLDAP or Microsoft Windows Active Directory 2003 and 2012).": "Software Llap-auth je určený pre autentifikáciu užívateľov, ktorí žiadajú chránené zdroje zo serverov proxied by nginx. Obsahuje démon (ldap-auth), ktorý komunikuje s autentifikačným serverom, a webserver démon, ktorý generuje autentifikačný cookie na základe užívateľa credentials. Démoni sú napísané v Python pre použitie s ľahkou Directory Access Protocol (LDAP) autentifikačný server (OpenLDAP alebo Microsoft Windows Active Directory 2003 a 2012).", + "Lazylibrarian is a program to follow authors and grab metadata for all your digital reading needs. It uses a combination of Goodreads Librarything and optionally GoogleBooks as sources for author info and book info. This container is based on the DobyTang fork.": "LazyLibrarian sleduje autorov a získava metadáta pre vašu digitálnu knižnicu. Informácie o autoroch a knihách čerpá z Goodreads, LibraryThing a voliteľne Google Books. Tento kontajner vychádza z vetvy DobyTang.", + "Ldap-auth software is for authenticating users who request protected resources from servers proxied by nginx. It includes a daemon (ldap-auth) that communicates with an authentication server, and a webserver daemon that generates an authentication cookie based on the user’s credentials. The daemons are written in Python for use with a Lightweight Directory Access Protocol (LDAP) authentication server (OpenLDAP or Microsoft Windows Active Directory 2003 and 2012).": "Ldap-auth overuje používateľov pristupujúcich k chráneným zdrojom cez proxy nginx. Obsahuje službu komunikujúcu s overovacím serverom a webovú službu, ktorá vytvára overovacie cookie podľa prihlasovacích údajov. Služby sú napísané v Pythone pre servery LDAP, napríklad OpenLDAP alebo Microsoft Windows Active Directory 2003 a 2012.", "Leave empty to auto-generate one.": "Ak chcete, aby sa automaticky vygeneroval, nechajte prázdne.", "Leave empty to keep every backup (not recommended).": "Ak chcete zachovať všetky zálohy, nechajte prázdne (neodporúča sa).", "Leave empty to use the retention of the storage.": "Ak chcete použiť uchovávanie úložiska, nechajte prázdne.", @@ -3524,24 +3574,25 @@ "Legend:": "Vysvetlivky:", "Let's review your current network configuration.": "Pozrime si aktuálne nastavenie siete.", "Liberate your videos and unleash infinite possibilities.": "Uvoľnite svoje videá a uvoľnite nekonečné možnosti.", - "Libraries: /data/media/movies, /data/media/series and /data/media/music. Select them in the media server.": "Knižnice: /data/media/mobiles, /data/media/series a /data/media/music. Vyberte ich na mediálnom serveri.", + "Libraries: /data/media/movies, /data/media/series and /data/media/music. Select them in the media server.": "Knižnice: /data/media/movies, /data/media/series a /data/media/music. Vyberte ich v mediálnom serveri.", + "Library": "Knižnica", "Library size in GB": "Veľkosť knižnice v GB", "LibreDB Studio": "LibreDB Studio", - "LibreOffice is a free and powerful office suite, and a successor to OpenOffice.org (commonly known as OpenOffice). Its clean interface and feature-rich tools help you unleash your creativity and enhance your productivity.": "LibreOffice je bezplatný a výkonný kancelársky apartmán a nástupca OpenOffice.org (bežne známy ako OpenOffice). Jeho čisté rozhranie a funkcie bohaté nástroje vám pomôžu uvoľniť vašu kreativitu a zvýšiť vašu produktivitu.", - "LibreWolf is a custom and independent version of Firefox, with the primary goals of privacy, security and user freedom. LibreWolf also aims to remove all the telemetry, data collection and annoyances, as well as disabling anti-freedom features like DRM.": "LibreWolf je vlastná a nezávislá verzia Firefox, s primárnymi cieľmi súkromia, bezpečnosti a užívateľskej slobody. Cieľom LibreWolf je tiež odstrániť všetky telemetriu, zber dát a otravy, ako aj znemožniť protislobodnosť funkcií ako DRM.", + "LibreOffice is a free and powerful office suite, and a successor to OpenOffice.org (commonly known as OpenOffice). Its clean interface and feature-rich tools help you unleash your creativity and enhance your productivity.": "LibreOffice je bezplatný a výkonný kancelársky balík a nástupca OpenOffice.org, známeho ako OpenOffice. Prehľadné rozhranie a bohaté nástroje podporujú tvorivosť a zvyšujú produktivitu.", + "LibreWolf is a custom and independent version of Firefox, with the primary goals of privacy, security and user freedom. LibreWolf also aims to remove all the telemetry, data collection and annoyances, as well as disabling anti-freedom features like DRM.": "LibreWolf je nezávislá upravená verzia Firefoxu zameraná na súkromie, bezpečnosť a slobodu používateľa. Odstraňuje telemetriu, zber údajov a rušivé prvky a vypína funkcie obmedzujúce používateľa, napríklad DRM.", "Librespeed is a very lightweight Speedtest implemented in Javascript, using XMLHttpRequest and Web Workers.": "Librespeed je veľmi ľahký Speedtest implementovaný v Javascripte, pomocou XMLHttpRequest a Web Workers.", - "Lidarr is a music collection manager for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new tracks from your favorite artists and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available.": "Lidarr je manažérom hudobných kolekcií pre užívateľov Usenet a BitTorrent. To môže sledovať viac RSS kanálov pre nové stopy od svojich obľúbených umelcov a bude chytiť, triediť a premenovať ich. Môže byť tiež nakonfigurovaný tak, aby automaticky upgrade kvality súborov už stiahnutých, keď je k dispozícii kvalitnejší formát.", - "Lightweight Docker management UI": "Ľahké Docker Management UI", + "Lidarr is a music collection manager for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new tracks from your favorite artists and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available.": "Lidarr je správca hudobnej zbierky pre používateľov Usenetu a BitTorrentu. Sleduje RSS kanály s novými skladbami obľúbených interpretov, získava ich, triedi a premenúva. Dokáže tiež nahradiť už stiahnuté súbory kvalitnejšou verziou, keď sa objaví.", + "Lightweight Docker management UI": "Nenáročné rozhranie na správu Dockeru", "Likely cause: host directory permissions deny the container's mapped UID.": "Pravdepodobná príčina: oprávnenia priečinka na hostovi nepovoľujú namapované UID kontajnera.", "Limiting size and optimizing journald": "Obmedzujem veľkosť a optimalizujem journald", "Limiting size and optimizing journald...": "Obmedzujem veľkosť a optimalizujem journald...", - "Limnoria A robust, full-featured, and user/programmer-friendly Python IRC bot, with many existing plugins. Successor of the well-known Supybot.": "Limnoria Robustný, full-featured, a užívateľsky / programátor-friendly Python IRC robot, s mnohými existujúcimi modulmi. Nástupca známeho Supybota.", - "Limnoria joins no IRC network until its configuration file exists. Create it with the setup wizard from the Proxmox host: pct exec -- bash -c 'cd /config && limnoria-wizard'": "Limnoria sa pripája k žiadnej sieti IRC, kým neexistuje jej konfiguračný súbor. Vytvorte ho pomocou sprievodcu nastavením z Proxmox hostiteľa: pct exec -- bash -c 'cd /config && limnoria-wizard'", + "Limnoria A robust, full-featured, and user/programmer-friendly Python IRC bot, with many existing plugins. Successor of the well-known Supybot.": "Limnoria je robustný a funkčne bohatý IRC robot v Pythone, prívetivý pre používateľov aj programátorov. Ponúka mnoho doplnkov a je nástupcom známeho Supybota.", + "Limnoria joins no IRC network until its configuration file exists. Create it with the setup wizard from the Proxmox host: pct exec -- bash -c 'cd /config && limnoria-wizard'": "Limnoria sa nepripojí k žiadnej sieti IRC, kým neexistuje konfiguračný súbor. Vytvorte ho sprievodcom spusteným z hostiteľa Proxmox: pct exec -- bash -c 'cd /config && limnoria-wizard'", "Line to paste (single line, including \"command=...\" prefix):": "Riadok na vloženie (jeden riadok vrátane predpony \"command=...\"):", "Linux Installation Options": "Možnosti inštalácie Linuxu", "Linux/Mac path:": "Cesta pre Linux/Mac:", "LinuxServer Jellyfin with optional GPU passthrough": "LinuxServer Jellyfin s voliteľným GPU priechodom", - "LinuxServer MariaDB requires a user, database and password": "LinuxServer MariaDB requires a user, databáza a heslo", + "LinuxServer MariaDB requires a user, database and password": "LinuxServer MariaDB vyžaduje používateľa, databázu a heslo", "List Available Disks": "Zobraziť dostupné disky", "List IOMMU group mapping": "Zobraziť mapovanie IOMMU skupín", "List NVMe devices": "Zobraziť NVMe zariadenia", @@ -3553,6 +3604,7 @@ "List all containers to identify the privileged one:": "Zobraziť všetky kontajnery a nájsť privilegovaný:", "List all containers to identify the unprivileged one:": "Zobraziť všetky kontajnery a nájsť neprivilegovaný:", "List all virtual machines": "Zobraziť všetky VM", + "List applications": "Vypísať aplikácie", "List backups in a specific storage": "Zobraziť zálohy v konkrétnom úložisku", "List block devices and partitions": "Zobraziť blokové zariadenia a oddiely", "List configured storages:": "Zobraziť nastavené úložiská:", @@ -3567,7 +3619,7 @@ "Listening on:": "Počúva na:", "Listening ports:": "Počúvajúce porty:", "Listing relevant CT users and their mapped UID/GID on host...": "Zobrazujem relevantných používateľov CT a ich namapované UID/GID na hostovi...", - "Load and verify the WireGuard module on the Proxmox host": "Načítať a overiť WireGuard modul na Proxmox hostiteľa", + "Load and verify the WireGuard module on the Proxmox host": "Načítať a overiť modul WireGuard na hostiteľovi Proxmox", "Loading modules...": "Načítavam moduly...", "Loading the Helper-Scripts catalog...": "Načítava sa katalóg Helper-Scripts...", "Loading the host kernel module:": "Načítavam modul hostiteľského jadra:", @@ -3581,7 +3633,7 @@ "Local keyfile is missing but a recovery copy was found in PBS.": "Lokálny keyfile chýba, ale v PBS sa našla obnovovacia kópia.", "Local network only (192.168.0.0/16)": "Iba lokálna sieť (192.168.0.0/16)", "Local restore error log": "Záznam chyby lokálnej obnovy", - "Local storage for PostgreSQL": "Lokálne skladovanie pre PostgreSQL", + "Local storage for PostgreSQL": "Lokálne úložisko pre PostgreSQL", "Locale generated": "Locale bolo vytvorené", "Location:": "Umiestnenie:", "Log": "Záznam", @@ -3596,11 +3648,11 @@ "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í.", + "Lollypop is a lightweight modern music player designed to work excellently on the GNOME desktop environment.": "Lollypop je nenáročný moderný hudobný prehrávač navrhnutý pre pracovné prostredie GNOME.", "Long Test — Background": "Dlhý test - na pozadí", "Long self-test started on": "Dlhý samo-test bol spustený na", "Long test — full scan, runs in background if closed": "Dlhý test - úplná kontrola, beží na pozadí aj po zatvorení", @@ -3611,7 +3663,7 @@ "Low free space warning": "Upozornenie na málo voľného miesta", "Low-code programming for event-driven applications": "Nízkokódové programovanie pre aplikácie riadené udalosťami", "Low-power CPU platform": "Úsporná CPU platforma", - "Luanti (formerly Minetest) is an open source voxel game-creation platform with easy modding and game creation": "Luanti (predtým Minetest) je open source voxel-creation platforma s jednoduchým moding a tvorba hry", + "Luanti (formerly Minetest) is an open source voxel game-creation platform with easy modding and game creation": "Luanti (predtým Minetest) je platforma s otvoreným zdrojovým kódom na tvorbu voxelových hier s jednoduchou podporou úprav a tvorby hier", "Lucky web interface": "Webové rozhranie Lucky", "Lychee is a free photo-management tool, which runs on your server or web-space. Installing is a matter of seconds. Upload, manage and share photos like from a native application. Lychee comes with everything you need and all your photos are stored securely.": "Lychee je bezplatný nástroj na správu fotografií, ktorý beží na vašom serveri alebo webovom priestore. Inštalácia je otázka sekúnd. Nahrajte, spravujte a zdieľajte fotografie ako z natívnej aplikácie. Lychee prichádza so všetkým, čo potrebujete a všetky vaše fotografie sú uložené bezpečne.", "Lynis - Security Audit": "Lynis - bezpečnostná kontrola", @@ -3640,7 +3692,7 @@ "Machine Type": "Typ stroja", "Machine learning": "Strojové učenie", "Machine learning container prepared": "Pripravený kontajner strojového učenia", - "Machine learning profile not implemented; it is not replaced by CPU:": "Strojový vzdelávací profil nie je implementovaný; nie je nahradený CPU:", + "Machine learning profile not implemented; it is not replaced by CPU:": "Profil strojového učenia nie je implementovaný; nenahradí sa CPU:", "Machine type: q35": "Typ stroja: q35", "Machine: q35": "Stroj: q35", "Main endpoint not yet defined": "Hlavný cieľ zatiaľ nedefinovaný", @@ -3652,7 +3704,7 @@ "Makefile missing in": "Makefile chýba v", "Malformed repository entries cleaned": "Poškodené položky repozitárov vyčistené", "Manage OCI": "Správa OCI", - "Manage OCI stack": "Spravovať stack OCI", + "Manage OCI stack": "Spravovať aplikáciu s viacerými kontajnermi", "Manage PBS encryption keyfile": "Spravovať šifrovací keyfile pre PBS", "Manage Secure Gateway": "Spravovať Secure Gateway", "Manage and inspect VM disk images": "Spravovať a kontrolovať diskové obrazy VM", @@ -3660,7 +3712,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.", @@ -3678,7 +3730,7 @@ "Manual review is required.": "Vyžaduje sa manuálna kontrola.", "Manual steps recommended after import": "Odporúčané ručné kroky po importe", "Manual upgrade guide step by step": "Ručný sprievodca aktualizáciou krok za krokom", - "Manyfold is an open source, self-hosted web application for managing a collection of 3D models, particularly focused on 3D printing.": "Manyfold je open source, self-hosted webová aplikácia pre správu kolekcie 3D modelov, najmä zamerané na 3D tlač.", + "Manyfold is an open source, self-hosted web application for managing a collection of 3D models, particularly focused on 3D printing.": "Manyfold je webová aplikácia s otvoreným zdrojovým kódom na vlastnom serveri na správu zbierky 3D modelov, najmä pre 3D tlač.", "Mapped GID on host": "GID namapované na serveri", "Mapped UID on host": "UID namapované na serveri", "MariaDB has no web interface: applications and clients connect to port 3306 of this container.": "MariaDB nemá webové rozhranie: aplikácie a klienti sa pripájajú na port 3306 tohto kontajnera.", @@ -3691,12 +3743,12 @@ "Maximum auto-repair attempts reached (3). Please review the log and run any remaining commands manually.": "Bol dosiahnutý maximálny počet automatických opráv (3). Skontrolujte záznam a zostávajúce príkazy spustite ručne.", "May need to restart terminal": "Možno bude potrebné reštartovať terminál", "Media & Streaming": "Médiá a streaming", - "Media discovery and request management for Jellyfin, Plex and Emby.": "Mediálny prieskum a správa požiadaviek pre Jellyfin, Plex a Emby.", - "Media library transcoding and health checking, with an internal worker node.": "Média knižnica transkódovanie a zdravotná kontrola, s interným uzol pracovníka.", + "Media discovery and request management for Jellyfin, Plex and Emby.": "Vyhľadávanie médií a správa požiadaviek pre Jellyfin, Plex a Emby.", + "Media library transcoding and health checking, with an internal worker node.": "Prevod formátov a kontrola stavu mediálnej knižnice s interným pracovným uzlom.", "Media server": "Mediálny server", "Media server selection cancelled or invalid": "Výber mediálneho servera zrušený alebo neplatný", - "MediaElch is a MediaManager for Kodi. Information about Movies, TV Shows, Concerts and Music are stored as nfo files. Fanarts are downloaded automatically from fanart.tv. Using the nfo generator, MediaElch can be used with other MediaCenters as well.": "MediaElch je MediaManager pre Kodi. Informácie o filmoch, TV Shows, koncertoch a hudbe sú uložené ako nfo súbory. Fanarty sa automaticky sťahujú z fanart.tv. Pomocou nFo generátora, MediaElch môžu byť použité s inými MediaCenters rovnako.", - "Medusa is an automatic Video Library Manager for TV Shows. It watches for new episodes of your favorite shows, and when they are posted it does its magic.": "Medusa je automatický manažér videoknižnice pre TV show. Sleduje nové epizódy vašich obľúbených šou, a keď sú zverejnené to robí jeho mágiu.", + "MediaElch is a MediaManager for Kodi. Information about Movies, TV Shows, Concerts and Music are stored as nfo files. Fanarts are downloaded automatically from fanart.tv. Using the nfo generator, MediaElch can be used with other MediaCenters as well.": "MediaElch je správca médií pre Kodi. Informácie o filmoch, seriáloch, koncertoch a hudbe ukladá do súborov nfo. Grafiku automaticky sťahuje z fanart.tv. Vďaka generovaniu nfo ho možno používať aj s inými mediálnymi centrami.", + "Medusa is an automatic Video Library Manager for TV Shows. It watches for new episodes of your favorite shows, and when they are posted it does its magic.": "Medusa automaticky spravuje knižnicu televíznych seriálov. Sleduje nové epizódy obľúbených seriálov a spracuje ich, keď sú dostupné.", "Memory": "Pamäť", "Memory in MB": "Pamäť v MB", "Memory optimization completed.": "Optimalizácia pamäte je dokončená.", @@ -3704,28 +3756,28 @@ "Memory restored.": "Pamäť obnovená.", "Memory settings optimized successfully": "Nastavenie pamäte bolo úspešne optimalizované", "Memory:": "Pamäť:", - "Memos is a lightweight, self-hosted memo hub. Open Source and Free forever.": "Memos je ľahký, self-hosted memo centrum. Open Source a Free navždy.", + "Memos is a lightweight, self-hosted memo hub. Open Source and Free forever.": "Memos je nenáročné centrum poznámok na vlastnom serveri. Má otvorený zdrojový kód a je navždy bezplatné.", "Messaging & Notifications": "Správy a upozornenia", "Messaging & Queues": "Správy a fronty", - "Messenger for the Decentralized Web": "Posol pre decentralizovaný web", + "Messenger for the Decentralized Web": "Komunikačná aplikácia pre decentralizovaný web", "Method:": "Spôsob:", - "Microsoft Edge is a cross-platform web browser developed by Microsoft and based on Chromium.": "Microsoft Edge je cross-platform webový prehliadač vyvinutý spoločnosťou Microsoft a založený na Chromium.", + "Microsoft Edge is a cross-platform web browser developed by Microsoft and based on Chromium.": "Microsoft Edge je multiplatformový webový prehliadač vyvíjaný Microsoftom a založený na Chromiu.", "Migrate VMs away from node being upgraded": "Presuňte VM mimo uzol, ktorý sa aktualizuje", "Migrate away any guests that must keep running": "Presuňte mimo uzla všetkých hostí, ktorí musia zostať bežať", "Migrated": "Migrované", "Migrated legacy ProxMenux NVIDIA blacklist state — module will reload after reboot": "Starý stav ProxMenux NVIDIA blacklistu bol migrovaný - modul sa znovu načíta po reštarte", "MineOS web interface": "Webové rozhranie MineOS", - "Minisatip is a multi-threaded satip server version 1.2 that runs under Linux and it was tested with DVB-S, DVB-S2, DVB-T, DVB-T2, DVB-C, DVB-C2, ATSC and ISDB-T cards.": "Minisatip je viacväzbová satipová verzia 1.2, ktorá beží pod Linuxom a bola testovaná pomocou DVB-S, DVB-S2, DVB-T, DVB-T2, DVB-C, DVB-C2, ATSC a ISDB-T kariet.", + "Minisatip is a multi-threaded satip server version 1.2 that runs under Linux and it was tested with DVB-S, DVB-S2, DVB-T, DVB-T2, DVB-C, DVB-C2, ATSC and ISDB-T cards.": "Minisatip je viacvláknový server SAT>IP verzie 1.2 pre Linux. Bol testovaný s kartami DVB-S, DVB-S2, DVB-T, DVB-T2, DVB-C, DVB-C2, ATSC a ISDB-T.", "Mirror URL not available for this script.": "Záložná adresa pre tento skript nie je dostupná.", "Miscellaneous": "Rôzne", "Missing": "Chýba", "Missing OCI metadata:": "Chýbajúce metaúdaje OCI:", "Missing commands after installation:": "Po inštalácii stále chýbajú tieto príkazy:", "Missing dependency": "Chýbajúca závislosť", - "Missing native directive:": "Chýbajúce domáce smernice:", + "Missing native directive:": "Chýbajúca natívna direktíva:", "Missing on target:": "Chýba na cieli:", "Missing or invalid parameter": "Parameter chýba alebo je neplatný", - "Missing required command:": "Chýba required príkaz:", + "Missing required command:": "Chýba požadovaný príkaz:", "Missing required parameter": "Chýba povinný parameter", "Mixed GPU Modes": "Rôzne režimy GPU", "Mixed current mode detected in selected GPU(s).": "Vybrané GPU sú v rôznych aktuálnych režimoch.", @@ -3736,13 +3788,13 @@ "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...", "Modules configuration updated.": "Nastavenie modulov bolo aktualizované.", "Modules loaded.": "Moduly boli načítané.", - "MongoDB 4.4, the last series that runs on a CPU without AVX.": "MongoDB 4.4, posledná séria beží na CPU bez AVX.", + "MongoDB 4.4, the last series that runs on a CPU without AVX.": "MongoDB 4.4 je posledný rad, ktorý funguje na CPU bez AVX.", "Monica is an open source personal relationship management system, that lets you document your life.": "Monica je open source systém riadenia osobných vzťahov, ktorý vám umožní dokumentovať svoj život.", "Monitor Activated": "Monitor je zapnutý", "Monitor Deactivated": "Monitor je vypnutý", @@ -3779,20 +3831,20 @@ "Mount Samba Share on Host": "Pripojiť Samba zdieľanie na hostovi", "Mount USB disk?": "Pripojiť USB disk?", "Mount a USB drive now": "Pripojiť USB disk teraz", - "Mount activation cancelled": "Aktivácia montáže zrušená", + "Mount activation cancelled": "Aktivácia pripojenia bola zrušená", "Mount all datasets": "Pripojiť všetky datasety", "Mount already exists for this path in container": "Pre túto cestu už v kontajneri mount existuje", "Mount and persist with UUID:": "Pripojiť a uložiť natrvalo pomocou UUID:", - "Mount configuration cancelled": "Konfigurácia montáže zrušená", + "Mount configuration cancelled": "Nastavenie pripojenia bolo zrušené", "Mount failed": "Pripojenie zlyhalo", "Mount mode applied": "Použitý režim montáže", "Mount name": "Názov pripojenia", - "Mount not authorized by the operation": "Pripojiť nie je povolené operation", + "Mount not authorized by the operation": "Toto pripojenie nie je operáciou povolené", "Mount options:": "Možnosti pripojenia:", - "Mount or create it with its data and run the recovery again.": "Pripojte alebo vytvorte ho s jeho údajmi a znova spustite obnovenie.", + "Mount or create it with its data and run the recovery again.": "Pripojte alebo vytvorte adresár s potrebnými údajmi a registráciu zopakujte.", "Mount path must be an absolute path starting with /": "Cesta pripojenia musí byť absolútna a začínať znakom /", "Mount path:": "Cesta pripojenia:", - "Mount paths must not overlap": "Pripojiť cesty sa nesmú prekrývať", + "Mount paths must not overlap": "Cesty pripojenia sa nesmú prekrývať", "Mount point created": "Mount point bol vytvorený", "Mount point created.": "Mount point bol vytvorený.", "Mount point is visible but NOT writable from inside the container": "Mount point je viditeľný, ale zvnútra kontajnera NIE JE zapisovateľný", @@ -3808,7 +3860,7 @@ "Mount status:": "Stav pripojenia:", "Mount this device and use it as the backup destination?": "Pripojiť toto zariadenie a použiť ho ako cieľ záloh?", "Mount was busy — performed lazy unmount": "Mount sa používal - vykonalo sa oneskorené odpojenie (lazy unmount)", - "Mount your cloud drive on your home NAS": "Namontujte svoju cloudovú jazdu na váš domov NAS", + "Mount your cloud drive on your home NAS": "Pripojte cloudový disk k domácemu NAS", "Mounted": "Pripojené", "Mounted ISO on device": "ISO bolo pripojené k zariadeniu", "Mounted at": "Pripojené v", @@ -3825,18 +3877,18 @@ "Mounting here will hide existing files until unmounted.": "Pripojenie do tohto priečinka dočasne skryje existujúce súbory, kým zdieľanie neodpojíte.", "Move that copy offsite (USB, password manager, another host). Delete it from this path when done.": "Presuňte túto kópiu mimo servera (USB, správca hesiel, iný host). Po dokončení ju z tejto cesty odstráňte.", "Move to target VM (remove from source VM config)": "Presunúť do cieľovej VM (odstrániť zo zdrojovej VM)", - "Moving the data volumes aside": "Presun dátových objemov bokom", - "Moving the data volumes aside...": "Presunúť dáta nabok...", + "Moving the data volumes aside": "Presúvanie dátových zväzkov bokom", + "Moving the data volumes aside...": "Dátové zväzky sa presúvajú bokom...", "Multi-container application": "Aplikácia s viacerými kontajnermi", "Multi-container application (experimental)": "Použitie viacerých kontajnerov (experimentálne)", - "Multi-line variables are not supported": "Multi-line premenné nie sú podporované", + "Multi-line variables are not supported": "Viacriadkové premenné nie sú podporované", "Multiple networks or external networks are not yet supported": "Viaceré siete alebo externé siete zatiaľ nie sú podporované", "Multiple recovery groups found in PBS. Pick the one that originally created the keyfile:": "V PBS sa našlo viac obnovovacích skupín. Vyberte tú, ktorá pôvodne vytvorila keyfile:", "Multiple rootfs directories were found in this archive. Restore cannot continue automatically.": "V tomto archíve sa našlo viac priečinkov rootfs. Automatická obnova nemôže pokračovať.", - "Music Collection and Streaming Server": "Zber hudby a streamovanie servera", + "Music Collection and Streaming Server": "Správca hudobnej zbierky a streamovací server", "Music software that transforms your listening experience": "Hudobný softvér, ktorý mení vaše počúvanie", "MySQL Workbench is a unified visual tool for database architects, developers, and DBAs. MySQL Workbench provides data modeling, SQL development, and comprehensive administration tools for server configuration, user administration, backup, and much more.": "MySQL Workbench je jednotný vizuálny nástroj pre databázových architektov, vývojárov a DBA. MySQL Workbench poskytuje dátové modelovanie, vývoj SQL a komplexné nástroje správy pre konfiguráciu serverov, správu užívateľov, zálohovanie a oveľa viac.", - "Mylar3 is an automated Comic Book downloader (cbr/cbz) for use with NZB and torrents written in python. It supports SABnzbd, NZBGET, and many torrent clients in addition to DDL.": "Mylar3 je automatický downloader Comic Book (cbr/cbz) pre použitie s NZB a torrenty napísané v pythone. Podporuje SABnzbd, NZBGET, a mnoho torrentových klientov okrem DDL.", + "Mylar3 is an automated Comic Book downloader (cbr/cbz) for use with NZB and torrents written in python. It supports SABnzbd, NZBGET, and many torrent clients in addition to DDL.": "Mylar3 je automatický nástroj na sťahovanie komiksov (cbr/cbz) cez NZB a torrenty, napísaný v Pythone. Podporuje SABnzbd, NZBGET, mnohých torrentových klientov aj priame sťahovanie (DDL).", "NAS Systems": "NAS systémy", "NETWORK CONFIGURATION ANALYSIS": "ANALÝZA NASTAVENIA SIETE", "NFS Access Restricted": "NFS prístup je obmedzený", @@ -3900,7 +3952,7 @@ "NICs:": "Sieťové karty:", "NOT FOUND": "NENÁJDENÉ", "NOTE: The host directory and its contents will remain unchanged.": "POZNÁMKA: priečinok na hostovi ani jeho obsah sa nezmenia.", - "NUT server user for clients such as PeaNUT": "Používateľ NUT server pre klientov ako PeaNUT", + "NUT server user for clients such as PeaNUT": "Používateľ servera NUT pre klientov ako PeaNUT", "NVENC patch detected — list narrowed to versions supported by keylase/nvidia-patch.": "Zistil sa NVENC patch - zoznam je zúžený na verzie podporované cez keylase/nvidia-patch.", "NVIDIA (CUDA)": "NVIDIA (CUDA)", "NVIDIA (CUDA; official GPU image)": "NVIDIA (CUDA; oficiálny obraz GPU)", @@ -3909,7 +3961,7 @@ "NVIDIA Actions": "Akcie pre NVIDIA", "NVIDIA CPU hiding already configured": "NVIDIA CPU skrytie už je nastavené", "NVIDIA Container Toolkit": "NVIDIA Container Toolkit", - "NVIDIA Container Toolkit could not generate the runtime inventory": "NVIDIA Container Toolkit nemohol vygenerovať časový inventár", + "NVIDIA Container Toolkit could not generate the runtime inventory": "NVIDIA Container Toolkit nedokázal vytvoriť zoznam súčastí prostredia NVIDIA", "NVIDIA Container Toolkit installed. GPU validation pending until the host restarts.": "Nainštalovaná súprava NVIDIA Container Toolkit. Čaká sa na overenie GPU, kým sa hostiteľ nereštartuje.", "NVIDIA Container Toolkit is incomplete. Missing:": "NVIDIA Container Toolkit je neúplná. Chýba:", "NVIDIA Container Toolkit is installed but its command line did not answer.": "NVIDIA Container Toolkit je nainštalovaný, ale jeho príkazový riadok neodpovedá.", @@ -3928,7 +3980,7 @@ "NVIDIA KVM hiding (cpu hidden=1)": "NVIDIA KVM skrytie (cpu hidden=1)", "NVIDIA KVM hiding already configured": "NVIDIA KVM skrytie už je nastavené", "NVIDIA Patch": "NVIDIA patch", - "NVIDIA device outside the expected native profile": "Zariadenie NVIDIA mimo očakávaného prirodzeného profilu", + "NVIDIA device outside the expected native profile": "Zariadenie NVIDIA mimo očakávaného natívneho profilu", "NVIDIA driver": "Ovládač NVIDIA", "NVIDIA driver installed successfully.": "Ovládač NVIDIA bol úspešne nainštalovaný.", "NVIDIA driver installed:": "Ovládač NVIDIA nainštalovaný:", @@ -3936,14 +3988,14 @@ "NVIDIA drivers are not installed or not loaded on this host.": "NVIDIA ovládače nie sú na tomto hostovi nainštalované alebo načítané.", "NVIDIA host services disabled for VFIO mode": "NVIDIA služby hosta vypnuté pre VFIO režim", "NVIDIA host services/autoload already aligned for native mode": "Služby/autoload NVIDIA na hoste už sú pripravené pre natívny režim", - "NVIDIA inside the container does not match the host driver or GPU": "NVIDIA vo vnútri kontajnera nezodpovedá hostiteľovi alebo GPU", + "NVIDIA inside the container does not match the host driver or GPU": "NVIDIA v kontajneri nezodpovedá ovládaču hostiteľa alebo GPU", "NVIDIA install incomplete. Check log:": "NVIDIA inštalácia nie je kompletná. Skontrolujte záznam:", "NVIDIA installer downloaded successfully": "NVIDIA inštalátor bol úspešne stiahnutý", "NVIDIA installer extracted.": "NVIDIA inštalátor rozbalený.", "NVIDIA installer not found at": "NVIDIA inštalátor sa nenašiel v", "NVIDIA installer reported an error. Check /tmp/nvidia_install.log": "NVIDIA inštalátor ohlásil chybu. Skontrolujte /tmp/nvidia_install.log", "NVIDIA installer returned error": "NVIDIA inštalátor vrátil chybu", - "NVIDIA is already attached": "NVIDIA je už pripojený", + "NVIDIA is already attached": "Zariadenie NVIDIA je už pripojené", "NVIDIA kernel modules unloaded successfully.": "Kernel moduly NVIDIA boli úspešne uvoľnené.", "NVIDIA libs require approximately 1.5GB of free space.": "NVIDIA knižnice vyžadujú približne 1,5 GB voľného miesta.", "NVIDIA mount with an unauthorized source or target": "Pripojenie NVIDIA s neoprávneným zdrojom alebo cieľom", @@ -3962,7 +4014,7 @@ "NVIDIA uninstaller completed.": "NVIDIA odinštalovanie je dokončené.", "NVIDIA update failed for LXC": "Aktualizácia NVIDIA zlyhala pre LXC", "NVIDIA userspace libraries installed.": "NVIDIA userspace knižnice nainštalované.", - "NVML does not match the current host driver": "NVML nezodpovedá aktuálnemu hostiteľskému vodičovi", + "NVML does not match the current host driver": "NVML nezodpovedá aktuálnemu ovládaču hostiteľa", "NVMe Disk Detected": "Zistený NVMe disk", "NVMe critical_warning is 0 (no critical warnings reported).": "Kritické varovanie NVMe je 0 (žiadne kritické varovania nie sú hlásené).", "NVMe health status: PASSED": "Stav NVMe: V PORIADKU", @@ -3970,7 +4022,7 @@ "NVMe skipped (to add as PCIe use 'Add Controller or NVMe PCIe to VM'):": "NVMe preskočené (ak ho chcete pridať ako PCIe, použite 'Pridať radič alebo NVMe PCIe do VM'):", "NVMe-specific SMART log": "SMART záznam špecifický pre NVMe", "NVR & Cameras": "NVR a kamery", - "NVR with optional VA-API video acceleration and hardware object detectors": "NVR s voliteľným video zrýchlením VA-API a detektormi hardvérových objektov", + "NVR with optional VA-API video acceleration and hardware object detectors": "Sieťový videorekordér s voliteľným zrýchlením videa cez VA-API a hardvérovými detektormi objektov", "NZBGet web interface": "Webové rozhranie NZBGet", "Name": "Názov", "Name for this application": "Názov tejto aplikácie", @@ -3981,13 +4033,13 @@ "Name of the database created on the first start": "Názov databázy vytvorenej pri prvom štarte", "Name of the database on the MariaDB server": "Názov databázy na serveri MariaDB", "Name of the directory to share (lowercase letters, digits, - or _)": "Názov adresára na zdieľanie (malé písmená, číslice, - alebo _)", - "Name of the internal worker node": "Názov vnútorného uzol pracovníka", + "Name of the internal worker node": "Názov interného pracovného uzla", "Name of this wallabag instance, shown in the interface and in 2FA codes": "Názov tejto inštancie wallabag, zobrazený v rozhraní a v kódoch 2FA", "Name or address NetBox will be opened at (for example netbox.example.com)": "Názov alebo adresa, na ktorej bude NetBox dostupný (napríklad netbox.example.com)", - "Name or part of the description of the application": "Názov alebo časť opisu žiadosti", + "Name or part of the description of the application": "Názov alebo časť popisu aplikácie", "Name or part of the option or of the application": "Názov alebo časť možnosti alebo aplikácie", "Name:": "Názov:", - "Named accounts need private mode. Stop the container, set public: false in /config/config.js, start it again and create each user with: pct exec -- env THELOUNGE_HOME=/config s6-setuidgid abc thelounge add ": "Menované účty potrebujú súkromný režim. Zastaviť kontajner, nastaviť verejnosť: false in /config/config.js, začať znova a vytvoriť každého užívateľa s: pct exec -- env THELOUNGE_HOME=/config s6-setuid abc thelounge pridať ", + "Named accounts need private mode. Stop the container, set public: false in /config/config.js, start it again and create each user with: pct exec -- env THELOUNGE_HOME=/config s6-setuidgid abc thelounge add ": "Používateľské účty vyžadujú súkromný režim. Zastavte kontajner, v /config/config.js nastavte public: false, znova ho spustite a každého používateľa vytvorte príkazom: pct exec -- env THELOUNGE_HOME=/config s6-setuidgid abc thelounge add ", "Needed:": "Potrebné:", "Needs": "Vyžaduje", "Neither /etc/kernel/cmdline nor /etc/default/grub found.": "Nenašiel sa /etc/kernel/cmdline ani /etc/default/grub.", @@ -3996,12 +4048,12 @@ "NetBIOS Service: STOPPED": "Služba NetBIOS: ZASTAVENÁ", "NetBIOS port 139:": "NetBIOS port 139:", "NetBox": "NetBox", - "Netbox is an IP address management (IPAM) and data center infrastructure management (DCIM) tool. Initially conceived by the network engineering team at DigitalOcean, NetBox was developed specifically to address the needs of network and infrastructure engineers. It is intended to function as a domain-specific source of truth for network operations.": "Netbox je nástroj riadenia IP adresy (IPAM) a riadenia infraštruktúry dátových centier (DCIM). Pôvodne koncipovaný sieťovým tímom v DigitalOcean, bol NetBox vyvinutý špeciálne pre potreby sieťových a infraštruktúrnych inžinierov. Je určený na fungovanie ako doménový špecifický zdroj pravdy pre siete operations.", + "Netbox is an IP address management (IPAM) and data center infrastructure management (DCIM) tool. Initially conceived by the network engineering team at DigitalOcean, NetBox was developed specifically to address the needs of network and infrastructure engineers. It is intended to function as a domain-specific source of truth for network operations.": "NetBox je nástroj na správu IP adries (IPAM) a infraštruktúry dátových centier (DCIM). Pôvodne ho navrhol sieťový tím spoločnosti DigitalOcean pre potreby správcov sietí a infraštruktúry. Slúži ako autoritatívny zdroj údajov pre správu siete.", "Network": "Sieť", "Network :": "Sieť :", "Network & Firewall": "Sieť a firewall", "Network (interfaces, DNS)": "Sieť (rozhrania, DNS)", - "Network Bridge": "Sieťový bridge", + "Network Bridge": "Sieťový most (bridge)", "Network Commands": "Sieťové príkazy", "Network Configuration": "Nastavenie siete", "Network Configuration Analysis": "Analýza nastavenia siete", @@ -4016,9 +4068,9 @@ "Network Restart Failed": "Reštart siete zlyhal", "Network Restarted": "Sieť bola reštartovaná", "Network Tools": "Sieťové nástroje", - "Network UPS Tools server for a UPS connected to the host by USB.": "Sieťový server UPS Tools pre UPS pripojený k hostiteľovi cez USB.", + "Network UPS Tools server for a UPS connected to the host by USB.": "Server Network UPS Tools pre UPS pripojený k hostiteľovi cez USB.", "Network access:": "Sieťový prístup:", - "Network bridge": "Sieťový most", + "Network bridge": "Sieťový most (bridge)", "Network configuration backed up": "Nastavenie siete bolo zálohované", "Network configuration has been restored from backup.": "Nastavenie siete bolo obnovené zo zálohy.", "Network connection failed to": "Sieťové pripojenie zlyhalo k", @@ -4040,7 +4092,7 @@ "NetworkManager is running (may cause conflicts)": "NetworkManager beží (môže spôsobovať konflikty)", "NetworkManager is running, which may conflict with Proxmox.": "NetworkManager beží a môže byť v konflikte s Proxmoxom.", "NetworkManager not running": "NetworkManager nebeží", - "Networks the peers reach through the tunnel (0.0.0.0/0 = all traffic)": "Siete, ktoré rovesníci dosahujú tunelom (0,0.0.0/0 = všetka doprava)", + "Networks the peers reach through the tunnel (0.0.0.0/0 = all traffic)": "Siete dostupné účastníkom cez tunel (0.0.0.0/0 = všetka prevádzka)", "New Folder in /mnt": "Nový priečinok v /mnt", "New Group": "Nová skupina", "New Search": "Nové hľadanie", @@ -4048,10 +4100,10 @@ "New Virtual Machine": "Nová virtuálna mašina", "New backup job": "Nová úloha zálohy", "New backups on this host will be unencrypted until a new keyfile is set up.": "Nové zálohy na tomto hostovi budú nešifrované, kým nenastavíte nový keyfile.", - "New image compatible:": "Nový obrázok kompatibilný:", - "New image installed": "Inštalovaný nový obrázok", - "New image installed, not verified yet": "Nainštalovaný nový obrázok, zatiaľ neoverený", - "New image verified, not saved yet": "Nový obrázok overený, zatiaľ neuložený", + "New image compatible:": "Nový obraz je kompatibilný:", + "New image installed": "Nový obraz je nainštalovaný", + "New image installed, not verified yet": "Nový obraz je nainštalovaný, zatiaľ neoverený", + "New image verified, not saved yet": "Nový obraz je overený, zatiaľ neuložený", "New kernel staged; rebuilding DKMS drivers:": "Nový kernel je pripravený; znovu zostavujem DKMS ovládače:", "New mount options to apply:": "Nové možnosti pripojenia, ktoré sa použijú:", "New scheduled job (own timer + retention)": "Nová naplánovaná úloha (vlastný timer + uchovávanie)", @@ -4063,11 +4115,11 @@ "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 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.", - "Ngircd is a free, portable and lightweight Internet Relay Chat server for small or private networks, developed under the GNU General Public License (GPL). It is easy to configure, can cope with dynamic IP addresses, and supports IPv6, SSL-protected connections as well as PAM for authentication. It is written from scratch and not based on the original IRCd.": "Ngircd je bezplatný, prenosný a ľahký internetový server Relay Chat pre malé alebo súkromné siete, vyvinutý podľa GNU General Public License (GPL). Je ľahko konfigurovateľný, dokáže sa vyrovnať s dynamickými IP adresami a podporuje pripojenie chránené IPv6, SSL, ako aj PAM pre autentifikáciu. Je napísaný od nuly a nie je založený na pôvodnom IRCd.", + "Nextcloud volume size in GB": "Veľkosť dátového zväzku Nextcloud v GB", + "Nextcloud with private PostgreSQL and Redis dependencies": "Nextcloud so samostatnými internými službami PostgreSQL a Redis", + "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, nástroj na rozkladanie záťaže, proxy server TCP/UDP a poštový proxy server.", + "Nginx webserver and reverse proxy with php support and a built-in Certbot (Let's Encrypt) client. It also contains fail2ban for intrusion prevention.": "Webový server a reverzný proxy Nginx s podporou PHP a vstavaným klientom Certbot (Let's Encrypt). Obsahuje aj fail2ban na ochranu pred prienikom.", + "Ngircd is a free, portable and lightweight Internet Relay Chat server for small or private networks, developed under the GNU General Public License (GPL). It is easy to configure, can cope with dynamic IP addresses, and supports IPv6, SSL-protected connections as well as PAM for authentication. It is written from scratch and not based on the original IRCd.": "NgIRCd je bezplatný, prenosný a nenáročný server IRC pre malé alebo súkromné siete, vydaný pod licenciou GNU GPL. Ľahko sa nastavuje, pracuje s dynamickými IP adresami a podporuje IPv6, spojenia chránené SSL aj overovanie cez PAM. Bol vytvorený od základu a nevychádza z pôvodného IRCd.", "No": "Nie", "No .ova or .ovf files found in:": "V tomto priečinku sa nenašli žiadne .ova ani .ovf súbory:", "No .ovf descriptor found inside OVA.": "V OVA sa nenašiel žiadny .ovf popisovač.", @@ -4085,7 +4137,8 @@ "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 Compose files were found in the CasaOS catalogue": "V katalógu CasaOS sa nenašli žiadne súbory 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).", @@ -4179,10 +4232,11 @@ "No accessible Samba servers found.": "Nenašli sa dostupné Samba servery.", "No accessible exports found.": "Nenašli sa žiadne dostupné exporty.", "No accessible shares found.": "Nenašli sa dostupné zdieľania.", + "No active Debian base repository for this suite; configure it in the Proxmox repository UI before continuing.": "Pre toto vydanie nie je aktívny základný repozitár Debianu; pred pokračovaním ho nastavte v rozhraní repozitárov Proxmoxu.", "No active Proxmox storage accepts OCI template archives.": "Žiadne aktívne úložisko Proxmox neakceptuje archívy šablón OCI.", "No active exports or showmount not available": "Nie sú aktívne exporty alebo príkaz showmount nie je dostupný", "No active session": "Žiadna aktívna relácia", - "No active subscription and no usable PBS repository. Noninteractive mode cannot change APT sources; configure them in Administration > Repositories.": "Žiadne aktívne predplatné a žiadne použiteľné úložisko PBS.Neinteraktívny režim nemôže zmeniť zdroje APT;nakonfigurujte ich v Administrácia > Repozitáre.", + "No active subscription and no usable PBS repository. Noninteractive mode cannot change APT sources; configure them in Administration > Repositories.": "Server nemá aktívne predplatné ani použiteľný repozitár PBS. Neinteraktívny režim nemôže meniť zdroje APT; nastavte ich v Administration > Repositories.", "No active subscription and no usable PVE repository. Noninteractive mode cannot change APT sources; configure them in Node > Updates > Repositories.": "Žiadne aktívne predplatné a žiadne použiteľné úložisko PVE. Neinteraktívny režim nemôže zmeniť zdroje APT; nakonfigurujte ich v časti Uzol > Aktualizácie > Úložiská.", "No additional GPU can be added.": "Nie je možné pridať ďalšiu GPU.", "No additional device needs to be added.": "Netreba pridávať žiadne ďalšie zariadenie.", @@ -4192,11 +4246,11 @@ "No available Controllers/NVMe devices were found.": "Nenašli sa žiadne dostupné Controller/NVMe zariadenia.", "No available disks found.": "Nenašli sa žiadne dostupné disky.", "No backup found, logrotate configuration not changed": "Nenašla sa žiadna záloha, nastavenie logrotate sa nemenilo", - "No backup is scheduled: the rsnapshot lines in /config/crontabs/root are commented out. Uncomment or adjust the intervals you want, then restart the container.": "Nie je naplánovaná žiadna záloha: linky rsnapshot v /config/crontabs/root sú komentované. Odpojte alebo nastavte intervaly, ktoré chcete, potom reštartujte kontajner.", + "No backup is scheduled: the rsnapshot lines in /config/crontabs/root are commented out. Uncomment or adjust the intervals you want, then restart the container.": "Žiadna záloha nie je naplánovaná: riadky rsnapshot v /config/crontabs/root sú zakomentované. Odkomentujte alebo upravte požadované intervaly a potom kontajner reštartujte.", "No backups": "Žiadne zálohy", "No backups found": "Nenašli sa žiadne zálohy", - "No bridge configuration issues found": "V nastavení bridge sa nenašli problémy", - "No bridges found in system": "V systéme sa nenašli žiadne bridge rozhrania", + "No bridge configuration issues found": "V nastavení sieťového mosta (bridge) sa nenašli problémy", + "No bridges found in system": "V systéme sa nenašli žiadne sieťové mosty (bridge)", "No changes are required for": "Nie sú potrebné žiadne zmeny pre", "No changes are required.": "Nie sú potrebné žiadne zmeny.", "No changes have been made to your system": "V systéme neboli vykonané žiadne zmeny", @@ -4209,7 +4263,7 @@ "No compatible PVE jobs": "Žiadne kompatibilné PVE úlohy", "No compatible disk images found in:": "Nenašli sa kompatibilné diskové obrazy v:", "No configuration issues found": "V nastavení sa nenašli problémy", - "No container of the stack was modified.": "Žiadna nádoba zásobníka nebola upravená.", + "No container of the stack was modified.": "Žiadny kontajner aplikácie nebol zmenený.", "No container runtime available.": "Nie je dostupný žiadny runtime pre kontajnery.", "No container selected. Exiting.": "Nebol vybraný žiadny kontajner. Ukončujem.", "No controller/NVMe selected.": "Nebol vybraný žiadny Controller/NVMe.", @@ -4243,7 +4297,7 @@ "No folders found in /mnt. Please create a new folder.": "V /mnt sa nenašli žiadne priečinky. Vytvorte nový priečinok.", "No folders found inside /mnt in the CT.": "V kontajneri sa v /mnt nenašli žiadne priečinky.", "No format-safe disks are available.": "Nie sú dostupné žiadne disky vhodné na bezpečné formátovanie.", - "No free ProxMenux private /24 network is available": "Nie je k dispozícii žiadna bezplatná sieť ProxMenux private /24", + "No free ProxMenux private /24 network is available": "Nie je dostupná žiadna voľná súkromná sieť ProxMenux /24", "No gasket DKMS registrations remain.": "Nezostávajú žiadne registrácie gasket DKMS.", "No group creation required — uses world-writable sticky bit permissions.": "Nie je potrebné vytvárať skupinu - používa sa zápis pre všetkých so sticky bitom.", "No guest selected.": "Nie je vybratý žiadny hosť.", @@ -4302,13 +4356,13 @@ "No recent Samba servers found.": "Nenašli sa žiadne nedávne Samba servery.", "No registered OCI containers are available for selection on this host.": "Na tomto hostiteľovi nie sú dostupné žiadne registrované kontajnery OCI.", "No registry API was found at {registry}. Check the hostname and port.": "Na {registry} sa nenašlo žiadne API registra. Skontrolujte názov hostiteľa a port.", - "No restored OCI application is waiting to be recovered.": "Žiadna obnovená aplikácia OCI nečaká na obnovenie.", + "No restored OCI application is waiting to be recovered.": "Žiadna OCI aplikácia obnovená zo zálohy nečaká na opätovnú registráciu.", "No results": "Žiadne výsledky", "No routing information found.": "Nenašli sa žiadne informácie o smerovaní.", "No scheduled backup jobs configured.": "Nie sú nastavené žiadne naplánované úlohy záloh.", "No scheduled backup jobs found.": "Nenašli sa žiadne naplánované úlohy zálohy.", "No scripts found for:": "Nenašli sa žiadne skripty pre:", - "No security relaxation is required for the reviewed profile.": "Žiadny bezpečnostný relax je required pre preskúmaný profil.", + "No security relaxation is required for the reviewed profile.": "Overený profil nevyžaduje uvoľnenie bezpečnostných obmedzení.", "No selectable USB device was found. Type the host node by hand.": "Nenašlo sa žiadne zariadenie USB, ktoré možno vybrať. Zadajte uzol hostiteľa ručne.", "No self-test history found for": "Nenašla sa história samo-testov pre", "No self-test log available for": "Nie je dostupný log samo-testu pre", @@ -4331,6 +4385,7 @@ "No supported NVIDIA versions found for this GPU": "Pre tento GPU sa nenašli žiadne podporované verzie NVIDIA", "No sysfs ROM entry — trying ACPI VFCT table...": "Chýba sysfs ROM položka - skúšam ACPI VFCT tabuľku...", "No target configured.": "Nie je nastavený žiadny cieľ.", + "No template is available for '{app_id}'": "Pre aplikáciu '{app_id}' nie je dostupná šablóna", "No test currently running": "Aktuálne nebeží žiadny test", "No unambiguous loader download found in release metadata.": "V metadátach vydania sa nenašlo žiadne jednoznačné stiahnutie zavádzača.", "No uninstaller found for:": "Nenašiel sa odinštalátor pre:", @@ -4338,7 +4393,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.", @@ -4375,9 +4430,9 @@ "Not mounted": "Nepripojené", "Not portable:": "Neprenáša sa:", "Not registered as Proxmox storage — use 'LXC Mount Manager' to bind-mount": "Nie je zaregistrované ako úložisko Proxmoxu - použite 'Správca LXC mountov' na bind mount", - "Not required (access code only)": "Nie je required (len prístupový kód)", - "Not required (password only)": "Nie je required (len heslo)", - "Not required (token only)": "Nie je required (iba token)", + "Not required (access code only)": "Nevyžaduje sa (iba prístupový kód)", + "Not required (password only)": "Nevyžaduje sa (iba heslo)", + "Not required (token only)": "Nevyžaduje sa (iba token)", "Not yet verified by ProxMenux (beta)": "Zatiaľ overené ProxMenux (beta)", "Note: A system reboot will be required after enabling IOMMU.": "Poznámka: po zapnutí IOMMU bude potrebný reštart systému.", "Note: this only works if the NFS server does NOT use 'all_squash' for root.": "Poznámka: funguje to iba vtedy, ak NFS server NEPOUŽÍVA 'all_squash' pre root.", @@ -4397,7 +4452,7 @@ "Nothing was changed.": "Nič sa nezmenilo.", "Nouveau module is loaded, attempting to unload...": "Modul Nouveau je načítaný, skúšam ho odpojiť...", "Number of CPU cores (default: 2)": "Počet CPU jadier (predvolené: 2)", - "Nzbget is a usenet downloader, written in C++ and designed with performance in mind to achieve maximum download speed by using very little system resources.": "Nzbget je usenet downloader, napísaný v C++ a navrhnutý s výkonom na dosiahnutie maximálnej rýchlosti sťahovania pomocou veľmi málo systémových zdrojov.", + "Nzbget is a usenet downloader, written in C++ and designed with performance in mind to achieve maximum download speed by using very little system resources.": "NZBGet je nástroj na sťahovanie z Usenetu napísaný v C++. Je navrhnutý na maximálnu rýchlosť s minimálnymi nárokmi na systémové zdroje.", "Nzbhydra2 is a meta search application for NZB indexers, the spiritual successor to NZBmegasearcH, and an evolution of the original application NZBHydra.": "Nzbhydra2 je meta vyhľadávacia aplikácia pre NZB indexers, duchovný nástupca NZBmegasearcH, a vývoj pôvodnej aplikácie NZBHydra.", "OCI application": "Aplikácia OCI", "OCI container, configuration kept. Remove its GPU from OCI manager Apps, with Recreate: CT": "Kontajner OCI, konfigurácia zachovaná. Odstráňte jeho GPU z OCI manager Apps pomocou Znovu vytvoriť: CT", @@ -4409,15 +4464,15 @@ "OCI management could not be completed. Check the backend status; no additional cleanup has been authorized.": "Správu OCI aplikácií nebolo možné dokončiť. Skontrolujte stav backendu; žiadne ďalšie vyčistenie nebolo povolené.", "OCI manager Apps (Technology Preview)": "Správca OCI aplikácií (Technology Preview)", "OCI manager Apps (beta)": "Správca OCI aplikácií (beta)", - "OCI manager Apps is a Technology Preview: if something does not work as expected, please report it on GitHub with the application name.": "OCI manager Apps je Technology Preview: ak niečo nefunguje podľa očakávania, nahláste to na GitHub s názvom aplikácie.", + "OCI manager Apps is a Technology Preview: if something does not work as expected, please report it on GitHub with the application name.": "Správca OCI aplikácií je v skúšobnej fáze: ak niečo nefunguje podľa očakávania, nahláste to na GitHube spolu s názvom aplikácie.", "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", - "ONLYOFFICE provides a full range of tools to create, edit and collaborate on text documents, spreadsheets, presentations, PDF forms and regular PDF files on web, desktop and mobile platforms.": "ONLYOFFICE poskytuje celý rad nástrojov na tvorbu, úpravu a spoluprácu na textových dokumentoch, tabuľkách, prezentáciách, PDF formulároch a pravidelných PDF súboroch na webových, stolových a mobilných platformách.", + "ONLYOFFICE provides a full range of tools to create, edit and collaborate on text documents, spreadsheets, presentations, PDF forms and regular PDF files on web, desktop and mobile platforms.": "ONLYOFFICE ponúka nástroje na tvorbu, úpravu a spoločnú prácu na textových dokumentoch, tabuľkách, prezentáciách, formulároch PDF aj bežných súboroch PDF na webe, počítačoch a mobilných zariadeniach.", "OR add new PVE 9 no-subscription repository:": "ALEBO pridajte nový PVE 9 no-subscription repozitár:", "OS hint:": "Odhad OS:", "OS release details": "Podrobnosti o vydaní systému", @@ -4433,19 +4488,19 @@ "OVH server detection and RTM installation process completed": "Kontrola OVH servera a inštalácia RTM sú dokončené", "Object detector": "Detektor objektov", "Object detector for Frigate": "Detektor objektov pre Frigate", - "Observer is not responding on port 4357": "Pozorovateľ nereaguje na prístav 4357", - "Obsidian is a note-taking app that lets you create, link, and organize your notes on your device, with hundreds of plugins and themes to customize your workflow. You can also publish your notes online, access them offline, and sync them securely with end-to-end encryption.": "Obsidian je note-prijímajúce aplikácie, ktoré vám umožní vytvoriť, odkaz, a usporiadať poznámky na vašom zariadení, so stovkami pluginov a tém prispôsobiť svoje pracovné postupy. Môžete tiež zverejniť svoje poznámky on-line, prístup je offline, a synchronizovať ich bezpečne s end-to-end šifrovanie.", + "Observer is not responding on port 4357": "Observer neodpovedá na porte 4357", + "Obsidian is a note-taking app that lets you create, link, and organize your notes on your device, with hundreds of plugins and themes to customize your workflow. You can also publish your notes online, access them offline, and sync them securely with end-to-end encryption.": "Obsidian umožňuje vytvárať, prepájať a usporadúvať poznámky na vašom zariadení. Stovky doplnkov a tém prispôsobia pracovný postup. Poznámky môžete publikovať online, používať offline a bezpečne synchronizovať s koncovým šifrovaním.", "Offer as exit node?": "Ponúknuť ako exit node?", - "Official Duplicati image: encrypted, incremental backups to local, network and cloud storage.": "Oficiálny image Duplicati: šifrované prírastkové zálohy do lokálneho, sieťového aj cloudového úložiska.", + "Official Duplicati image: encrypted, incremental backups to local, network and cloud storage.": "Oficiálny obraz Duplicati: šifrované prírastkové zálohy do lokálneho, sieťového aj cloudového úložiska.", "Official Emby Media Server image with optional VA-API or NVIDIA acceleration.": "Oficiálny obraz Emby Media Server s voliteľným zrýchlením VA-API alebo NVIDIA.", "Official Jellyfin image with optional VA-API or NVIDIA acceleration.": "Oficiálny obraz Jellyfin s voliteľným zrýchlením VA-API alebo NVIDIA.", "Official Linux Distributions": "Oficiálne Linux distribúcie", - "Official Plex Media Server image with optional hardware transcoding.": "Oficiálny obraz Plex Media Server s voliteľným transkódovaním hardvéru.", - "Official image": "Oficiálny image", + "Official Plex Media Server image with optional hardware transcoding.": "Oficiálny obraz Plex Media Server s voliteľným hardvérovým prevodom videa.", + "Official image": "Oficiálny obraz", "Old debian.sources file removed to prevent duplication": "Starý debian.sources súbor odstránený, aby nevznikla duplicita", "Old memory configuration detected. Replacing with balanced optimization...": "Našlo sa staršie nastavenie pamäte. Nahrádzam ho vyváženou optimalizáciou...", "Old time services removed successfully": "Staré časové služby boli úspešne odstránené", - "Ombi allows you to host your own Plex Request and user management system.": "Ombi vám umožní hostiť svoj vlastný Plex Žiadosť a systém správy užívateľov.", + "Ombi allows you to host your own Plex Request and user management system.": "Ombi umožňuje prevádzkovať vlastný systém na správu používateľov a požiadaviek na obsah pre Plex.", "On a privileged CT the mount options carry the only permissions.": "Pri privilegovanom CT určujú oprávnenia hlavne samotné možnosti pripojenia.", "On some systems, when starting the VM the host may slow down for several minutes until it stabilizes, or freeze completely.": "Na niektorých systémoch môže server pri štarte VM na niekoľko minút výrazne spomaliť, kým sa ustáli, alebo úplne zamrznúť.", "On the Borg server, append the following line to:": "Na Borg serveri pridajte nasledujúci riadok do:", @@ -4458,11 +4513,11 @@ "Once finished, repeat the check ({check}) to review any remaining issues.": "Po dokončení zopakujte kontrolu ({check}), aby ste skontrolovali všetky zostávajúce problémy.", "Once installed, open the VirtIO ISO and run the installer to complete driver setup.": "Po nainštalovaní otvorte VirtIO ISO a spustite inštalátor na dokončenie ovládačov.", "One or more NVIDIA GPUs are currently configured for VM passthrough (vfio-pci):": "Jedna alebo viac NVIDIA GPU je aktuálne nastavených na VM passthrough (vfio-pci):", - "Online retro games emulator": "Online retro hry emulátor", + "Online retro games emulator": "Online emulátor retro hier", "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é.", @@ -4474,44 +4529,46 @@ "Only one service at a time can be installed this way.": "Týmto spôsobom sa dá naraz nainštalovať iba jedna služba.", "Only removes storage definition, not remote data.": "Odstráni iba definíciu úložiska, nie vzdialené dáta.", "Only run this if you used LVM (step 6b):": "Spustite iba vtedy, ak ste použili LVM (krok 6b):", + "Only the applications that need no question: the ones the cluster keeps a record of": "Iba aplikácie bez potreby otázok: tie, ktorých záznam uchováva klaster", "Only the host backup hook is removed — PVE vzdump jobs targeting this storage stay intact.": "Odstráni sa iba hook zálohy hosta - PVE vzdump úlohy smerujúce na toto úložisko zostanú zachované.", "Only the image reference, with no Compose file": "Len odkaz na obraz bez súboru Compose", - "Only the update of the image runs unattended.": "Bezobslužne prebieha iba aktualizácia obrázka.", + "Only the update of the image runs unattended.": "Bezobslužne sa vykonáva iba aktualizácia obrazu.", "Open": "Otvorené", - "Open Source realtime backend in 1 file": "Open Source realtime backend v 1 súbore", + "Open Source realtime backend in 1 file": "Backend s otvoreným zdrojovým kódom a podporou práce v reálnom čase v jedinom súbore", "Open rwx + default inheritance for new files": "Otvorené rwx + predvolené dedenie pre nové súbory", "Open source chat UI for AI models": "Open source chat UI pre modely AI", - "Open source home automation that puts local control and privacy first.": "Open source domácej automatizácie, ktorá dáva miestne ovládanie a súkromie na prvé miesto.", - "Open source, lightweight, native, supports (HTTP, BitTorrent, Magnet, etc.) for downloading.": "Otvorený zdroj, ľahký, natívne, podpora (HTTP, BitTorrent, Magnet, atď) pre stiahnutie.", + "Open source home automation that puts local control and privacy first.": "Domáca automatizácia s otvoreným zdrojovým kódom, ktorá uprednostňuje lokálne ovládanie a súkromie.", + "Open source, lightweight, native, supports (HTTP, BitTorrent, Magnet, etc.) for downloading.": "Nenáročný natívny nástroj na sťahovanie s otvoreným zdrojovým kódom a podporou HTTP, BitTorrentu, magnetických odkazov a ďalších zdrojov.", "Open the VM console and wait for the installer to boot": "Otvorte konzolu VM a počkajte, kým sa spustí inštalátor", "Open the VM console and wait for the loader to boot": "Otvorte konzolu VM a počkajte, kým sa spustí loader", "Open the dashboard from this host on port 8008 to create a new admin account.": "Otvorte dashboard z tohto servera na porte 8008 a vytvorte nový admin účet.", "Open the dashboard to create a new admin account:": "Otvorte dashboard a vytvorte nový admin účet:", - "Open-source AI-powered coding assistant": "Open-source AI-poháňaný asistent kódovania", - "Open-source UI for building and debugging multi-agent and RAG applications": "Open-source UI pre stavebné a ladiace multi-agent a RAG aplikácie", - "Open-source self-hosted SQL IDE.": "Samoobslužné SQL IDE s otvoreným zdrojom.", - "OpenClaw is a personal AI assistant you run on your own devices": "OpenClaw je osobný asistent AI, ktorý beží na svoje vlastné zariadenia", + "Open the page of an application in the menu": "Otvoriť stránku aplikácie v ponuke", + "Open-source AI-powered coding assistant": "Programátorský asistent využívajúci AI s otvoreným zdrojovým kódom", + "Open-source UI for building and debugging multi-agent and RAG applications": "Rozhranie s otvoreným zdrojovým kódom na tvorbu a ladenie aplikácií s viacerými agentmi a RAG", + "Open-source self-hosted SQL IDE.": "Vývojové prostredie SQL s otvoreným zdrojovým kódom na vlastnom serveri.", + "OpenClaw is a personal AI assistant you run on your own devices": "OpenClaw je osobný asistent AI, ktorý prevádzkujete na vlastných zariadeniach", "OpenList": "OpenList", "OpenShot Video Editor is an award-winning free and open-source video editor for Linux, Mac, and Windows, and is dedicated to delivering high quality video editing and animation solutions to the world.": "OpenShot Video Editor je ocenený bezplatný a open-source video editor pre Linux, Mac a Windows a je venovaný poskytovaniu kvalitných riešení pre editáciu videa a animácie svetu.", - "OpenVINO requires a CPU quota to keep the CPU topology": "OpenVINO requires a CPU kvóta pre udržanie topológie procesora", - "OpenVINO requires the render device of an Intel GPU": "OpenVINO requires zariadenie Intel GPU", + "OpenVINO requires a CPU quota to keep the CPU topology": "OpenVINO vyžaduje kvótu CPU na zachovanie topológie CPU", + "OpenVINO requires the render device of an Intel GPU": "OpenVINO vyžaduje vykresľovacie zariadenie GPU Intel", "OpenVSwitch installation could not be verified": "Inštaláciu OpenVSwitch sa nepodarilo overiť", "OpenVSwitch installed successfully": "OpenVSwitch bol úspešne nainštalovaný", "OpenVSwitch is ready to use": "OpenVSwitch je pripravený na použitie", "OpenVSwitch removed": "OpenVSwitch bol odstránený", - "Openssh-server is a sandboxed environment that allows ssh access without giving keys to the entire server.": "Openssh-server je pieskové prostredie, ktoré umožňuje prístup ssh bez toho, aby dal kľúče na celý server.", - "Openvscode-server provides a version of VS Code that runs a server on a remote machine and allows access through a modern web browser.": "Openvscode-server poskytuje verziu VS kódu, ktorý prevádzkuje server na vzdialenom počítači a umožňuje prístup prostredníctvom moderného webového prehliadača.", - "Opera is a multi-platform web browser developed by its namesake company Opera. The browser is based on Chromium, but distinguishes itself from other Chromium-based browsers (Chrome, Edge, etc.) through its user interface and other features.": "Opera je multiplatformový webový prehliadač vyvinutý jeho namesake spoločnosťou Opera. Prehliadač je založený na Chromium, ale odlišuje sa od ostatných prehliadačov založených na Chromium (Chrome, Edge, atď.) prostredníctvom svojho používateľského rozhrania a ďalších funkcií.", + "Openssh-server is a sandboxed environment that allows ssh access without giving keys to the entire server.": "OpenSSH Server poskytuje izolované prostredie s prístupom cez SSH bez sprístupnenia celého servera.", + "Openvscode-server provides a version of VS Code that runs a server on a remote machine and allows access through a modern web browser.": "OpenVSCode Server poskytuje verziu VS Code, ktorá beží na vzdialenom počítači a je prístupná cez moderný webový prehliadač.", + "Opera is a multi-platform web browser developed by its namesake company Opera. The browser is based on Chromium, but distinguishes itself from other Chromium-based browsers (Chrome, Edge, etc.) through its user interface and other features.": "Opera je multiplatformový webový prehliadač vyvíjaný rovnomennou spoločnosťou. Je založený na Chromiu a od ostatných prehliadačov s týmto základom, ako Chrome či Edge, sa odlišuje používateľským rozhraním a ďalšími funkciami.", "Operation": "Operácia", "Operation cancelled by user": "Operácia bola zrušená používateľom", "Operation cancelled by user to create backup.": "Operácia bola zrušená používateľom kvôli vytvoreniu zálohy.", "Operation cancelled by user.": "Operácia zrušená používateľom.", - "Operation cancelled.": "Operation zrušený.", + "Operation cancelled.": "Operácia bola zrušená.", "Operation cancelled. Cannot continue with an unprivileged container.": "Operácia bola zrušená. S neprivilegovaným kontajnerom sa nedá pokračovať.", "Operation log": "Záznam operácie", "Operator config re-applied via kernel-agnostic merge": "Vlastné nastavenie správcu bolo znovu použité cez zlúčenie nezávislé od kernelu", "Operator config that WILL be re-applied via kernel-agnostic merge": "Vlastné nastavenie správcu, ktoré SA znovu použije cez zlúčenie nezávislé od kernelu", - "Optical block device (e.g. /dev/sr0)": "Optické blokovacie zariadenie (napr. /dev/sr0)", + "Optical block device (e.g. /dev/sr0)": "Optické blokové zariadenie (napr. /dev/sr0)", "Optimizations detected and ready to revert.": "Optimalizácie boli nájdené a sú pripravené na vrátenie späť.", "Optimize": "Optimalizovať", "Optimize Memory": "Optimalizovať pamäť", @@ -4529,7 +4586,7 @@ "Optional published URL for Jellyfin": "Voliteľné URL pre Jellyfin", "Optional safety helper if you ever need to re-apply manually:": "Voliteľná bezpečnostná pomôcka, ak by ste to niekedy potrebovali použiť ručne znova:", "Optional token from https://www.plex.tv/claim": "Voliteľný token z https://www.plex.tv/claim", - "Optional, not mounted by default": "Nepovinné, štandardne nemontované", + "Optional, not mounted by default": "Voliteľné, predvolene nepripojené", "Optional: Modernize repository sources:": "Voliteľné: modernizovať zdroje repozitárov:", "Optional: apply default ACL so new files inherit permissions:": "Voliteľné: nastaviť predvolené ACL, aby nové súbory zdedili oprávnenia:", "Optional: register this path as Proxmox dir storage:": "Voliteľné: zaregistrovať túto cestu ako Proxmox dir úložisko:", @@ -4540,18 +4597,18 @@ "Or re-run this script and accept the 'apply host permissions' prompt.": "Alebo spustite tento skript znova a potvrďte výzvu na úpravu oprávnení hosta.", "Or use ProxMenux update function": "Alebo použite funkciu aktualizácie v ProxMenux", "Or, if your terminal can't select text, copy it from:": "Alebo ak váš terminál nevie označiť text, skopírujte ho z:", - "Orca Slicer is an open source slicer for FDM printers. OrcaSlicer is fork of Bambu Studio, it was previously known as BambuStudio-SoftFever, Bambu Studio is forked from PrusaSlicer by Prusa Research, which is from Slic3r by Alessandro Ranellucci and the RepRap community": "Orca Slicer je open source krájač pre FDM tlačiarne. OrcaSlicer je fork z Bambu Studio, to bolo predtým známe ako BambuStudio-SoftFever, Bambu Studio je forked z PrusaSlicer od Prusa Research, ktorý je z Slic3r od Alessandro Ranellucci a RepRap komunity", + "Orca Slicer is an open source slicer for FDM printers. OrcaSlicer is fork of Bambu Studio, it was previously known as BambuStudio-SoftFever, Bambu Studio is forked from PrusaSlicer by Prusa Research, which is from Slic3r by Alessandro Ranellucci and the RepRap community": "OrcaSlicer je nástroj s otvoreným zdrojovým kódom na prípravu tlače pre FDM tlačiarne. Vychádza z Bambu Studio a pôvodne sa volal BambuStudio-SoftFever. Bambu Studio vychádza z PrusaSlicer od Prusa Research, ktorého základom je Slic3r od Alessandra Ranellucciho a komunity RepRap.", "Original ZFS ARC config restored from .bak": "Pôvodné nastavenie ZFS ARC bolo obnovené zo súboru .bak", "Original bashrc restored": "Pôvodný bashrc bol obnovený", "Original logrotate configuration restored": "Pôvodné nastavenie logrotate bolo obnovené", - "Orphan stack contract archived:": "@ info: whatsthis", - "Oscam is an Open Source Conditional Access Module software used for descrambling DVB transmissions using smart cards. It's both a server and a client.": "Oscam je softvér Open Source Conditional Access Module používaný pre descrambling DVB transmissions pomocou inteligentných kariet. Je to server aj klient.", + "Orphan stack contract archived:": "Osirelá definícia zostavy bola archivovaná:", + "Oscam is an Open Source Conditional Access Module software used for descrambling DVB transmissions using smart cards. It's both a server and a client.": "OSCam je modul podmieneného prístupu s otvoreným zdrojovým kódom na dekódovanie vysielania DVB pomocou čipových kariet. Funguje ako server aj klient.", "Other Prebuilt Linux VMs": "Ďalšie pripravené Linux VM", "Output archive:": "Výstupný archív:", "Overseerr is a request management and media discovery tool built to work with your existing Plex ecosystem.": "Overseerr je nástroj na riadenie žiadostí a vyhľadávanie médií postavený na prácu s existujúcim ekosystémom Plex.", "Owner:": "Vlastník:", "Ownership set to root:sharedfiles with 2775 on:": "Vlastník nastavený na root:sharedfiles s oprávnením 2775 na:", - "P2P bittorrent download": "P2P bittorrent stiahnuť", + "P2P bittorrent download": "Sťahovanie cez P2P sieť BitTorrent", "PAM limits configured": "Limity PAM sú nastavené", "PBS API log rotation configured (hourly, size-based)": "Rotácia logov PBS API je nastavená (každú hodinu, podľa veľkosti)", "PBS backup error log": "Záznam chyby zálohy do PBS", @@ -4598,7 +4655,7 @@ "Packaging OVA file...": "Balím OVA súbor...", "Packing installer archive...": "Balím archív inštalátora...", "PairDrop is a sublime alternative to AirDrop that works on all platforms. Send images, documents or text via peer to peer connection to devices in the same local network/Wi-Fi or to paired devices.": "PairDrop je skvelá alternatíva k AirDrop, ktorá pracuje na všetkých platformách. Poslať obrázky, dokumenty alebo text prostredníctvom peer-to-peer pripojenie k zariadeniam v rovnakej miestnej sieti/Wi-Fi alebo spárované zariadenia.", - "Paperless configuration cancelled": "Bezpapierová konfigurácia zrušená", + "Paperless configuration cancelled": "Nastavenie Paperless bolo zrušené", "Paperless-ngx WebUI": "Paperless-ngx WebUI", "Parsing OVF descriptor...": "Čítam OVF popisovač...", "Partial VM removed": "Čiastočná VM odstránená", @@ -4606,14 +4663,14 @@ "Partition created": "Oddiel bol vytvorený", "Partition created:": "Oddiel vytvorený:", "Partition table wiped": "Tabuľka oddielov bola vymazaná", - "Pass /dev/kvm to the LXC": "prejsť /dev/kvm na LXC", - "Pass /dev/net/tun to the LXC": "priepust /dev/net/tun na LXC", - "Pass /dev/ttyUSB0 to the LXC": "prejsť /dev/ttyUSB0 na LXC", - "Pass /dev/video10 to the LXC": "Prešiel /dev/video10 na LXC", - "Pass /dev/video11 to the LXC": "Prešiel /dev/video11 na LXC", - "Pass /dev/video12 to the LXC": "Prechod /dev/video12 na LXC", - "Pass a host device to the LXC": "Posuňte hostiteľské zariadenie na LXC", - "Pass the UPS to the LXC": "Pošlite UPS do LXC", + "Pass /dev/kvm to the LXC": "Sprístupniť /dev/kvm kontajneru LXC", + "Pass /dev/net/tun to the LXC": "Sprístupniť /dev/net/tun kontajneru LXC", + "Pass /dev/ttyUSB0 to the LXC": "Sprístupniť /dev/ttyUSB0 kontajneru LXC", + "Pass /dev/video10 to the LXC": "Sprístupniť /dev/video10 kontajneru LXC", + "Pass /dev/video11 to the LXC": "Sprístupniť /dev/video11 kontajneru LXC", + "Pass /dev/video12 to the LXC": "Sprístupniť /dev/video12 kontajneru LXC", + "Pass a host device to the LXC": "Sprístupniť zariadenie hostiteľa kontajneru LXC", + "Pass the UPS to the LXC": "Sprístupniť UPS kontajneru LXC", "Passing NVIDIA does not enable acceleration inside the application. The host needs NVIDIA Container Toolkit and a compatible image. Continue?": "Prejdenie NVIDIA neumožní zrýchlenie v aplikácii. Hostiteľ potrebuje NVIDIA Container Toolkit a kompatibilný obrázok. Pokračovať?", "Passphrase used to unlock the imported keyfile (leave blank if the keyfile is unencrypted / kdf=none):": "Fráza na odomknutie importovaného keyfile (nechajte prázdne, ak keyfile nie je šifrovaný / kdf=none):", "Passphrases do not match.": "Frázy sa nezhodujú.", @@ -4622,7 +4679,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.", @@ -4640,7 +4697,7 @@ "Password of the LibreDB Studio administrator": "Heslo správcu LibreDB Studio", "Password of the MariaDB user": "Heslo používateľa MariaDB", "Password of the MineOS web interface user": "Heslo používateľa webového rozhrania MineOS", - "Password of the NUT server user": "Heslo používateľa NUT server", + "Password of the NUT server user": "Heslo používateľa servera NUT", "Password of the NetBox admin account": "Heslo admin účtu NetBox", "Password of the OpenList admin user": "Heslo užívateľa OpenList admin", "Password of the PhotoPrism admin user (at least 8 characters)": "Heslo PhotoPrism admin užívateľa (aspoň 8 znakov)", @@ -4648,7 +4705,7 @@ "Password of the ShareCoveX panel administrator (8 characters or more)": "Heslo správcu panela ShareCoveX (8 znakov alebo viac)", "Password of the SnapOtter admin user": "Heslo užívateľa SnapOtter admin", "Password of the admin account": "Heslo účtu správcu", - "Password of the deprecated Flowise application login (only read by Flowise versions before 3.0.1)": "Heslo depreciovaného prihlasovacieho protokolu aplikácie Flowise (čítané iba verziami Flowise pred 3.0.1)", + "Password of the deprecated Flowise application login (only read by Flowise versions before 3.0.1)": "Heslo zastaraného prihlasovania aplikácie Flowise (používajú iba verzie pred 3.0.1)", "Password of the main AdGuard Home": "Heslo hlavného AdGuard Home", "Password of the superuser account": "Heslo účtu superužívateľa", "Password or API token secret:": "Heslo alebo tajná časť API tokenu:", @@ -4667,11 +4724,11 @@ "Path does not exist.": "Cesta neexistuje.", "Path inside the container": "Cesta vnútri kontajnera", "Path inside the container (e.g. /media-extra)": "Cesta vnútri kontajnera (napr. /media-extra)", - "Path inside the remote (empty = root)": "Cesta vnútri diaľkového (prázdne = koreň)", + "Path inside the remote (empty = root)": "Cesta vo vzdialenom úložisku (prázdne = koreň)", "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:", @@ -4681,10 +4738,10 @@ "Paths skipped:": "Preskočené cesty:", "Paths to back up:": "Cesty na zálohovanie:", "Paths:": "Cesty:", - "Peers reach the server through the public address and the UDP port given during the installation, so that port must be forwarded to this container.": "Peers dosiahnuť server prostredníctvom verejnej adresy a UDP port daný počas inštalácie, tak, aby port musí byť odoslaný do tohto kontajnera.", - "Peers to create: a number (3) or a list of names (phone,laptop)": "Peers vytvoriť: číslo (3) alebo zoznam mien (telefón,laptop)", - "Pelorus is an AI navigator for Selkies-powered Linux desktops. Pelorus runs a FastAPI server that gives an LLM agent (Ollama, OpenAI-compatible, or Gemini) control over mouse, keyboard, screenshot, and window management via the Pixelflux computer-use backend, a Linux accessibility tree (AT-SPI), and optional KWin D-Bus integration.": "Pelorus je navigátor UI pre Linuxové plochy poháňané Selkiesom. Pelorus spustí FastAPI server, ktorý dáva LLM agenta (Ollama, OpenAI-kompatibilný, alebo Gemini) kontrolu nad myšou, klávesnice, screenshot, a správu okien cez Pixelflux počítač-použitie backend, Linux prístupnosť strom (AT-SPI), a voliteľné KWin D-Bus integrácie.", - "Pending components:": "Trvalé komponenty:", + "Peers reach the server through the public address and the UDP port given during the installation, so that port must be forwarded to this container.": "Účastníci sa pripájajú k serveru cez verejnú adresu a port UDP zadané počas inštalácie. Tento port musí byť presmerovaný do kontajnera.", + "Peers to create: a number (3) or a list of names (phone,laptop)": "Účastníci na vytvorenie: počet (3) alebo zoznam mien (phone,laptop)", + "Pelorus is an AI navigator for Selkies-powered Linux desktops. Pelorus runs a FastAPI server that gives an LLM agent (Ollama, OpenAI-compatible, or Gemini) control over mouse, keyboard, screenshot, and window management via the Pixelflux computer-use backend, a Linux accessibility tree (AT-SPI), and optional KWin D-Bus integration.": "Pelorus je navigátor AI pre linuxové pracovné plochy využívajúce Selkies. Server FastAPI dáva agentovi LLM (Ollama, model kompatibilný s OpenAI alebo Gemini) ovládanie myši, klávesnice, snímok obrazovky a správy okien cez backend Pixelflux, strom prístupnosti Linuxu AT-SPI a voliteľnú integráciu KWin D-Bus.", + "Pending components:": "Čakajúce komponenty:", "Pending restore ID:": "ID čakajúcej obnovy:", "Pending restore dir:": "Priečinok čakajúcej obnovy:", "Pending restore prepared. A reboot is required to complete it.": "Čakajúca obnova je pripravená. Na jej dokončenie je potrebný reštart.", @@ -4708,15 +4765,15 @@ "Permission error": "Chyba oprávnení", "Permissions:": "Oprávnenia:", "Persist mount in CT /etc/fstab (optional):": "Uložiť pripojenie v CT /etc/fstab (voliteľné):", - "Persistence for": "Pretrvávanie", + "Persistence for": "Trvalé úložisko pre", "Persistence for the new path": "Pretrvávanie novej cesty", "Persistent data:": "Trvalé údaje:", "Persistent disk reused:": "Trvalý disk opätovne použitý:", "Persistent:": "Trvalé:", "Personal finance management application": "Aplikácia na správu osobných financií", - "Photo and video library with optional GPU transcoding and machine learning": "Foto a video knižnica s voliteľným GPU transkódovanie a strojové učenie", + "Photo and video library with optional GPU transcoding and machine learning": "Knižnica fotografií a videí s voliteľným prevodom videa pomocou GPU a strojovým učením", "PhotoPrism": "PhotoPrism", - "Phpmyadmin is a free software tool written in PHP, intended to handle the administration of MySQL over the Web. phpMyAdmin supports a wide range of operations on MySQL and MariaDB.": "Phpmyadmin je bezplatný softvérový nástroj napísaný v PHP, určený na zvládnutie správy MySQL cez web. phpMyAdmin podporuje širokú škálu operations na MySQL a MariaDB.", + "Phpmyadmin is a free software tool written in PHP, intended to handle the administration of MySQL over the Web. phpMyAdmin supports a wide range of operations on MySQL and MariaDB.": "phpMyAdmin je bezplatný nástroj napísaný v PHP na správu MySQL cez web. Podporuje širokú škálu operácií nad MySQL a MariaDB.", "Physical Function with": "Fyzická funkcia s", "Physical interface": "Fyzické rozhranie", "Physical interfaces available": "Dostupné fyzické rozhrania", @@ -4730,8 +4787,8 @@ "Pick an SSH private key (auto-detected on this host):": "Vyberte súkromný SSH kľúč (automaticky nájdený na tomto hostovi):", "Pick an alternative way to authorize the new key:": "Vyberte iný spôsob autorizácie nového kľúča:", "Pidgin is a chat program which lets you log into accounts on multiple chat networks simultaneously. This means that you can be chatting with friends on XMPP and sitting in an IRC channel at the same time.": "Pidgin je program chatu, ktorý vám umožňuje prihlásiť sa do účtov na viacerých chatových sieťach súčasne. To znamená, že môžete chatovať s priateľmi na XMPP a zároveň sedieť v IRC kanáli.", - "Piper is a fast, local neural text to speech system that sounds great and is optimized for the Raspberry Pi 4. This container provides a Wyoming protocol server for Piper.": "Piper je rýchly, miestny nervový text do rečového systému, ktorý znie skvele a je optimalizovaný pre Malina Pi 4. Tento kontajner poskytuje Wyoming protokol server pre Piper.", - "Piwigo is a photo gallery software for the web that comes with powerful features to publish and manage your collection of pictures.": "Piwigo je softvér fotogalérie pre web, ktorý prichádza s výkonnými funkciami publikovať a spravovať vašu zbierku obrázkov.", + "Piper is a fast, local neural text to speech system that sounds great and is optimized for the Raspberry Pi 4. This container provides a Wyoming protocol server for Piper.": "Piper je rýchly lokálny systém prevodu textu na reč pomocou neurónových sietí, optimalizovaný pre Raspberry Pi 4. Tento kontajner poskytuje server protokolu Wyoming pre Piper.", + "Piwigo is a photo gallery software for the web that comes with powerful features to publish and manage your collection of pictures.": "Piwigo je webová fotogaléria s bohatými funkciami na publikovanie a správu zbierky obrázkov.", "Placeholders: {{guestname}} {{node}} {{vmid}}": "Zástupné symboly: {{guestname}} {{node}} {{vmid}}", "Planka is an elegant open source project tracking tool.": "Planka je elegantný open source nástroj na sledovanie projektov.", "Please check network connectivity.": "Skontrolujte sieťové pripojenie.", @@ -4752,7 +4809,7 @@ "Please select a valid option": "Vyberte platnú možnosť", "Please use an SSH session (Linux, macOS, Windows/PuTTY) or a physical console to perform the upgrade.": "Na aktualizáciu použite SSH reláciu (Linux, macOS, Windows/PuTTY) alebo fyzickú konzolu.", "Plex WebUI": "Plex WebUI", - "Plex organizes video, music and photos from personal media libraries and streams them to smart TVs, streaming boxes and mobile devices. This container is packaged as a standalone Plex Media Server. Straightforward design and bulk actions mean getting things done faster.": "Plex organizuje video, hudbu a fotografie z osobných mediálnych knižníc a vysiela ich do smart TV, streaming boxov a mobilných zariadení. Tento kontajner je balený ako samostatný Plex Media Server. Straightforward dizajn a hromadný akcie znamená dostať veci robiť rýchlejšie.", + "Plex organizes video, music and photos from personal media libraries and streams them to smart TVs, streaming boxes and mobile devices. This container is packaged as a standalone Plex Media Server. Straightforward design and bulk actions mean getting things done faster.": "Plex usporadúva videá, hudbu a fotografie z osobných knižníc a streamuje ich do inteligentných televízorov, prehrávačov a mobilných zariadení. Tento kontajner obsahuje samostatný Plex Media Server. Jednoduché ovládanie a hromadné akcie urýchľujú prácu.", "PocketBase admin UI": "používateľské rozhranie správcu PocketBase", "Podcast synchronization service": "Služba synchronizácie podcastov", "Pool does not appear to use SSD/NVMe devices with discard support. Skipping ZFS autotrim for pool:": "Pool pravdepodobne nepoužíva SSD/NVMe zariadenia s podporou discard. ZFS autotrim sa preskočí pre pool:", @@ -4773,13 +4830,13 @@ "Postfix configuration": "Nastavenie Postfixu", "PostgreSQL": "PostgreSQL", "PostgreSQL URL without an associated service:": "PostgreSQL URL bez súvisiacej služby:", - "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 creates the database named in POSTGRES_DB on the first start. The installer default is postgresql.": "PostgreSQL pri prvom spustení vytvorí databázu s názvom v POSTGRES_DB. Inštalačný sprievodca predvolene používa názov 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 pokročilý relačný databázový systém podnikovej úrovne s otvoreným zdrojovým kódom. Podporuje relačné dotazy SQL aj nerelačné dotazy nad JSON.", + "PostgreSQL requires a password": "PostgreSQL vyžaduje heslo", + "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", + "Powerful OCR powered by DeepSeek AI": "Výkonné rozpoznávanie textu OCR pomocou DeepSeek AI", "Powerful networking tool": "Silný sieťový nástroj", "Pre-check found": "Predbežná kontrola našla", "Pre-configure destinations so you don't have to enter them every time you back up.": "Nastavte si ciele vopred, aby ste ich nemuseli zadávať pri každej zálohe.", @@ -4788,7 +4845,7 @@ "Pre-upgrade check FAILED: the simulation shows that 'proxmox-ve' would be REMOVED.\n This indicates a repository or dependency issue and upgrading now could break your Proxmox installation.": "Kontrola pred aktualizáciou ZLYHALA: simulácia ukazuje, že balík 'proxmox-ve' by bol ODSTRÁNENÝ.\n To naznačuje problém s repozitárom alebo závislosťami a aktualizácia by teraz mohla poškodiť inštaláciu Proxmoxu.", "Pre-upgrade simulation failed. See log:": "Simulácia pred inováciou zlyhala. Pozri denník:", "Pre-upgrade simulation passed: 'proxmox-ve' will be kept or upgraded safely.": "Simulácia pred aktualizáciou prešla: 'proxmox-ve' zostane zachované alebo sa bezpečne aktualizuje.", - "Prepared; the container was not modified yet": "Pripravené; obal ešte nebol upravený", + "Prepared; the container was not modified yet": "Pripravené; kontajner ešte nebol zmenený", "Preparing Log2RAM configuration": "Pripravujem nastavenie Log2RAM", "Preparing files for backup...": "Pripravujem súbory na zálohu...", "Preparing host mount...": "Pripravujem mount na hostovi...", @@ -4832,16 +4889,16 @@ "Previous installation restored": "Predchádzajúca inštalácia obnovená", "Previous shutdowns": "Predchádzajúce vypnutia", "Primary GID for Emby": "Primárne GID pre Emby", - "Privacy-first finance app with envelope budgeting and multi-device sync.": "Privacy-first finance app s obálkou budgeting a multi-device synchronizácia.", - "Privacy-first, self-hosted PDF toolkit": "Súprava nástrojov PDF s vlastným hosťovaním na prvom mieste", + "Privacy-first finance app with envelope budgeting and multi-device sync.": "Finančná aplikácia s dôrazom na súkromie, obálkovým rozpočtom a synchronizáciou viacerých zariadení.", + "Privacy-first, self-hosted PDF toolkit": "Súprava nástrojov PDF na vlastnom serveri s dôrazom na súkromie", "Private installation record saved": "Uložené súkromné záznamy o inštalácii", - "Private network assigned automatically:": "Privátne siete pridelené automaticky:", + "Private network assigned automatically:": "Automaticky pridelená súkromná sieť:", "Private network kept, because other containers still use it:": "Súkromná sieť ponechaná, pretože ju stále používajú iné kontajnery:", "Private network kept, because other guests still use it:": "Súkromná sieť zachovaná, pretože ju stále používajú iné VM alebo CT:", "Private network of the application released:": "Súkromná sieť uvoľnenej žiadosti:", "Private network of the application that is released:": "Súkromná sieť uvoľnenej aplikácie:", - "Private network release attempted:": "Pokus o vydanie súkromnej siete:", - "Private network targeted for release if no other guest uses it:": "Súkromná sieť zacielená na vydanie, ak ju nepoužíva žiadny iný hosť:", + "Private network release attempted:": "Pokus o uvoľnenie súkromnej siete:", + "Private network targeted for release if no other guest uses it:": "Súkromná sieť určená na uvoľnenie, ak ju nepoužíva iná VM alebo iný CT:", "Private network:": "Súkromná sieť:", "Private personal knowledge management": "Súkromné riadenie osobných znalostí", "Privileged": "Privilegovaný", @@ -4854,7 +4911,7 @@ "Privileged container — host root maps directly, no permission changes needed": "Privilegovaný kontajner - root hosta sa mapuje priamo, nie sú potrebné zmeny oprávnení", "Privileged containers can access host devices directly": "Privilegované kontajnery môžu priamo pristupovať k zariadeniam servera", "Privileged containers have full root access to the host system!": "Privilegované kontajnery majú plný root prístup k hostiteľskému systému!", - "Privileged installation declined": "Privilegovaná inštalácia odmietla", + "Privileged installation declined": "Privilegovaná inštalácia bola odmietnutá", "Privileged: Full host access (less secure)": "Privilegovaný: plný prístup k serveru (menej bezpečné)", "Probe failed": "Sonda zlyhala", "Proceed": "Pokračovať", @@ -4872,7 +4929,7 @@ "Proposed ZFS ARC maximum:": "Navrhované maximum ZFS ARC:", "Provided by newer version — skipping": "Poskytuje novšia verzia - preskakujem", "Prowlarr does not offer the application schema:": "Prowlarr neponúka schému aplikácie:", - "Prowlarr is a indexer manager/proxy built on the popular arr .net/reactjs base stack to integrate with your various PVR apps. Prowlarr supports both Torrent Trackers and Usenet Indexers. It integrates seamlessly with Sonarr, Radarr, Lidarr, and Readarr offering complete management of your indexers with no per app Indexer setup required (we do it all).": "Prowlarr je indexátor manažér/proxy postavený na populárnej arr .net / Reactjs base stack integrovať s rôznymi PVR aplikácie. Prowlarr podporuje ako Torrent Trackers a Usenet Indexers. To integruje bezproblémovo s Sonarr, Radarr, Lidarr, a Readarr ponúka kompletné riadenie vašich indexerov bez na app Indexer nastavenie required (robíme to všetko).", + "Prowlarr is a indexer manager/proxy built on the popular arr .net/reactjs base stack to integrate with your various PVR apps. Prowlarr supports both Torrent Trackers and Usenet Indexers. It integrates seamlessly with Sonarr, Radarr, Lidarr, and Readarr offering complete management of your indexers with no per app Indexer setup required (we do it all).": "Prowlarr je správca indexerov a proxy na základe technológií .NET a React používaných aplikáciami *arr. Podporuje torrentové trackery aj indexery Usenetu. Prepája sa so Sonarr, Radarr, Lidarr a Readarr a spravuje ich indexery bez samostatného nastavovania v každej aplikácii.", "ProxMenux Information": "Informácie o ProxMenux", "ProxMenux Monitor": "ProxMenux Monitor", "ProxMenux Monitor Service Verification": "Kontrola služby ProxMenux Monitor", @@ -4886,14 +4943,15 @@ "ProxMenux Monitor protection": "ochranou ProxMenux Monitoru", "ProxMenux Monitor unit repaired and restarted": "Jednotka ProxMenux Monitor bola opravená a reštartovaná", "ProxMenux Monitor → Backups tab (live progress card with estimated time, logs, rollback delta)": "ProxMenux Monitor → karta Backups (živý priebeh s odhadom času, záznamami a rozdielom rollbacku)", + "ProxMenux OCI manager Apps (Technology Preview)": "ProxMenux – správca OCI aplikácií (Technology Preview)", "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:", @@ -4905,9 +4963,13 @@ "Proxmology logo applied": "Logo Proxmology bolo použité", "Proxmox 9 system update allready": "Systém Proxmox 9 je už aktualizovaný", "Proxmox APT repositories configured": "APT repozitáre Proxmoxu sú nastavené", + "Proxmox APT repository inventory is invalid or reports parse errors. Fix sources in {ui}; no repository changed.": "Zoznam repozitárov APT Proxmoxu je neplatný alebo obsahuje chyby načítania. Opravte zdroje v {ui}; žiadny repozitár sa nezmenil.", "Proxmox Backup Server": "Proxmox Backup Server", "Proxmox Backup Server (PBS) destinations": "Ciele Proxmox Backup Servera (PBS)", "Proxmox Backup Server APT repositories configured": "APT repozitáre Proxmox Backup Server sú nastavené", + "Proxmox Backup Server Microcode": "Proxmox Backup Server – mikrokód procesora", + "Proxmox Backup Server Post Install": "Proxmox Backup Server – nastavenie po inštalácii", + "Proxmox Backup Server Subscription Banner Removal": "Proxmox Backup Server – odstránenie upozornenia na predplatné", "Proxmox Backup Server Update": "Aktualizácia Proxmox Backup Server", "Proxmox Backup Server update completed.": "Aktualizácia Proxmox Backup Server bola dokončená.", "Proxmox CIFS Storage Status:": "Stav CIFS úložiska v Proxmoxe:", @@ -4929,12 +4991,13 @@ "Proxmox iSCSI Storage Status:": "Stav iSCSI úložiska v Proxmoxe:", "Proxmox jail configured": "Proxmox jail nastavený", "Proxmox local storages:": "Lokálne úložiská Proxmoxu:", + "Proxmox no-subscription standard repository handle unavailable; no repository changed.": "Štandardný repozitár Proxmoxu no-subscription nie je dostupný; žiadny repozitár sa nezmenil.", "Proxmox repository": "Proxmox úložisko", "Proxmox repository OK (candidate is 9.x)": "Proxmox repozitár je v poriadku (kandidát je 9.x)", "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.", @@ -4946,11 +5009,11 @@ "Proxmox web interface: Datacenter > Storage > Add > ZFS": "Webové rozhranie Proxmoxu: Datacenter > Storage > Add > ZFS", "Proxmox web interface: Datacenter > Storage > Add > iSCSI": "Webové rozhranie Proxmoxu: Datacenter > Storage > Add > iSCSI", "Proxy address to reach the API (optional)": "Adresa proxy na prístup k API (voliteľné)", - "Public UDP port clients connect to": "Verejné UDP port klienti pripojiť k", - "Public UDP port peers connect to": "Verejné UDP portové rovesníci pripojiť k", + "Public UDP port clients connect to": "Verejný port UDP na pripojenie klientov", + "Public UDP port peers connect to": "Verejný port UDP na pripojenie účastníkov", "Public URL of phpMyAdmin when it is served behind a reverse proxy": "Verejné URL phpMyAdmin, keď sa podáva za reverzným proxy", - "Public address clients connect to (vpn.example.com or a public IP)": "Klienti verejnej adresy sa pripájajú k (vpn.example.com alebo verejné IP)", - "Public address peers connect to, or auto to detect it (vpn.example.com)": "Verejná adresa peers pripojiť, alebo auto na detekciu (vpn.example.com)", + "Public address clients connect to (vpn.example.com or a public IP)": "Verejná adresa na pripojenie klientov (vpn.example.com alebo verejná IP adresa)", + "Public address peers connect to, or auto to detect it (vpn.example.com)": "Verejná adresa, ku ktorej sa pripájajú účastníci, alebo auto na jej zistenie (vpn.example.com)", "Publish each directory from Resources: open it, switch on SMB, NFS or both, and save.": "Zverejnite každý adresár zo zdrojov: otvorte ho, zapnite SMB, NFS alebo oboje a uložte.", "Pulling latest changes from GitHub...": "Sťahujem najnovšie zmeny z GitHubu...", "Purge the gasket-dkms package": "Úplne odstrániť balík gasket-dkms", @@ -4958,11 +5021,11 @@ "Purging log2ram apt package...": "Úplne odstraňujem balík log2ram cez APT...", "Put this application under watchdog? It is restarted automatically when it crashes.": "Dať túto aplikáciu pod watchdog? Pri zlyhaní sa automaticky reštartuje.", "Put this application under watchdog? It is restarted automatically when it crashes. A stop or a shutdown you ask for is never undone.": "Dať túto aplikáciu pod watchdog? Pri zlyhaní sa automaticky reštartuje. Zastavenie alebo vypnutie, o ktoré požiadate, sa nikdy nevráti späť.", - "Pwndrop is a self-deployable file hosting service for sending out red teaming payloads or securely sharing your private files over HTTP and WebDAV.": "Pwndrop je samozamestnávateľná serverová hostingová služba pre odosielanie červeného spojovacieho užitočného zaťaženia alebo bezpečné zdieľanie vašich súkromných súborov cez HTTP a WebDAV.", - "PyCharm offers out-of-the-box support for Python, databases, Jupyter, Git, Conda, PyTorch, TensorFlow, Hugging Face, Django, Flask, FastAPI, and more.": "PyCharm ponúka mimo-of-the-box podporu pre Python, databázy, Jupyter, Git, Conda, PyTorch, TensorFlow, Hugging Face, Django, Flask, FastAPI a ďalšie.", - "Pydio Cells needs an external MySQL or MariaDB database. The setup wizard asks for its address, database name and user on the first start.": "Pydio Cells potrebuje externú MySQL alebo MariaDB databázu. Sprievodca nastavením žiada o svoju adresu, meno databázy a užívateľa pri prvom štarte.", - "Pydio Cells redirects to the address given in EXTERNALURL. If the container changes address, edit lxc.environment.runtime: EXTERNALURL and SERVER_IP in /etc/pve/lxc/.conf with the container stopped, and delete /config/keys/cert.crt to regenerate the certificate.": "Pydio Cells presmeruje na adresu uvedenú v EXTERNURL. Ak kontajner zmení adresu, upravte lxc.environment.runtime: EXTERNURL a SERVER_IP v /etc/pve/lxc/.conf s kontajnerom zastavil, a odstráňte /config/keys/cert.crt pre regeneráciu certifikátu.", - "Pydio-cells is the nextgen file sharing platform for organizations. It is a full rewrite of the Pydio project using the Go language following a micro-service architecture.": "Pydio-bunky je platforma pre zdieľanie súborov pre organizácie. Je to úplný prepis projektu Pydio pomocou jazyka Go podľa architektúry mikroslužieb.", + "Pwndrop is a self-deployable file hosting service for sending out red teaming payloads or securely sharing your private files over HTTP and WebDAV.": "Pwndrop je služba na vlastnom serveri na zdieľanie súborov cez HTTP a WebDAV, určená na doručovanie testovacích súborov pri simulácii útokov aj bezpečné zdieľanie súkromných súborov.", + "PyCharm offers out-of-the-box support for Python, databases, Jupyter, Git, Conda, PyTorch, TensorFlow, Hugging Face, Django, Flask, FastAPI, and more.": "PyCharm predvolene podporuje Python, databázy, Jupyter, Git, Conda, PyTorch, TensorFlow, Hugging Face, Django, Flask, FastAPI a ďalšie technológie.", + "Pydio Cells needs an external MySQL or MariaDB database. The setup wizard asks for its address, database name and user on the first start.": "Pydio Cells potrebuje externú databázu MySQL alebo MariaDB. Pri prvom spustení sa sprievodca opýta na adresu servera, názov databázy a používateľa.", + "Pydio Cells redirects to the address given in EXTERNALURL. If the container changes address, edit lxc.environment.runtime: EXTERNALURL and SERVER_IP in /etc/pve/lxc/.conf with the container stopped, and delete /config/keys/cert.crt to regenerate the certificate.": "Pydio Cells presmerúva na adresu v EXTERNALURL. Ak sa adresa kontajnera zmení, zastavte ho, upravte lxc.environment.runtime: EXTERNALURL a SERVER_IP v /etc/pve/lxc/.conf a odstráňte /config/keys/cert.crt, aby sa certifikát vytvoril znova.", + "Pydio-cells is the nextgen file sharing platform for organizations. It is a full rewrite of the Pydio project using the Go language following a micro-service architecture.": "Pydio Cells je platforma na zdieľanie súborov pre organizácie. Ide o úplný prepis projektu Pydio v jazyku Go s architektúrou mikroslužieb.", "QDirStat Qt-based directory statistics: KDirStat without any KDE -- from the author of the original KDirStat.": "QDirStat Štatistika adresára založená na Qt: KDirStat bez KDE -- od autora pôvodného KDirStat.", "Quick health check (PASSED / FAILED)": "Rýchla kontrola stavu (PASSED / FAILED)", "Quick health status — overall SMART result + key attributes": "Rýchly stav zdravia - celkový SMART výsledok + hlavné údaje", @@ -4973,7 +5036,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.", @@ -4981,27 +5044,28 @@ "RPC Bind Service: RUNNING": "Služba RPC Bind: BEŽÍ", "RPC Bind Service: STOPPED": "Služba RPC Bind: ZASTAVENÁ", "RPC Bind Service: STOPPED - starting...": "Služba RPC Bind: ZASTAVENÁ - spúšťam...", - "RPCS3 is a multi-platform open-source Sony PlayStation 3 emulator and debugger written in C++ for Windows, Linux, macOS and FreeBSD.": "RPCS3 je multi-platforma open-source Sony PlayStation 3 emulátor a debugger napísaný v C++ pre Windows, Linux, macOS a FreeBSD.", - "Radarr - A fork of Sonarr to work with movies à la Couchpotato.": "Radarr - A fork Sonarr pracovať s filmami à la Couchpotato.", + "RPCS3 is a multi-platform open-source Sony PlayStation 3 emulator and debugger written in C++ for Windows, Linux, macOS and FreeBSD.": "RPCS3 je multiplatformový emulátor a ladiaci nástroj Sony PlayStation 3 s otvoreným zdrojovým kódom, napísaný v C++ pre Windows, Linux, macOS a FreeBSD.", + "Radarr - A fork of Sonarr to work with movies à la Couchpotato.": "Radarr – odnož Sonarr na správu filmov podobne ako CouchPotato.", "Radarr added to Prowlarr": "Radarr pridaný do Prowlarr", "Radarr connected to qBittorrent": "Radarr napojený na qBittorrent", "Radarr root folder configured": "Konfigurovaný koreňový priečinok Radarr", "RagFlow is an open-source RAG engine based on deep document understanding.": "RagFlow je open-source motor RAG založený na hlbokom porozumení dokumentov.", - "Raneto - is an open source Knowledgebase platform that uses static Markdown files to power your Knowledgebase.": "Raneto - je open source Knowledgebase platforma, ktorá používa statické Markdown súbory pre napájanie znalostnej základne.", + "Raneto - is an open source Knowledgebase platform that uses static Markdown files to power your Knowledgebase.": "Raneto je platforma znalostnej databázy s otvoreným zdrojovým kódom, ktorá používa statické súbory Markdown.", "Raneto web interface": "Webové rozhranie Raneto", - "RawTherapee is a free, cross-platform raw image processing program!": "RawTherapee je zadarmo, cross-platform surový program spracovania obrazu!", + "RawTherapee is a free, cross-platform raw image processing program!": "RawTherapee je bezplatný multiplatformový program na spracovanie fotografií vo formáte RAW.", "Rclone WebUI": "Rclone WebUI", - "Rclone mount": "Prípojka Rclón", - "Rclone mount active": "Comment", - "Rclone mount needs a privileged LXC with FUSE access. The container is dedicated to Rclone and its web UI must not be exposed to untrusted networks.": "Rclone mount potrebuje privilegovaný LXC s FUSE prístupom. Kontajner je určený Rclone a jeho webové UI nesmie byť vystavený nedôveryhodným sieťam.", - "Rclone mount requires a privileged LXC with FUSE access. Use this profile only on a trusted node and network.": "Rclon mount requires privilegovaný LXC s FUSE prístupom. Použite tento profil len na dôveryhodnom uzle a sieti.", - "Rclone mount requires a privileged container": "Rclon mount requires privilegovaný kontajner", + "Rclone mount": "Pripojenie Rclone", + "Rclone mount active": "Pripojenie Rclone je aktívne", + "Rclone mount needs a privileged LXC with FUSE access. The container is dedicated to Rclone and its web UI must not be exposed to untrusted networks.": "Pripojenie Rclone vyžaduje privilegovaný kontajner LXC s prístupom k FUSE. Kontajner je vyhradený pre Rclone a jeho webové rozhranie nesmie byť prístupné z nedôveryhodných sietí.", + "Rclone mount requires a privileged LXC with FUSE access. Use this profile only on a trusted node and network.": "Pripojenie cez Rclone vyžaduje privilegovaný kontajner LXC s prístupom k FUSE. Tento profil používajte iba na dôveryhodnom uzle a v dôveryhodnej sieti.", + "Rclone mount requires a privileged container": "Pripojenie Rclone vyžaduje privilegovaný kontajner", + "Rclone remote": "Vzdialené úložisko Rclone", "Re-enter the BORG REPOKEY passphrase to confirm:": "Zadajte BORG REPOKEY frázu znova na potvrdenie:", "Re-running pre-check after repairs...": "Spúšťam predbežnú kontrolu znova po opravách...", "Reachable": "Dostupné", "Read an oci-compose from a file of this host": "Načítať oci-compose zo súboru tohto hostiteľa", "Read its Compose file from a file of this host": "Načítať súbor Compose z tohto hostiteľa", - "Read the link with pct console CTID on the Proxmox host, or from the Console panel of the container in the Proxmox web interface, then open the https://playit.gg/claim/ address it shows in a browser and sign in to playit.gg. Ctrl+a q leaves pct console.": "Prečítajte si odkaz s pct konzolou CTID na Proxmox hostiteľa, alebo z panelu konzoly kontajnera vo webovom rozhraní Proxmox, potom otvorte https://playit.gg/claim/ adresu, ktorú zobrazí v prehliadači a prihláste sa na playit.gg. Ctrl+a q opustí pct konzolu.", + "Read the link with pct console CTID on the Proxmox host, or from the Console panel of the container in the Proxmox web interface, then open the https://playit.gg/claim/ address it shows in a browser and sign in to playit.gg. Ctrl+a q leaves pct console.": "Odkaz zobrazíte na hostiteľovi Proxmox príkazom pct console CTID alebo v paneli Console kontajnera vo webovom rozhraní Proxmox. Zobrazenú adresu https://playit.gg/claim/ otvorte v prehliadači a prihláste sa do playit.gg. Konzolu pct console ukončíte pomocou Ctrl+a q.", "Read-Only": "Iba na čítanie", "Read-Only access": "Prístup iba na čítanie", "Read-Write (universal)": "Čítanie/zápis (univerzálne)", @@ -5010,7 +5074,7 @@ "Read-only access (or no write permissions).": "Prístup iba na čítanie (alebo chýba oprávnenie na zápis).", "Read-only mount": "Pripojiť iba na čítanie", "Read/Write (default)": "Čítanie/zápis (predvolené)", - "Read/write": "Čítať/písať", + "Read/write": "Čítanie a zápis", "Read/write CPU model-specific registers": "Čítať/zapisovať modelovo špecifické registre CPU", "Readable user table (UID, shell, etc.)": "Prehľadná tabuľka používateľov (UID, shell a pod.)", "Reading NVMe SMART data...": "Čítam NVMe SMART dáta...", @@ -5018,10 +5082,10 @@ "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", + "Real-time collaborative document editor": "Editor dokumentov so spoluprácou v reálnom čase", "Real-time network monitoring (press q to exit)": "Sieťový monitoring v reálnom čase (ukončíte klávesom q)", "Real-time network usage (iftop)": "Sieťová prevádzka v reálnom čase (iftop)", "Reason: Access denied": "Dôvod: Prístup zamietnutý", @@ -5038,7 +5102,7 @@ "Rebooting the system...": "Reštartujem systém...", "Rebuilding initramfs after vfio.conf cleanup...": "Prebudovanie initramfs po vyčistení vfio.conf...", "Rebuilding initramfs to apply nouveau blacklist before installation...": "Znovu vytváram initramfs, aby sa blacklist nouveau použil ešte pred inštaláciou...", - "Rebuilding the container and recovering it from its backup are tested on the same image; the first update to a newer image is still to be observed.": "Prebudovanie kontajnera a jeho obnovenie zo zálohy sa testuje na rovnakom obrázku; prvá aktualizácia na novší obrázok je ešte potrebné pozorovať.", + "Rebuilding the container and recovering it from its backup are tested on the same image; the first update to a newer image is still to be observed.": "Opätovné vytvorenie kontajnera aj obnovenie zo zálohy sú otestované s rovnakým obrazom. Prvú aktualizáciu na novší obraz ešte treba overiť.", "Recent": "Nedávne", "Recent PBS tasks": "Nedávne úlohy PBS", "Recent Samba Servers": "Posledné Samba servery", @@ -5046,9 +5110,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", @@ -5064,19 +5128,19 @@ "Recommended: use GPU -> LXC mode for these devices.": "Odporúčanie: pre tieto zariadenia použite režim GPU -> LXC.", "Recommended: use GPU with LXC workloads instead of VM passthrough on this hardware.": "Odporúčané: na tomto hardvéri používajte GPU radšej s LXC workloadmi namiesto VM passthrough.", "Reconciled": "Upravené", - "Recover OCI": "Obnoviť OCI", - "Recover OCI stack": "Obnoviť zásobník OCI", + "Recover OCI": "Obnoviť predchádzajúcu inštaláciu", + "Recover OCI stack": "Obnoviť OCI aplikáciu s viacerými kontajnermi", "Recover now?": "Obnoviť teraz?", - "Recover or complete the operation?": "Obnoviť alebo dokončiť operation?", - "Recover restored OCI applications": "Obnovte obnovené aplikácie OCI", + "Recover or complete the operation?": "Obnoviť alebo dokončiť operáciu?", + "Recover restored OCI applications": "Registrácia obnovených OCI aplikácií", "Recover the keyfile using your recovery passphrase?": "Obnoviť keyfile pomocou obnovovacej frázy?", - "Recover the previous installation": "Obnoviť predchádzajúce zariadenie", - "Recover them now?": "Obnoviť ich teraz?", + "Recover the previous installation": "Obnoviť predchádzajúcu inštaláciu", + "Recover them now?": "Znova zaregistrovať uvedené aplikácie?", "Recoverable:": "Obnoviteľné:", - "Recovering the previous installation": "Obnovenie predchádzajúceho zariadenia", + "Recovering the previous installation": "Obnovovanie predchádzajúcej inštalácie", "Recovery blob upload failed — main backup is OK, but keyfile recovery from PBS will not be available for this backup.": "Nahratie obnovovacieho balíčka zlyhalo - hlavná záloha je v poriadku, ale obnova keyfile z PBS pre túto zálohu nebude dostupná.", "Recovery blob:": "Obnovovací balíček:", - "Recovery completed. The container had not been modified yet.": "Vymáhanie ukončené. Obal ešte nebol upravený.", + "Recovery completed. The container had not been modified yet.": "Obnova dokončená. Kontajner ešte nebol zmenený.", "Recovery completed. The disks of the failed attempt were removed; the backup is kept.": "Obnova dokončená. Disky neúspešného pokusu boli odstránené; záloha je zachovaná.", "Recovery completed. The displaced disks and the backup are kept; nothing was deleted automatically.": "Vymáhanie ukončené. Posunuté disky a záloha sú uchovávané; nič nebolo automaticky vymazané.", "Recovery completed; the backup is kept.": "Obnova dokončená; záloha je zachovaná.", @@ -5085,37 +5149,41 @@ "Recovery setup failed": "Nastavenie obnovy zlyhalo", "Recreate": "Obnoviť", "Recreate OCI": "Obnoviť OCI", - "Recreate OCI stack": "Znovu vytvoriť OCI stack", + "Recreate OCI stack": "Znovu vytvoriť aplikáciu s viacerými kontajnermi", "Recreate every container with its saved configuration": "Znovu vytvoriť každý kontajner s uloženými nastaveniami", - "Recreate the whole stack?": "Znovu vytvoriť celý stack?", + "Recreate the whole stack?": "Znovu vytvoriť všetky kontajnery aplikácie?", "Recreate with these options?": "Obnoviť tieto možnosti?", "Recreate: add or remove extra paths and devices": "Znovu vytvoriť: pridajte alebo odstráňte ďalšie cesty a zariadenia", "Recreate: edit resources, network, paths and GPU": "Obnoviť: editovať zdroje, sieť, cesty a GPU", - "Recreated stack checked": "Skontrolovaný znova vytvorený stack", + "Recreated stack checked": "Znovu vytvorené kontajnery aplikácie sú skontrolované", "Recreated:": "Znovu vytvorené:", "Recreating": "Znovu vytváram", - "Recreating requires a confirmed proposal": "Obnovenie requires potvrdený návrh", - "Recreating the container...": "Obnovenie kontajnera...", - "Recreating the container:": "Obnovenie nádoby:", + "Recreating requires a confirmed proposal": "Opätovné vytvorenie vyžaduje potvrdený návrh", + "Recreating the container...": "Kontajner sa znova vytvára...", + "Recreating the container:": "Kontajner sa znova vytvára:", "Recreation completed. Data kept.": "Rekreácia dokončená. Údaje uchovávané.", "Recreation prepared": "Pripravené rekreácie", "Refresh APT index and verify repositories:": "Obnovte APT index a overte repozitáre:", "Refresh the configured APT repositories and review the PBS package upgrade? Repository files will be preserved.": "Obnoviť indexy nakonfigurovaných repozitárov APT a skontrolovať aktualizáciu balíkov PBS? Súbory repozitárov sa zachovajú.", + "Refresh the index from the image sources": "Obnoviť index zo zdrojov obrazov", "Refresh token of the connector, from the Twingate admin console": "Obnovovací token konektora z administrátorskej konzoly Twingate", "Refresh your browser (Ctrl+Shift+R) to see changes": "Obnovte prehliadač (Ctrl+Shift+R), aby ste videli zmeny", "Refresh your browser to see changes (server restart may be required)": "Obnovte stránku v prehliadači, aby ste videli zmeny (môže byť potrebný reštart servera)", "Refreshing apt cache...": "Obnovujem apt cache...", "Refreshing the NVIDIA runtime...": "Obnovenie prevádzky NVIDIA...", - "Refusing an unexpected rootfs path:": "Odmietnutie nečakanej cesty ku koreňom:", + "Refusing an unexpected rootfs path:": "Odmietnutá neočakávaná cesta koreňového súborového systému:", + "Regenerate the catalog templates": "Znova vygenerovať šablóny katalógu", + "Regenerate the template of one application": "Znova vygenerovať šablónu jednej aplikácie", "Regenerating PVE package cache...": "Znovu vytváram cache PVE balíkov...", "Regenerating boot artifacts for the merged kernel-agnostic changes...": "Znovu vytváram boot súbory pre zlúčené zmeny nezávislé od kernelu...", "Regenerating certificates and restarting services...": "Znovu generujem certifikáty a reštartujem služby...", + "Register again the OCI applications restored from a backup": "Znova zaregistrovať OCI aplikácie obnovené zo zálohy", "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", @@ -5125,7 +5193,7 @@ "Reinstalled Proxmox packages successfully": "Balíky Proxmoxu boli úspešne preinštalované", "Reinstalling": "Preinštalovávam", "Reinstalling core Proxmox packages...": "Preinštalovávam základné balíky Proxmoxu...", - "Relative CPU priority (cpuunits)": "Relatívna priorita procesora (cpu jednotky)", + "Relative CPU priority (cpuunits)": "Relatívna priorita CPU (cpuunits)", "Release Channel": "Vetva vydania", "Release channel set to Beta.": "Vetva vydania je nastavená na Beta.", "Release channel set to Stable.": "Vetva vydania je nastavená na stabilnú verziu.", @@ -5137,12 +5205,12 @@ "Reminder: You must install the QEMU Guest Agent inside the Windows VM": "Pripomienka: QEMU Guest Agent musíte nainštalovať aj priamo vo Windows VM", "Remmina is a remote desktop client written in GTK, aiming to be useful for system administrators and travellers, who need to work with lots of remote computers in front of either large or tiny screens. Remmina supports multiple network protocols, in an integrated and consistent user interface. Currently RDP, VNC, SPICE, SSH and EXEC are supported.": "Remmina je vzdialený desktopový klient napísaný v GTK, ktorého cieľom je byť užitočný pre správcov systémov a cestujúcich, ktorí musia pracovať s množstvom vzdialených počítačov pred veľkými alebo malými obrazovkami. Remmina podporuje viaceré sieťové protokoly v integrovanom a konzistentnom užívateľskom rozhraní. V súčasnosti sú podporované programy RDP, VNC, SPICE, SSH a EXEC.", "Remote Access & VPN": "Vzdialený prístup a VPN", - "Remote dry run completed; no container was created.": "Diaľkový suchý beh dokončený; nebola vytvorená žiadna nádoba.", + "Remote dry run completed; no container was created.": "Vzdialený skúšobný beh bol dokončený; žiadny kontajner sa nevytvoril.", "Remote repository path:": "Vzdialená cesta repozitára:", "Remote server via SSH (recommended — off-host, dedup across machines)": "Vzdialený server cez SSH (odporúčané - mimo hosta, deduplikácia medzi strojmi)", - "Remote verified:": "Diaľkové overenie:", + "Remote verified:": "Vzdialené úložisko je overené:", "Remounting CIFS share with open permissions...": "Znovu pripájam CIFS zdieľanie s otvorenými oprávneniami...", - "Removal command finished; review any warnings above.": "Príkaz na odstránenie je dokončený;skontrolujte všetky vyššie uvedené upozornenia.", + "Removal command finished; review any warnings above.": "Príkaz na odstránenie sa dokončil; skontrolujte všetky upozornenia vyššie.", "Remove CIFS Mount": "Odstrániť CIFS mount", "Remove CIFS Mount (pvesm or fstab)": "Odstrániť CIFS mount (pvesm alebo fstab)", "Remove CIFS Storage": "Odstrániť CIFS úložisko", @@ -5187,15 +5255,15 @@ "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 application? Its container disks are deleted, and only a backup can bring them back.": "Odstrániť aplikáciu? Jej kontajnerové disky sa vymažú a obnoviť ich možno iba zo zálohy.", "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", + "Remove: delete the application and its containers": "Odstrániť: zmazať aplikáciu a jej kontajnery", "Removed": "Odstránené", "Removed KVM MSR options from configuration": "Možnosti KVM MSR boli odstránené z nastavenia", "Removed Mount:": "Odstránený mount:", @@ -5247,9 +5315,9 @@ "Removing storage from Proxmox...": "Odstraňujem úložisko z Proxmoxu...", "Removing system limits optimizations...": "Odstraňujem optimalizácie systémových limitov...", "Removing the containers...": "Odstránenie kontajnerov...", - "Removing the incomplete stack...": "Odstránenie neúplného zásobníka...", + "Removing the incomplete stack...": "Nedokončená zostava sa odstraňuje...", "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é", @@ -5273,21 +5341,21 @@ "Repository helper unavailable. NVIDIA installation stopped.": "Pomocník úložiska nie je k dispozícii. Inštalácia NVIDIA sa zastavila.", "Repository policy returned an unexpected result.": "Politika úložiska vrátila neočakávaný výsledok.", "Repository ready.": "Repozitár je pripravený.", - "Repository sources changed, but APT package-list refresh failed. Operation stopped; sources were not rolled back. Inspect Administration > Repositories and retry apt-get update before continuing.": "Zdroje úložiska sa zmenili, ale obnovenie zoznamu balíkov APT zlyhalo. Prevádzka zastavená;zdroje neboli vrátené späť. Pred pokračovaním skontrolujte Administrácia > Repozitáre a zopakujte apt-get update.", + "Repository sources changed, but APT package-list refresh failed. Operation stopped; sources were not rolled back. Inspect Administration > Repositories and retry apt-get update before continuing.": "Zdroje repozitárov sa zmenili, ale obnovenie zoznamu balíkov APT zlyhalo. Operácia sa zastavila; pôvodné zdroje sa neobnovili. Pred pokračovaním skontrolujte Administration > Repositories a zopakujte apt-get update.", "Repository sources changed, but APT package-list refresh failed. Operation stopped; sources were not rolled back. Inspect Node > Updates > Repositories and retry apt-get update before continuing.": "Zdroje úložiska sa zmenili, ale obnovenie zoznamu balíkov APT zlyhalo. Prevádzka zastavená; zdroje neboli vrátené späť. Pred pokračovaním skontrolujte Node > Updates > Repository a zopakujte apt-get update.", "Repository switch declined; no APT source changed.": "Prepnutie úložiska bolo odmietnuté; žiadny zdroj APT sa nezmenil.", "Repository:": "Repozitár:", - "Request a staging certificate for testing: true or false": "Vyžiada si osvedčenie o intenzite na testovanie: pravdivé alebo nepravdivé", + "Request a staging certificate for testing: true or false": "Požiadať o testovací certifikát staging: true alebo false", "Require reboot": "Vyžaduje reštart", "Required command not found:": "Požadovaný príkaz sa nenašiel:", "Required if using a VirtIO or SCSI disk.": "Vyžaduje sa pri použití VirtIO alebo SCSI disku.", "Required install helpers not available.": "Potrební pomocníci na inštaláciu nie sú dostupní.", - "Required new path cancelled": "Required nová cesta zrušená", - "Required persistent paths cannot be removed": "Required perzistentné cesty nemožno odstrániť", + "Required new path cancelled": "Pridanie novej povinnej cesty bolo zrušené", + "Required persistent paths cannot be removed": "Povinné cesty trvalého úložiska nemožno odstrániť", "Required update helpers unavailable. Update stopped.": "Požadovaní pomocníci s aktualizáciou nie sú k dispozícii. Aktualizácia zastavená.", "Requires acl package. Skip if setfacl is not available.": "Vyžaduje balík acl. Preskočte, ak setfacl nie je dostupný.", "Requires authentication": "Vyžaduje prihlásenie", - "Reserving a private network...": "Zachovanie súkromnej siete...", + "Reserving a private network...": "Rezervuje sa súkromná sieť...", "Reset Capability Blocked": "Reset zariadenia nie je použiteľný", "Reset Capability Warning": "Upozornenie na reset schopnosť", "Reset Monitor Password": "Obnoviť heslo Monitora", @@ -5295,13 +5363,14 @@ "Reset current storage selection": "Vynulovať aktuálny výber úložiska", "Resetting time synchronization...": "Resetujem synchronizáciu času...", "Residual Bookworm entries commented where applicable": "Zostávajúce položky Bookworm boli zakomentované, kde to bolo potrebné", - "Resilio-sync (formerly BitTorrent Sync) uses the BitTorrent protocol to sync files and folders between all of your devices. There are both free and paid versions, this container supports both. There is an official sync image but we created this one as it supports user mapping to simplify permissions for volumes.": "Resilio-sync (predtým BitTorrent Sync) používa protokol BitTorrent na synchronizáciu súborov a priečinkov medzi všetkými zariadeniami. Existujú ako zadarmo a platená verzia, tento kontajner podporuje oboje. Existuje oficiálna synchronizácia obrazu, ale my sme vytvorili tento, pretože podporuje mapovanie užívateľa na zjednodušenie oprávnení pre objemy.", + "Resilio-sync (formerly BitTorrent Sync) uses the BitTorrent protocol to sync files and folders between all of your devices. There are both free and paid versions, this container supports both. There is an official sync image but we created this one as it supports user mapping to simplify permissions for volumes.": "Resilio Sync (predtým BitTorrent Sync) používa protokol BitTorrent na synchronizáciu súborov a priečinkov medzi zariadeniami. Kontajner podporuje bezplatnú aj platenú verziu. Oproti oficiálnemu obrazu podporuje mapovanie používateľov, ktoré zjednodušuje oprávnenia dátových zväzkov.", + "Resolve catalog icons against the jsdelivr icon sets": "Priradiť ikony katalógu zo súprav ikon jsdelivr", "Resolve package conflicts": "Vyriešiť konflikty balíkov", "Resources": "Zdroje", "Restart Network": "Reštartovať sieť", "Restart Network Service": "Reštartovať sieťovú službu", "Restart Web UI proxy": "Reštartovať proxy webového rozhrania", - "Restart aMule automatically on a schedule (true or false)": "Reštartujte aMule automaticky podľa plánu (pravda alebo nepravda)", + "Restart aMule automatically on a schedule (true or false)": "Automaticky reštartovať aMule podľa plánu (true alebo false)", "Restart and enable Samba:": "Reštartovať a zapnúť Sambu:", "Restart container to activate mount?": "Reštartovať kontajner, aby sa mount aktivoval?", "Restarting ProxMenux Monitor service...": "Reštartujem službu ProxMenux Monitor...", @@ -5347,21 +5416,21 @@ "Restoring the original rpcbind service state...": "Obnovenie pôvodného stavu služby rpcbind...", "Restoring the previous Rclone configuration...": "Obnovenie predchádzajúcej konfigurácie Rclone...", "Restoring the previous backup...": "Obnovenie predchádzajúcej zálohy...", - "Restoring the previous state of the stack...": "Obnovenie predchádzajúceho stavu stohu...", + "Restoring the previous state of the stack...": "Obnovujem predchádzajúci stav celej aplikácie...", "Restoring the stack records...": "Obnovenie záznamov...", "Results will be saved automatically to:": "Výsledky sa automaticky uložia do:", "Results will be saved to:": "Výsledky sa uložia do:", "Results:": "Výsledky:", "Retention": "Uchovávanie", "Retention policy (prune-backups syntax).": "Zásady uchovávania (syntax orezaných záloh).", - "RetroArch is a frontend for emulators, game engines and media players. It enables you to run classic games on a wide range of computers and consoles through its slick graphical interface.": "RetroArch je frontend pre emulátory, herné motory a prehrávače médií. Umožňuje spustiť klasické hry na širokej škále počítačov a konzol prostredníctvom svojho klik grafického rozhrania.", + "RetroArch is a frontend for emulators, game engines and media players. It enables you to run classic games on a wide range of computers and consoles through its slick graphical interface.": "RetroArch je grafické rozhranie pre emulátory, herné enginy a prehrávače médií. Umožňuje spúšťať klasické hry na širokej škále počítačov a konzol prostredníctvom prehľadného grafického rozhrania.", "Return": "Späť", "Return to Main Menu": "Späť do hlavného menu", "Return to Share Menu": "Späť do menu zdieľania", "Return to main menu": "Späť do hlavného menu", "Returning the containers to their previous state...": "Vraciam kontajnery do ich predchádzajúceho stavu...", "Reused the encryption key from the PVE storage entry.": "Použil sa šifrovací kľúč z položky PVE úložiska.", - "Reverse proxy samples for other applications are in /config/nginx/proxy_confs inside the container.": "Reverzné proxy vzorky pre iné aplikácie sú v /config/nginx/proxy confs vnútri kontajnera.", + "Reverse proxy samples for other applications are in /config/nginx/proxy_confs inside the container.": "Príklady reverzného proxy pre ďalšie aplikácie sú v /config/nginx/proxy_confs v kontajneri.", "Reverting AMD (Ryzen/EPYC) fixes...": "Vraciam späť opravy pre AMD (Ryzen/EPYC)...", "Reverting IOMMU/VFIO configuration...": "Vraciam späť nastavenie IOMMU/VFIO...", "Reverting TCP BBR + Fast Open...": "Vraciam späť TCP BBR + Fast Open...", @@ -5374,24 +5443,24 @@ "Review package upgrade": "Skontrolovať aktualizáciu balíkov", "Review passthrough config files": "Skontrolovať konfiguračné súbory passthrough", "Review what will be removed": "Skontrolujte, čo sa odstráni", - "Rip DVD and Blu-ray media from a browser": "Rip DVD a Blu-ray médiá z prehliadača", + "Rip DVD and Blu-ray media from a browser": "Kopírovanie médií DVD a Blu-ray cez prehliadač", "Rollback: nothing to remove (host matches backup)": "Rollback: nie je čo odstrániť (host zodpovedá zálohe)", - "Rolling back the incomplete container": "Zatáčanie nedokončenej nádoby", - "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.", + "Rolling back the incomplete container": "Nedokončený kontajner sa odstraňuje v rámci návratu do pôvodného stavu", + "RomM is a self-hosted ROM manager for managing and playing game collections.": "RomM je správca obrazov ROM na vlastnom serveri na správu a hranie herných zbierok.", "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 on the Proxmox node are required": "Koreňové práva na Proxmox uzla sú required", + "Root privileges are required": "Vyžadujú sa oprávnenia používateľa root", + "Root privileges on the Proxmox node are required": "Na uzle Proxmox sú potrebné oprávnenia používateľa root", "Root shell/profile config": "Nastavenie shellu/profilu roota", "Root user on the PVE host (default 'root'):": "Root používateľ na PVE hostovi (predvolené 'root'):", "Rootfs size in GB": "Rootfs veľkosť v GB", "Rotate the recovery passphrase": "Zmeniť obnovovaciu frázu", "Routing Information": "Informácie o smerovaní", "Routing Table": "Smerovacia tabuľka", - "Rsnapshot is a filesystem snapshot utility based on rsync. rsnapshot makes it easy to make periodic snapshots of local machines, and remote machines over ssh. The code makes extensive use of hard links whenever possible, to greatly reduce the disk space required.": "Rsnapshot je nástroj pre snímky súborového systému založený na rync. rsnapshot uľahčuje vytváranie pravidelných snímok lokálnych strojov a diaľkových strojov nad ssh. Kód robí rozsiahle použitie tvrdých odkazov vždy, keď je to možné, výrazne znížiť miesto na disku required.", + "Rsnapshot is a filesystem snapshot utility based on rsync. rsnapshot makes it easy to make periodic snapshots of local machines, and remote machines over ssh. The code makes extensive use of hard links whenever possible, to greatly reduce the disk space required.": "Rsnapshot vytvára snímky súborového systému pomocou rsync. Uľahčuje pravidelné zálohovanie lokálnych aj vzdialených počítačov cez SSH. Všade, kde je to možné, používa pevné odkazy, čím výrazne znižuje potrebné miesto na disku.", "Run 'Mount NFS Share' to install NFS client automatically.": "Spustite 'Pripojiť NFS zdieľanie', aby sa NFS klient nainštaloval automaticky.", "Run 'Mount Samba Share' to install CIFS client automatically.": "Spustite 'Pripojiť Samba zdieľanie', aby sa CIFS klient nainštaloval automaticky.", - "Run GGUF LLMs locally with GPU acceleration": "Spustiť GGUF LLM lokálne s GPU zrýchlenia", + "Run GGUF LLMs locally with GPU acceleration": "Lokálne spúšťanie jazykových modelov GGUF so zrýchlením pomocou GPU", "Run Now": "Spustiť teraz", "Run PVE 8 to 9": "Spustiť PVE 8 na 9", "Run PVE 8 to 9 check": "Spustiť kontrolu PVE 8 na 9", @@ -5399,7 +5468,7 @@ "Run a full security audit": "Spustiť úplnú bezpečnostnú kontrolu", "Run a job now": "Spustiť úlohu teraz", "Run apt-get install -f to complete any pending package configurations": "Spustite apt-get install -f na dokončenie všetkých čakajúcich konfigurácií balíkov", - "Run as root on the Proxmox node; the registry contains private data": "Spustiť ako koreň na uzle Proxmox; register obsahuje súkromné údaje", + "Run as root on the Proxmox node; the registry contains private data": "Spustite pod používateľom root na uzle Proxmox; register obsahuje súkromné údaje", "Run as server or client? [s/c]:": "Spustiť ako server alebo klient? [s/c]:", "Run checklist again to verify upgrade:": "Spustite kontrolný zoznam znova na overenie aktualizácie:", "Run from console, or SSH inside tmux/screen": "Spustiť z konzoly alebo cez SSH vo vnútri tmux/screen", @@ -5427,7 +5496,7 @@ "Running dkms autoinstall for kernel": "Spúšťam dkms autoinstall pre kernel", "Running kernel:": "Spustené jadro:", "Running pre-upgrade simulation to verify 'proxmox-ve' will remain installed...": "Spúšťam simuláciu pred aktualizáciou, aby sa overilo, že 'proxmox-ve' zostane nainštalované...", - "RustDesk is a full-featured open source remote control alternative for self-hosting and security with minimal configuration.": "RustDesk je plne funkčné open source diaľkové ovládanie alternatívu pre self-hosting a bezpečnosť s minimálnou konfiguráciou.", + "RustDesk is a full-featured open source remote control alternative for self-hosting and security with minimal configuration.": "RustDesk je plnohodnotný nástroj na vzdialené ovládanie s otvoreným zdrojovým kódom, vlastným serverom, dôrazom na bezpečnosť a minimálnym nastavovaním.", "SATA (standard - high compatibility)": "SATA (štandard - vysoká kompatibilita)", "SCSI (recommended for Linux and Windows)": "SCSI (odporúčané pre Linux a Windows)", "SCSI (recommended for Linux)": "SCSI (odporúčané pre Linux)", @@ -5460,8 +5529,8 @@ "STEP 9: Cleanup (LVM only)": "KROK 9: čistenie (iba LVM)", "STORAGE TYPE IDENTIFICATION:": "ROZPOZNANIE TYPU ÚLOŽISKA:", "SUGGESTION FOR": "NÁVRH PRE", - "SWAG serves HTTPS on port 443. Plain HTTP on port 80 is disabled in /config/nginx/site-confs/default.conf.": "SWAG slúži HTTPS na porte 443. Plain HTTP na porte 80 je vypnutý v /config/nginx/site-confs/default.conf.", - "Sabnzbd makes Usenet as simple and streamlined as possible by automating everything we can. All you have to do is add an .nzb. SABnzbd takes over from there, where it will be automatically downloaded, verified, repaired, extracted and filed away with zero human interaction.": "Sabnzbd robí Usenet tak jednoduché a efektívne, ako je to možné automatizáciou všetko, čo môžeme. Všetko, čo musíte urobiť, je pridať .nzb. SABnzbd preberá odtiaľ, kde bude automaticky stiahnutá, overená, opravená, extrahovaná a podaná preč s nulovou ľudskou interakciou.", + "SWAG serves HTTPS on port 443. Plain HTTP on port 80 is disabled in /config/nginx/site-confs/default.conf.": "SWAG poskytuje HTTPS na porte 443. Nešifrované HTTP na porte 80 je vypnuté v /config/nginx/site-confs/default.conf.", + "Sabnzbd makes Usenet as simple and streamlined as possible by automating everything we can. All you have to do is add an .nzb. SABnzbd takes over from there, where it will be automatically downloaded, verified, repaired, extracted and filed away with zero human interaction.": "SABnzbd zjednodušuje používanie Usenetu automatizáciou všetkých krokov. Stačí pridať súbor .nzb a SABnzbd obsah automaticky stiahne, overí, opraví, rozbalí a uloží bez ďalšieho zásahu používateľa.", "Safe design: no automatic ACL/ownership mutation on host or CT.": "Bezpečný návrh: bez automatickej zmeny ACL alebo vlastníctva na hostovi či v CT.", "Safe to apply now": "Bezpečné použiť teraz", "Safety Backup": "Bezpečnostná záloha", @@ -5519,14 +5588,14 @@ "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", "Saving the new configuration of the application...": "Ukladá sa nová konfigurácia aplikácie...", "Saving the new configuration...": "Ukladanie novej konfigurácie...", "Saving the record of the application...": "Ukladá sa záznam aplikácie...", - "Saving the stack records...": "Ukladám zásobníky...", + "Saving the stack records...": "Ukladám záznamy kontajnerov aplikácie...", "Scan storage for new content": "Vyhľadať nový obsah v úložisku", "Scanning available physical disks...": "Hľadám dostupné fyzické disky...", "Scanning network for NFS servers...": "Prehľadávam sieť a hľadám NFS servery...", @@ -5538,15 +5607,16 @@ "Scheduled backup job created": "Naplánovaná úloha zálohy bola vytvorená", "Scheduled backup jobs": "Naplánované úlohy záloh", "Scheduled backups and retention policies": "Naplánované zálohy a pravidlá uchovávania", + "Scheduled run: no questions; stops where a person has to decide": "Plánovaný beh bez otázok; zastaví sa pri potrebe rozhodnutia používateľa", "Scheduled tasks (cron)": "Naplánované úlohy (cron)", "Scheduler script not found:": "Skript plánovača sa nenašiel:", "ScreenScraper": "ScreenScraper", "ScreenScraper password": "Heslo ScreenScrapera", - "ScreenScraper username": "Užívateľské meno screenScrapera", + "ScreenScraper username": "Používateľské meno ScreenScraper", "Script Information": "Informácie o skripte", "Script not found:": "Skript sa nenašiel:", "Scripts in": "Skripty v kategórii", - "ScummVM is a program which allows you to run certain classic graphical adventure and role-playing games, provided you already have their data files. The clever part about this: ScummVM just replaces the executables shipped with the games, allowing you to play them on systems for which they were never designed! ScummVM is a complete rewrite of these games' executables and is not an emulator.": "ScummVM je program, ktorý vám umožní spustiť určité klasické grafické dobrodružstvo a hranie rolí za predpokladu, že už máte ich dátové súbory. Inteligentná časť o tom: ScummVM práve nahrádza spustiteľné materiály dodávané s hrami, čo vám umožní hrať je na systémoch, pre ktoré neboli nikdy navrhnuté! ScummVM je kompletný prepis týchto hier 'spustiteľné a nie je emulátor.", + "ScummVM is a program which allows you to run certain classic graphical adventure and role-playing games, provided you already have their data files. The clever part about this: ScummVM just replaces the executables shipped with the games, allowing you to play them on systems for which they were never designed! ScummVM is a complete rewrite of these games' executables and is not an emulator.": "ScummVM umožňuje spúšťať vybrané klasické grafické adventúry a hry na hrdinov, ak už máte ich dátové súbory. Nahrádza pôvodné spustiteľné súbory hier, takže ich možno hrať aj na systémoch, pre ktoré neboli navrhnuté. Je úplným prepisom ich herných programov, nie emulátorom.", "Sealskin is a self-hosted, client-server platform that enables users to run powerful, containerized desktop applications streamed directly to a web browser. It uses a browser extension to intercept user actions—such as clicking a link or downloading a file and redirects them to a secure, isolated application environment running on a remote server.": "Sealskin je self-hosted, klient-server platforma, ktorá umožňuje užívateľom spustiť výkonné, kontajnerové desktopové aplikácie streamované priamo do webového prehliadača. Používa rozšírenie prehliadača na zachytenie užívateľských akcií, ako je kliknutie na odkaz alebo stiahnutie súboru a presmeruje ich na bezpečné, izolované aplikačné prostredie bežiace na vzdialenom serveri.", "Search": "Hľadať", "Search Results for:": "Výsledky hľadania pre:", @@ -5563,7 +5633,7 @@ "Security Updates": "Bezpečnostné aktualizácie", "Security Warning — read before applying": "Bezpečnostné upozornenie - prečítajte pred použitím", "Security directive outside the dynamic profile": "Bezpečnostná smernica mimo dynamického profilu", - "Security relaxation declined": "Uvoľnenie zabezpečenia sa znížilo", + "Security relaxation declined": "Uvoľnenie bezpečnostných obmedzení bolo odmietnuté", "See": "Pozrite", "See /tmp/proxmenux-mount.log for details.": "Podrobnosti nájdete v /tmp/proxmenux-mount.log.", "Seerr WebUI": "Seerr WebUI", @@ -5631,8 +5701,8 @@ "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 suite application": "Vyberte aspoň jednu aplikáciu suite", + "Select at least one stack container": "Vyberte aspoň jeden kontajner aplikácie", + "Select at least one suite application": "Vyberte aspoň jednu aplikáciu zostavy", "Select authentication mode:": "Vyberte spôsob prihlásenia:", "Select authentication type:": "Vyberte typ prihlásenia:", "Select available Controllers/NVMe to add:": "Vyberte dostupné Controllery/NVMe na pridanie:", @@ -5643,7 +5713,7 @@ "Select backup profile:": "Vyberte profil zálohy:", "Select backup to restore": "Vyberte zálohu na obnovu", "Select backup to restore:": "Vyberte zálohu na obnovu:", - "Select bridge for network interface(s):": "Vyberte bridge pre sieťové rozhrania:", + "Select bridge for network interface(s):": "Vyberte sieťový most (bridge) pre sieťové rozhrania:", "Select compression:": "Vyberte kompresiu:", "Select container:": "Vyberte kontajner:", "Select content types for this storage:": "Vyberte typy obsahu pre toto úložisko:", @@ -5734,7 +5804,7 @@ "Selected LXC action": "Vybraná LXC akcia", "Selected VM": "Vybraná VM", "Selected VM action": "Vybraná VM akcia", - "Selected bridge:": "Vybraný bridge:", + "Selected bridge:": "Vybraný sieťový most (bridge):", "Selected container": "Vybraný kontajner", "Selected controller/NVMe is already assigned to other VM(s):": "Vybraný Controller/NVMe už je priradený k iným VM:", "Selected device is already assigned to other VM(s):": "Vybrané zariadenie už je priradené k iným VM:", @@ -5743,18 +5813,18 @@ "Selected paths produced no entries to apply.": "Vybrané cesty nevytvorili žiadne položky na použitie.", "Selected utilities installation completed": "Inštalácia vybraných nástrojov je dokončená", "Selection": "Výber", - "Self-custodial Bitcoin Lightning wallet with integrated node and app connections.": "Samoobsluha Bitcoin Lightning peňaženka s integrovaným uzlom a pripojenie aplikácií.", - "Self-hosted ZeroTier network controller with web UI for centralized management.": "Samo-hostiteľom ZeroTier sieťový regulátor s web UI pre centralizované riadenie.", - "Self-hosted cloud data migration & sync manager": "Self-hosted cloud dát Migrácia a synchronizácia manažéra", - "Self-hosted collaborative bookmark manager to collect, read, annotate, and fully preserve what matters, all in one place.": "Self-hosted kolaboratívne záložky manažér zbierať, čítať, anotovať, a plne zachovať to, na čom záleží, všetko na jednom mieste.", - "Self-hosted file sharing with a modern web interface": "Samoobsluha zdieľania súborov s moderným webovým rozhraním", - "Self-hosted file toolkit for images, video, audio, PDFs, and files": "Súborový súbor s vlastným hostovaním pre obrázky, video, audio, PDF a súbory", - "Self-hosted internet archiving solution": "Samoobslužné riešenie archivácie internetu", - "Self-hosted recipe manager and meal planner": "Self-hosted recept manažér a jedlo plánovač", + "Self-custodial Bitcoin Lightning wallet with integrated node and app connections.": "Peňaženka Bitcoin Lightning s vlastnou správou prostriedkov, integrovaným uzlom a pripojením aplikácií.", + "Self-hosted ZeroTier network controller with web UI for centralized management.": "Sieťový kontrolér ZeroTier na vlastnom serveri s webovým rozhraním na centrálnu správu.", + "Self-hosted cloud data migration & sync manager": "Správca migrácie a synchronizácie cloudových údajov na vlastnom serveri", + "Self-hosted collaborative bookmark manager to collect, read, annotate, and fully preserve what matters, all in one place.": "Spoločný správca záložiek na vlastnom serveri na zhromažďovanie, čítanie, komentovanie a úplné uchovávanie dôležitého obsahu na jednom mieste.", + "Self-hosted file sharing with a modern web interface": "Zdieľanie súborov na vlastnom serveri s moderným webovým rozhraním", + "Self-hosted file toolkit for images, video, audio, PDFs, and files": "Súprava nástrojov na vlastnom serveri na prácu s obrázkami, videom, zvukom, PDF a ďalšími súbormi", + "Self-hosted internet archiving solution": "Riešenie na archiváciu internetového obsahu na vlastnom serveri", + "Self-hosted recipe manager and meal planner": "Správca receptov a plánovač jedál na vlastnom serveri", "Self-hosted software development service": "Služba na vývoj softvéru s vlastným hostovaním", "Self-signed TLS certificate created:": "Vytvorený samopodpísaný certifikát TLS:", - "Selfhosted PDF manager, viewer and editor": "Selfhosted PDF manažér, prehliadač a editor", - "Selkies desktop and streaming acceleration": "Selkies plocha a streamovanie zrýchlenie", + "Selfhosted PDF manager, viewer and editor": "Správca, prehliadač a editor PDF na vlastnom serveri", + "Selkies desktop and streaming acceleration": "Zrýchlenie pracovnej plochy a streamovania Selkies", "Sending backup to Borg repository...": "Odosielam zálohu do Borg repozitára...", "Sending backup to PBS...": "Odosielam zálohu do PBS...", "Server": "Server", @@ -5792,10 +5862,10 @@ "Set VLAN (leave empty for none)": "Zadajte VLAN (nechajte prázdne, ak sa nemá použiť)", "Set VM boot order": "Nastaviť poradie bootovania VM", "Set Virtual Machine ID": "Zadať ID virtuálnej mašiny", - "Set a Bridge": "Zadať bridge", + "Set a Bridge": "Nastaviť sieťový most (bridge)", "Set a MAC Address": "Zadať MAC adresu", "Set a Vlan(leave blank for default)": "Zadať VLAN (nechajte prázdne pre predvolené)", - "Set network bridge (default: vmbr0)": "Zadajte sieťový bridge (predvolené: vmbr0)", + "Set network bridge (default: vmbr0)": "Zadajte sieťový most (bridge) (predvolené: vmbr0)", "Set ownership and permissions:": "Nastaviť vlastníka a oprávnenia:", "Set this disk as the primary boot disk?": "Nastaviť tento disk ako hlavný bootovací disk?", "Set up custom MOTD banner": "Nastaviť vlastnú MOTD správu", @@ -5821,7 +5891,7 @@ "Share added successfully.": "Zdieľanie bolo úspešne pridané.", "Share deleted and Samba service restarted.": "Zdieľanie bolo vymazané a služba Samba reštartovaná.", "Share exists:": "Zdieľanie existuje:", - "Share folders automatically (true or false)": "Automatické zdieľanie priečinkov (pravda alebo nepravda)", + "Share folders automatically (true or false)": "Automaticky zdieľať priečinky (true alebo false)", "Share name:": "Názov zdieľania:", "Share not found on server:": "Zdieľanie sa na serveri nenašlo:", "Share path:": "Cesta zdieľania:", @@ -5832,18 +5902,18 @@ "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 directories (not included in Proxmox backups)": "Zdieľané adresáre hostiteľa (nie sú zahrnuté do záloh Proxmoxu)", + "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 host media directory": "Zdieľaný adresár médií na hostiteľovi", "Shared memory size for the GPU workload in MB": "Zdieľaná veľkosť pamäte pre pracovné zaťaženie GPU v MB", "Sharedfiles group already exists (GID: 101000)": "Skupina sharedfiles už existuje (GID: 101000)", "Shares found:": "Nájdené zdieľania:", @@ -5880,7 +5950,7 @@ "Show active firewall rules (iptables)": "Zobraziť aktívne pravidlá firewallu (iptables)", "Show all active mounts from the kernel": "Zobraziť všetky aktívne pripojenia z kernelu", "Show available Proxmox upgrades": "Zobraziť dostupné aktualizácie Proxmoxu", - "Show configured network bridges": "Zobraziť nastavené sieťové bridge", + "Show configured network bridges": "Zobraziť nastavené sieťové mosty (bridge)", "Show container configuration. Use the correct ": "Zobraziť nastavenie kontajnera. Použite správne ", "Show detailed keyfile info": "Zobraziť podrobné informácie o keyfile", "Show disk usage by mount point": "Zobraziť využitie diskov podľa bodu pripojenia", @@ -5897,23 +5967,24 @@ "Show standard exclude patterns": "Zobraziť štandardné vylučovacie vzory", "Show status of all storage pools": "Zobraziť stav všetkých úložísk", "Show the QR code of a peer again with: pct exec -- /app/show-peer 1": "Zobraziť QR kód peera znovu s: pct exec -- /app/show-peer 1", + "Show the summary of a template": "Zobraziť súhrn šablóny", "Show traffic statistics per interface": "Zobraziť štatistiky prenosu podľa rozhrania", "Show vzdump backup configuration": "Zobraziť nastavenie vzdump záloh", "Shows status and type (nfs/cifs/dir/iscsi...).": "Zobrazí stav a typ (nfs/cifs/dir/iscsi...).", "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", + "SickGear provides management of TV shows and/or Anime, it detects new episodes, links downloader apps, and more..": "SickGear spravuje televízne seriály a anime, rozpoznáva nové epizódy a prepája sa s aplikáciami na sťahovanie.", + "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.", - "Simple and easy to use DDNS": "Jednoduché a jednoduché použitie DDNS", + "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": "Jednoducho použiteľné dynamické DNS (DDNS)", "Single GPU Warning": "Upozornenie na jednu GPU", "Single target found — selected automatically:": "Našiel sa jeden target - vybraný automaticky:", "Size": "Veľkosť", - "Size in GB of": "Veľkosť v GB", - "Size of each consume/export volume in GB": "Veľkosť každého spotrebovaného/vývozného objemu v GB", + "Size in GB of": "Veľkosť v GB pre", + "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ť:", @@ -5925,7 +5996,7 @@ "Skip — leave as-is": "Preskočiť - nechať bez zmeny", "Skipped (no disks of the pool are present on this host):": "Preskočené (na tomto hostovi nie sú prítomné žiadne disky poolu):", "Skipped (some disks missing):": "Preskočené (niektoré disky chýbajú):", - "Skipped because Jellyfin did not create encoding.xml:": "Preskočené, pretože Jellyfin nevytvoril kódovanie.xml:", + "Skipped because Jellyfin did not create encoding.xml:": "Preskočené, pretože Jellyfin nevytvoril encoding.xml:", "Skipped device": "Zariadenie bolo preskočené", "Skipped to protect target system (would cascade-remove packages)": "Preskočené na ochranu cieľového systému (odstránilo by to ďalšie balíky)", "Skipped, not in apt cache:": "Preskočené, nie je v apt cache:", @@ -5934,10 +6005,10 @@ "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é.", - "Sleek podcast downloader with GPodder sync": "Sleek podcast downloader s GPodder synchronizácia", + "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": "Prehľadný nástroj na sťahovanie podcastov so synchronizáciou GPodder", "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.", + "Smokeping keeps track of your network latency. For a full example of what this application is capable of visit UCDavis.": "SmokePing sleduje latenciu siete. Ukážku jeho možností nájdete na stránke UCDavis.", "SnapOtter": "SnapOtter", "Snapshot - no downtime (recommended)": "Snímka – žiadne prestoje (odporúča sa)", "Snippets — hook scripts / config": "Snippets — hook skripty / konfigurácia", @@ -5959,7 +6030,7 @@ "Some utility packages could not be removed; the remaining list has been preserved": "Niektoré balíky nástrojov nebolo možné odstrániť;zostávajúci zoznam sa zachoval", "Something is already mounted at": "Niečo už je pripojené v", "Something is already mounted at:": "Niečo už je pripojené v:", - "Sonarr (formerly NZBdrone) is a PVR for usenet and bittorrent users. It can monitor multiple RSS feeds for new episodes of your favorite shows and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available.": "Sonarr (predtým NZBdrone) je PVR pre užívateľov usenet a bittorrent. To môže sledovať viac RSS kanálov pre nové epizódy vašich obľúbených show a bude chytiť, triediť a premenovať ich. Môže byť tiež nakonfigurovaný tak, aby automaticky upgrade kvality súborov už stiahnutých, keď je k dispozícii kvalitnejší formát.", + "Sonarr (formerly NZBdrone) is a PVR for usenet and bittorrent users. It can monitor multiple RSS feeds for new episodes of your favorite shows and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available.": "Sonarr (predtým NZBdrone) je správca seriálov pre používateľov Usenetu a BitTorrentu. Sleduje RSS kanály s novými epizódami obľúbených seriálov a automaticky ich získava, triedi a premenúva. Dokáže tiež nahradiť už stiahnuté súbory kvalitnejšou verziou, keď sa objaví.", "Sonarr added to Prowlarr": "Sonarr pridaný do Prowlarr", "Sonarr connected to qBittorrent": "Sonarr napojený na qBittorrent", "Sonarr root folder configured": "Konfigurovaný koreňový priečinok Sonarr", @@ -5972,25 +6043,25 @@ "Specific host (enter IP)": "Konkrétny host (zadať IP)", "Specific subnet (enter manually)": "Konkrétna podsieť (zadať ručne)", "Speedtest Tracker web interface": "Webové rozhranie Speedtest Tracker", - "Speedtest-tracker is a self-hosted internet performance tracking application that runs speedtest checks against Ookla's Speedtest service.": "Speedtest-tracker je self-hosted internetové sledovanie výkonu aplikácie, ktorá beží rýchlostnú kontrolu proti Ookla je Speedtest služby.", - "Spotube is an open source, cross-platform Spotify client compatible across multiple platforms utilizing Spotify's data API and YouTube, Piped.video or JioSaavn as an audio source, eliminating the need for Spotify Premium": "Spotube je open source, cross-platform Spotify klient kompatibilný vo viacerých platformách využívajúce dáta spoločnosti Spotify API a YouTube, Piped. video alebo JioSaavn ako audio zdroj, odstránenie potreby Spotify Premium", + "Speedtest-tracker is a self-hosted internet performance tracking application that runs speedtest checks against Ookla's Speedtest service.": "Speedtest Tracker je aplikácia na vlastnom serveri na sledovanie výkonu internetového pripojenia pomocou meraní služby Ookla Speedtest.", + "Spotube is an open source, cross-platform Spotify client compatible across multiple platforms utilizing Spotify's data API and YouTube, Piped.video or JioSaavn as an audio source, eliminating the need for Spotify Premium": "Spotube je multiplatformový klient Spotify s otvoreným zdrojovým kódom. Využíva dátové API Spotify a zvuk získava z YouTube, Piped.video alebo JioSaavn, takže nevyžaduje Spotify Premium.", "Stable (main branch)": "Stabilná verzia (vetva main)", "Stable monitor service normalized.": "Služba Monitora pre stabilnú verziu je upravená.", "Stack": "Stack", - "Stack adapter not recognized by the translator": "Stack adaptér nerozpoznal prekladateľ", + "Stack adapter not recognized by the translator": "Nástroj na prevod nerozpoznal adaptér zostavy", "Stack backups are missing; a partial restore is not allowed": "Chýbajú zálohy, čiastočná obnova nie je povolená.", - "Stack checked:": "Stack skontrolovaný:", - "Stack members are missing; recreate them after verifying their volumes": "Chýbajú členovia Stack; znovu ich vytvoriť po overení ich objemov", - "Stack members are updated together with their stack": "Členovia Stack sú aktualizované spolu s ich stack", - "Stack name": "Názov zásobníka", - "Stack records restored": "Stack záznamy obnovené", - "Stack records saved": "Uložené Stack záznamy", - "Stack records saved; no container was reinstalled.": "Stack záznamy uložené; žiadny kontajner bol znovu nainštalovaný.", - "Stack recovery completed; every member is back to its previous installation.": "Stack recovery dokončené; každý člen je späť do svojej predchádzajúcej inštalácie.", - "Stack recreation completed. Data kept.": "Opätovné vytvorenie stacku je hotové. Dáta zostali zachované.", - "Stack startup hook installed": "Nainštalovaný štartovací hák Stack", - "Stack stopped": "Stack zastavil", - "Stack update completed. Data kept.": "Aktualizácia Stack dokončená. Údaje uchovávané.", + "Stack checked:": "Aplikácia je skontrolovaná:", + "Stack members are missing; recreate them after verifying their volumes": "Chýbajú kontajnery aplikácie; znova ich vytvorte až po overení ich dátových zväzkov", + "Stack members are updated together with their stack": "Kontajnery zostavy sa aktualizujú spoločne s celou zostavou", + "Stack name": "Názov zostavy", + "Stack records restored": "Záznamy všetkých kontajnerov aplikácie sú obnovené", + "Stack records saved": "Záznamy kontajnerov aplikácie sú uložené", + "Stack records saved; no container was reinstalled.": "Záznamy zostavy boli uložené; žiadny kontajner nebol preinštalovaný.", + "Stack recovery completed; every member is back to its previous installation.": "Obnova celej aplikácie je dokončená; všetky jej kontajnery sa vrátili k predchádzajúcej inštalácii.", + "Stack recreation completed. Data kept.": "Opätovné vytvorenie kontajnerov aplikácie je dokončené. Údaje zostali zachované.", + "Stack startup hook installed": "Spúšťací skript zostavy je nainštalovaný", + "Stack stopped": "Kontajnery aplikácie sú zastavené", + "Stack update completed. Data kept.": "Aktualizácia aplikácie je dokončená. Údaje zostali zachované.", "Stack:": "Stack:", "Staging directory:": "Prípravný priečinok:", "Staging ready.": "Prípravný priečinok je pripravený.", @@ -6005,7 +6076,7 @@ "Start VM after creation?": "Spustiť VM po vytvorení?", "Start a container. Use the correct ": "Spustiť kontajner. Použite správne ", "Start a virtual machine. Use the correct ": "Spustiť VM. Použite správne ", - "Start each LXC with Proxmox (no coordinated startup)": "Začnite každý LXC s Proxmox (bez koordinovaného štartu)", + "Start each LXC with Proxmox (no coordinated startup)": "Spúšťať každý kontajner LXC spolu s Proxmoxom (bez koordinovaného spustenia)", "Start long self-test (hours)": "Spustiť dlhý samotest (hodiny)", "Start long test now?": "Spustiť dlhý test teraz?", "Start on boot already disabled for VM": "Štart pri boote je už pre VM vypnutý", @@ -6021,11 +6092,11 @@ "Start the LXC when finished to apply the selected configuration?": "Spustiť LXC po dokončení pre použitie zvolenej konfigurácie?", "Start the VM": "Spustiť VM", "Start the VM to begin Windows installation from the mounted ISO.": "Spustite VM a začnite inštaláciu Windowsu z pripojeného ISO.", - "Start the applications once they are registered? Answer No if the original containers are still running on another host: both would use the same addresses.": "Spustiť aplikácie po ich zaregistrovaní? Odpoveď Nie, ak pôvodné kontajnery stále bežia na inom hostiteľovi: oba by používali rovnaké adresy.", + "Start the applications once they are registered? Answer No if the original containers are still running on another host: both would use the same addresses.": "Spustiť aplikácie po ich opätovnej registrácii? Ak pôvodné kontajnery stále bežia na inom serveri, vyberte Nie. Obe inštalácie by používali rovnaké adresy.", "Start the converted container:": "Spustiť prevedený kontajner:", "Start the interactive Proxmox package upgrade": "Spustiť interaktívnu aktualizáciu balíkov Proxmoxu", "Start the main system upgrade:": "Spustite hlavnú aktualizáciu systému:", - "Start the stack with Proxmox": "Spustiť zásobník s Proxmox", + "Start the stack with Proxmox": "Spúšťať zostavu spolu s Proxmoxom", "Start uploading to PBS — sets a recovery passphrase": "Spustiť nahrávanie do PBS - nastaví obnovovaciu frázu", "Start when finished": "Spustiť po dokončení", "Start with Proxmox": "Spúšťať spolu so spustením Proxmoxu", @@ -6056,8 +6127,8 @@ "Starting the main container and its dependencies...": "Spustenie hlavného kontajnera a jeho závislosti...", "Starting the service:": "Spustenie služby:", "Starting unprivileged container...": "Spúšťam neprivilegovaný kontajner...", - "Startup: coordinated by the stack startup hook": "Štartovanie: koordinované stack štartovacím hákom", - "Startup: independent, without hookscript": "Spustenie: nezávislé, bez skriptu", + "Startup: coordinated by the stack startup hook": "Spúšťanie: koordinované spúšťacím skriptom zostavy", + "Startup: independent, without hookscript": "Spúšťanie: samostatné, bez hookscript", "Static IP": "Statické IP", "Static IPv4 address": "Statická IPv4 adresa", "Static IPv4 address for": "Statická IPv4 adresa pre", @@ -6075,7 +6146,7 @@ "Stop that VM, then choose:": "Zastavte VM a potom vyberte:", "Stop the CT, unmount the disk on the HOST, and remount with:": "Zastavte CT, odpojte disk na HOSTE a pripojte ho znova pomocou:", "Stop the VM/CT before formatting this disk.": "Pred formátovaním tohto disku zastavte VM/CT.", - "Stop the container before the NVIDIA refresh": "Zastavte nádobu pred obnovou NVIDIA", + "Stop the container before the NVIDIA refresh": "Pred obnovením NVIDIA zastavte kontajner", "Stop the container if it's running:": "Ak kontajner beží, zastavte ho:", "Stop them first and run this script again.": "Najprv ich zastavte a potom spustite skript znova.", "Stop uploading to PBS": "Zastaviť nahrávanie do PBS", @@ -6095,7 +6166,7 @@ "Stopping the container before applying configuration...": "Pred použitím nastavenia zastavujem kontajner...", "Stopping the container before conversion...": "Pred prevodom zastavujem kontajner...", "Stopping the container...": "Zastavujem kontajner...", - "Stopping the stack...": "Zastavujem kopu...", + "Stopping the stack...": "Zastavujem všetky kontajnery aplikácie...", "Storage": "Úložisko", "Storage & Share Manager": "Úložiská a zdieľanie", "Storage Added:": "Úložisko bolo pridané:", @@ -6111,21 +6182,21 @@ "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", - "Storage for rootfs": "Skladovanie pre rootfs", - "Storage for rootfs and private configuration": "Skladovanie pre rootfs a súkromné konfigurácie", + "Storage for rootfs": "Úložisko pre koreňový súborový systém", + "Storage for rootfs and private configuration": "Úložisko pre koreňový súborový systém a súkromné nastavenia", "Storage for staticfiles": "Úložisko pre statické súbory", - "Storage for the Immich library": "Sklad pre knižnicu Immich", - "Storage for the Nextcloud data": "Skladovanie údajov Nextcloud", + "Storage for the Immich library": "Úložisko pre knižnicu Immich", + "Storage for the Nextcloud data": "Úložisko pre údaje Nextcloud", "Storage for the OCI image cache": "Úložisko pre vyrovnávaciu pamäť obrazu OCI", "Storage for the backup of this operation": "Úložisko pre zálohu tejto operácie", "Storage for the consume and export folders": "Skladovanie pre konzumné a exportné priečinky", "Storage for the container and its data": "Úložisko pre kontajner a jeho údaje", "Storage for the containers and their data": "Úložisko pre kontajnery a ich údaje", - "Storage for the persistent configuration": "Skladovanie pre trvalú konfiguráciu", + "Storage for the persistent configuration": "Úložisko pre trvalé nastavenia", "Storage is now available in Proxmox web interface under Datacenter > Storage": "Úložisko je teraz dostupné vo webovom rozhraní Proxmoxu v časti Datacenter > Storage", "Storage plan selection cancelled.": "Výber plánu úložiska bol zrušený.", "Storage plan selection failed or cancelled": "Výber plánu úložiska zlyhal alebo bol zrušený", @@ -6134,22 +6205,23 @@ "Stored Credentials:": "Uložené prihlasovacie údaje:", "Stored credentials:": "Uložené prihlasovacie údaje:", "Stremio is a modern media center that gives you the freedom to watch everything you want.": "Stremio je moderné mediálne centrum, ktoré vám dáva slobodu sledovať všetko, čo chcete.", - "Subdomains for the certificate, comma separated (wildcard for *.domain)": "Subdomény pre osvedčenie, čiarka oddelené (divoká karta pre *.doména)", + "Subdomains for the certificate, comma separated (wildcard for *.domain)": "Subdomény pre certifikát oddelené čiarkami (wildcard pre *.domain)", "Subnet": "Podsieť", "Subscription banner removal failed": "Odstránenie bannera odberu zlyhalo", "Subscription banner removed successfully": "Banner predplatného bol úspešne odstránený", "Subscription banner restored successfully (desktop and mobile)": "Hlásenie o predplatnom bolo úspešne obnovené (desktop aj mobil)", + "Subscription status is not unambiguously active, notfound or expired. Check proxmox-backup-manager subscription get locally; no repository changed.": "Stav predplatného nie je jednoznačne active, notfound alebo expired. Overte ho lokálne príkazom proxmox-backup-manager subscription get; žiadny repozitár sa nezmenil.", "Success": "Úspech", "Successful": "Úspešné", - "Supervisor does not confirm healthy and supported yet": "Dozorca zatiaľ nepotvrdil zdravie a podporu", - "Supervisor reports no connectivity; retrying to get versions and install components": "Supervízor nenahlási žiadnu konektivitu; znovu sa snaží získať verzie a inštalovať komponenty", + "Supervisor does not confirm healthy and supported yet": "Supervisor zatiaľ nepotvrdzuje zdravý a podporovaný stav", + "Supervisor reports no connectivity; retrying to get versions and install components": "Supervisor hlási neprítomnosť pripojenia; opakuje sa zisťovanie verzií a inštalácia komponentov", "Supported formats: .img, .qcow2, .vmdk, .raw": "Podporované formáty: .img, .qcow2, .vmdk, .raw", "Suspend - pauses the guest during backup": "Suspend – pozastaví hosťa počas zálohovania", "Swap": "Swap", "Swap in MB": "Swap v MB", "Swap partition detected": "Zistený swap oddiel", "Swappiness configuration created successfully": "Nastavenie swappiness bolo úspešne vytvorené", - "Swing Music is a beautifully designed, self-hosted music streaming server. Like a cooler Spotify ... but bring your own music.": "Swing Music je krásne navrhnutý, self-hosted hudobný streaming server. Ako cooler Spotify ... ale priniesť si vlastnú hudbu.", + "Swing Music is a beautifully designed, self-hosted music streaming server. Like a cooler Spotify ... but bring your own music.": "Swing Music je hudobný streamovací server s pekným rozhraním, ktorý si môžete prevádzkovať sami. Podobá sa Spotify, ale používa vašu vlastnú hudobnú zbierku.", "Switch GPU Mode (VM <-> LXC)": "Prepnúť režim GPU (VM <-> LXC)", "Switch Mode": "Zmena režimu", "Switch Script Not Found": "Skript na prepnutie sa nenašiel", @@ -6161,12 +6233,12 @@ "Switching to GPU -> VM mode requires exclusive VFIO binding.": "Prepnutie do režimu GPU -> VM vyžaduje výhradné VFIO naviazanie.", "Symbolic link in a restored volume path": "Symbolické spojenie v obnovenej ceste zväzku", "Symbolic link in the path of an adaptation": "Symbolický odkaz na ceste adaptácie", - "Symbolic link loop in the new image": "Symbolická slučka na novom obrázku", - "Symbolic link outside the rootfs of the new image": "Symbolický odkaz mimo rootfs nového obrázku", + "Symbolic link loop in the new image": "Slučka symbolických odkazov v novom obraze", + "Symbolic link outside the rootfs of the new image": "Symbolický odkaz smeruje mimo koreňového súborového systému nového obrazu", "Synchronize time automatically": "Automaticky synchronizovať čas", "Synclounge is a third party tool that allows you to watch Plex in sync with your friends/family, wherever you are.": "Synclounge je nástroj tretej strany, ktorý umožňuje sledovať Plex v synchronizácii so svojimi priateľmi / rodinou, kdekoľvek ste.", "Syncthing replaces proprietary sync and cloud services with something open, trustworthy and decentralized. Your data is your data alone and you deserve to choose where it is stored, if it is shared with some third party and how it's transmitted over the Internet.": "Syncthing nahrádza proprietárnu synchronizáciu a cloudové služby niečím otvoreným, dôveryhodným a decentralizovaným. Vaše údaje sú len vaše údaje a zaslúžite si vybrať, kde sú uložené, ak sú zdieľané s nejakou treťou stranou a ako sa prenášajú cez internet.", - "Sysctl not namespaced or not valid:": "Sysctl nie je menovaný alebo neplatný:", + "Sysctl not namespaced or not valid:": "Nastavenie sysctl nie je oddelené menným priestorom alebo je neplatné:", "System": "Systém", "System CLI Tools": "Systémové CLI nástroje", "System Disk Size (GB)": "Veľkosť systémového disku (GB)", @@ -6187,6 +6259,7 @@ "System path mounts are not yet supported": "Pripojenie systémovej cesty ešte nie je podporované", "System reboot required": "Vyžaduje sa reštart systému", "System upgrade completed": "Aktualizácia systému je dokončená", + "System upgrade failed. Check log:": "Aktualizácia systému zlyhala. Skontrolujte denník:", "System uptime": "Doba behu systému", "Systemd ulimits set": "systemd ulimits sú nastavené", "TCP BBR configuration created successfully": "Nastavenie TCP BBR bolo úspešne vytvorené", @@ -6216,11 +6289,11 @@ "Target server:": "Cieľový server:", "Target:": "Target:", "Tautulli is a python based web application for monitoring, analytics and notifications for Plex Media Server.": "Tautulli je webová aplikácia založená na pythone pre monitorovanie, analýzu a oznámenia pre Plex Media Server.", - "Teable adopts a concise spreadsheet interface, yet creates powerful database applications": "Teable prijíma stručné tabuľkové rozhranie, ale vytvára výkonné databázové aplikácie", + "Teable adopts a concise spreadsheet interface, yet creates powerful database applications": "Teable umožňuje vytvárať výkonné databázové aplikácie cez jednoduché tabuľkové rozhranie", "Telegram is a cloud-based mobile and desktop messaging app.": "Telegram je mobilná a desktopová aplikácia na báze cloudových správ.", "Temporary data container:": "Dočasný dátový kontajner:", "Temporary login": "Dočasné prihlásenie", - "Temporary password retrieved": "Dočasné obnovenie hesla", + "Temporary password retrieved": "Dočasné heslo bolo získané", "Temporary working directory (if present):": "Dočasný pracovný priečinok (ak existuje):", "Terminal Multiplexers": "Terminálové multiplexery", "Terminal multiplexer (Ctrl+b then d to detach, or type exit)": "Terminálový multiplexer (Ctrl+b potom d na odpojenie, alebo napíšte exit)", @@ -6240,31 +6313,34 @@ "Testing connectivity to portal...": "Testujem pripojenie k portálu...", "Testing guest listing and share access on server": "Testovanie zoznamu hostí a zdieľania prístupu na serveri", "Testing network connectivity...": "Testujem sieťové pripojenie...", - "Text that new pads start with (empty = the text of the image)": "Text, s ktorým začínajú nové podložky (prázdne = text obrázku)", + "Text that new pads start with (empty = the text of the image)": "Počiatočný text nových dokumentov (prázdne = text dodaný v obraze)", "Thank you for using ProxMenux. Goodbye!": "Ďakujeme, že používate ProxMenux. Dovidenia!", "That VM is currently stopped, so the GPU can be reassigned now.": "Tá VM je momentálne zastavená, takže GPU sa teraz dá presunúť.", "That doesn't look like an SSH private key. Pick the private key file (no .pub extension, parseable by ssh-keygen).": "Toto nevyzerá ako súkromný SSH kľúč. Vyberte súbor súkromného kľúča (bez prípony .pub, čitateľný cez ssh-keygen).", - "The AMD GPU did not complete a test inference with ROCm": "AMD GPU nedokončil testovanie s ROCm", + "The AMD GPU did not complete a test inference with ROCm": "GPU AMD nedokončilo skúšobný výpočet pomocou ROCm", "The AMD driver does not offer its compute interface (/dev/kfd) on this host.": "Ovládač AMD neponúka svoje výpočtové rozhranie (/dev/kfd) na tomto hostiteľovi.", - "The AppArmor/seccomp relaxation does not include the required consent": "AppArmor/seccomp relaxácia nezahŕňa súhlas required", - "The Bookmark Everything App": "Záložka Všetko App", + "The AppArmor/seccomp relaxation does not include the required consent": "Uvoľnenie obmedzení AppArmor/seccomp nemá požadovaný súhlas", + "The Bookmark Everything App": "Aplikácia na ukladanie záložiek všetkého druhu", "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 document must be a mapping.": "Dokument Compose musí byť mapa kľúčov a hodnôt.", + "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 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", - "The Entrypoint/Cmd combination is empty": "Vstupný bod/Cmd combination je prázdny", + "The Compose file does not contain a Compose document": "Súbor neobsahuje dokument Compose", + "The Compose file has no services.": "Súbor Compose neobsahuje žiadne služby.", + "The Compose file has no x-casaos metadata.": "Súbor Compose neobsahuje metadáta x-casaos.", + "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.": "Súbor Compose ponúka voliteľné uvoľnenie obmedzení AppArmor alebo seccomp, ktoré zostane vypnuté, kým ho používateľ nevyberie. Pokračujte iba vtedy, ak obrazu dôverujete a riziko prijímate.", + "The Compose value must be text or a list:": "Hodnota Compose musí byť text alebo zoznam:", + "The DRM node is not an Intel or AMD GPU; NVIDIA requires its library profile": "Uzol DRM nie je GPU Intel ani AMD; NVIDIA vyžaduje profil so svojimi knižnicami", + "The Entrypoint/Cmd combination is empty": "Kombinácia Entrypoint/Cmd je prázdna", "The FUSE publication helper was not found": "Pomocník FUSE nebol nájdený", "The GPU evidence does not match the verified devices": "Dôkazy GPU nezodpovedajú overeným zariadeniam", "The GPU has been moved out of VM": "GPU bola presunutá mimo VM", "The GPU identity or permissions changed; the container is not modified": "Identita alebo povolenia GPU sa zmenili; kontajner sa nemení", "The GPU is being detached from VM": "GPU sa odpája z VM", - "The GPU vendor differs from the requested profile": "Predajca GPU sa líši od požadovaného profilu", + "The GPU vendor differs from the requested profile": "Výrobca GPU nezodpovedá požadovanému profilu", "The GPU vendor does not match the selected GPU profile:": "Dodávateľ GPU nezodpovedá zvolenému profilu GPU:", "The Immich CPU quota cannot be reproduced": "Kvóta Immich CPU nemôže byť reprodukovaná", "The Immich library needs at least 8 GB": "Knižnica Immich potrebuje aspoň 8 GB", @@ -6273,59 +6349,61 @@ "The LXC changed while reviewing; nothing was adopted": "LXC sa zmenil počas kontroly;nič nebolo prijaté", "The LXC could not be started.": "LXC sa nepodarilo spustiť.", "The LXC has no Bash to run this script with. The addon was not run.": "LXC nemá Bash na spustenie tohto skriptu. Doplnok nebol spustený.", - "The LXC has stopped": "LXC zastavil", + "The LXC has stopped": "Kontajner LXC sa zastavil", "The LXC is stopped. Do you want to start it to run the addon?": "LXC je zastavený. Chcete ho spustiť, aby sa spustil doplnok?", - "The Lounge starts in public mode: anyone who reaches the address opens the client without logging in, and the IRC networks added are lost when the session ends.": "Lounge začína vo verejnom režime: každý, kto dosiahne adresu otvorí klienta bez prihlásenia, a IRC siete pridané sú stratené po skončení sedenia.", + "The Lounge starts in public mode: anyone who reaches the address opens the client without logging in, and the IRC networks added are lost when the session ends.": "The Lounge začína vo verejnom režime: každý s prístupom na adresu otvorí klienta bez prihlásenia. Pridané siete IRC sa po skončení relácie stratia.", "The MAC address of the container cannot be kept": "Adresa MAC kontajnera sa nemôže uchovávať", "The NVIDIA Container Toolkit repository definition was empty.": "Definícia úložiska NVIDIA Container Toolkit bola prázdna.", "The NVIDIA Container Toolkit signing key could not be read.": "Nepodarilo sa prečítať podpisový kľúč súpravy NVIDIA Container Toolkit.", "The NVIDIA Container Toolkit version cannot be identified": "Verzia NVIDIA Container Toolkit sa nedá identifikovať", "The NVIDIA destination cannot be replaced": "Miesto určenia NVIDIA nemožno nahradiť", - "The NVIDIA destination escapes the rootfs": "Cieľ NVIDIA unikne koreňom", + "The NVIDIA destination escapes the rootfs": "Cieľ NVIDIA smeruje mimo koreňového súborového systému", "The NVIDIA driver is installed, but the Container Toolkit phase did not complete. GPU support for OCI containers is unavailable until it does.": "Ovládač NVIDIA je nainštalovaný, ale fáza Container Toolkit sa nedokončila. Podpora GPU pre kontajnery OCI nie je k dispozícii, kým sa nestane.", - "The NVIDIA driver or inventory changed; the operation was stopped": "Ovládač NVIDIA alebo inventár sa zmenili; operation bol zastavený", - "The NVIDIA hook or environment differs from the declared one": "Háčik alebo prostredie NVIDIA sa líši od deklarovaného", + "The NVIDIA driver or inventory changed; the operation was stopped": "Ovládač alebo zoznam zariadení NVIDIA sa zmenil; operácia bola zastavená", + "The NVIDIA hook or environment differs from the declared one": "Spúšťací skript alebo prostredie NVIDIA sa líši od deklarovaného", "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:", "The OCI archive verifier was not found": "Archívový overovateľ OCI nebol nájdený", - "The OCI catalog is not installed. Update ProxMenux and try again.": "Katalóg OCI nie je nainštalovaný. Aktualizovať ProxMenux a skúste to znova.", - "The OCI contract changed while reviewing; nothing was adopted": "Zmluva OCI sa zmenila počas kontroly;nič nebolo prijaté", - "The OCI engine is not installed. Update ProxMenux and try again.": "Motor OCI nie je nainštalovaný. Aktualizovať ProxMenux a skúste to znova.", + "The OCI catalog is not installed. Update ProxMenux and try again.": "Katalóg OCI nie je nainštalovaný. Aktualizujte ProxMenux a skúste to znova.", + "The OCI contract changed while reviewing; nothing was adopted": "Definícia OCI sa počas kontroly zmenila; nič sa neprevzalo", + "The OCI engine is not installed. Update ProxMenux and try again.": "Engine OCI nie je nainštalovaný. Aktualizujte ProxMenux a skúste to znova.", "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 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 PATH of the new image is outside the reproducible profile": "Premenná PATH nového obrazu je mimo profilu, ktorý možno zopakovať", + "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": "Dátový zväzok PostgreSQL musí mať najmenej 4 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 ProxMenux application catalogue is not a list": "Katalóg aplikácií ProxMenux nemá formát zoznamu", "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ť", - "The Proxmox inventory and the local configurations differ": "Súpis Proxmox a miestne konfigurácie sa líšia", + "The Proxmox inventory and the local configurations differ": "Inventár Proxmox nezodpovedá miestnym nastaveniam kontajnerov", + "The README has no recognisable docker-compose section": "README neobsahuje rozpoznateľnú sekciu docker-compose", "The ROCm image has no support for the AMD GPU of this host:": "Obraz ROCm nemá podporu pre AMD GPU tohto hostiteľa:", "The ROCm image of this application has no support for the AMD GPU of this host:": "Obraz ROCm tejto aplikácie nemá podporu pre AMD GPU tohto hostiteľa:", - "The Rclone configuration needs at least 1 GB": "Konfigurácia Rklonu potrebuje aspoň 1 GB", + "The Rclone configuration needs at least 1 GB": "Nastavenia Rclone vyžadujú 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 Selkies profile requires a verified LinuxServer image": "Profil Selkies vyžaduje overený obraz LinuxServer", + "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.", + "The Unifi-controller software is a powerful, enterprise wireless software engine ideal for high-density client deployments requiring low latency and high uptime performance.": "UniFi Controller je výkonný softvér na správu podnikových bezdrôtových sietí s veľkým počtom klientov, nízkou latenciou a vysokou dostupnosťou.", "The VA-API device does not exist:": "Zariadenie VA-API neexistuje:", "The VM also has these audio devices assigned via PCI passthrough — typically added together with the GPU. Remove them too?": "VM má cez PCI passthrough priradené aj tieto audio zariadenia - zvyčajne sa pridávajú spolu s GPU. Odstrániť aj tie?", "The VM guest will have exclusive access to the GPU.": "Hosťovská VM bude mať výhradný prístup ku GPU.", "The VM is powered on. Turn it off before adding disks.": "VM je zapnutá. Pred pridaním diskov ju vypnite.", "The VM/LXC will lose access to this disk after formatting.": "VM/LXC po formátovaní stratí prístup k tomuto disku.", - "The VMID belongs to another container now and is not touched:": "VMID teraz patrí do inej nádoby a nedotýka sa:", - "The VMID or its contract is already in use; it is not adopted": "VMID alebo jeho zmluva sa už používa; nie je prijatá", - "The VMID was reused or its identity is unknown; the operation is blocked": "VMID bol opätovne použitý alebo jeho identita nie je známa; operation je zablokovaný", + "The VMID belongs to another container now and is not touched:": "VMID teraz patrí inému kontajneru; ten zostane nedotknutý:", + "The VMID or its contract is already in use; it is not adopted": "VMID alebo jeho definícia sa už používa; neprevezme sa", + "The VMID was reused or its identity is unknown; the operation is blocked": "VMID bolo znova použité alebo identita kontajnera nie je známa; operácia je zablokovaná", "The VMID was reused or the container is on another node; it is not overwritten": "VMID bol opätovne použitý alebo kontajner je na inom uzle; nie je prepísaný", - "The VMID was taken during the installation:": "VMID bol vykonaný počas inštalácie:", - "The Valkey volume needs at least 1 GB": "Objem Valkey potrebuje aspoň 1 GB", + "The VMID was taken during the installation:": "VMID počas inštalácie obsadil iný proces:", + "The Valkey volume needs at least 1 GB": "Dátový zväzok Valkey musí mať najmenej 1 GB", "The acceleration evidence differs from the verified inventory": "Dôkazy zrýchlenia sa líšia od overeného súpisu", "The acceleration profile does not support this architecture:": "Profil zrýchlenia nepodporuje túto architektúru:", "The access rule added to this host directory is kept:": "Pravidlo prístupu pridané do tohto hostiteľského adresára sa zachová:", @@ -6333,24 +6411,26 @@ "The active kernel driver is not vfio-pci, but the entry will rebind the GPU to vfio-pci on the next reboot, breaking the LXC passthrough about to be configured.": "Aktívny ovládač jadra nie je vfio-pci, ale táto položka pri ďalšom reštarte znova naviaže GPU na vfio-pci, čím sa preruší prechod LXC, ktorý sa má konfigurovať.", "The active kernel driver is not vfio-pci, but the entry will rebind the GPU to vfio-pci on the next reboot.": "Aktívny ovládač jadra nie je vfio-pci, ale táto položka pri ďalšom reštarte znova pripojí GPU k vfio-pci.", "The adaptation content was modified": "Obsah úpravy bol upravený", - "The added disk needs a whole-GiB size recorded by Proxmox": "Pridaný disk potrebuje veľkosť celého GiB zaznamenanú Proxmox", + "The added disk needs a whole-GiB size recorded by Proxmox": "Pridaný disk musí mať v Proxmoxe zaznamenanú veľkosť v celých GiB", "The added disk size is not a whole GiB": "Pridaná veľkosť disku nie je celý GiB", "The additional path hides a system directory": "Ďalšia cesta skrýva systémový adresár", - "The address is already assigned on this host or cluster:": "Adresa je už priradená na tohto hostiteľa alebo klastra:", + "The address is already assigned on this host or cluster:": "Adresa je už priradená na tomto hostiteľovi alebo v klastri:", "The address must start with http:// or https://": "Adresa musí začať na http:// alebo https://", - "The administrator account, the public address and the UDP port are created on the first start, so the web interface opens directly on its login page.": "Správca účtu, verejná adresa a UDP port sú vytvorené na prvom začiatku, takže webové rozhranie sa otvorí priamo na prihlasovacej stránke.", - "The administrator email is not valid": "Správca e-mail nie je platný", + "The administrator account, the public address and the UDP port are created on the first start, so the web interface opens directly on its login page.": "Účet správcu, verejná adresa a port UDP sa vytvoria pri prvom spustení, takže webové rozhranie otvorí priamo prihlasovaciu stránku.", + "The administrator email is not valid": "E-mailová adresa správcu nie je platná", "The administrator user contains characters that are not allowed": "Užívateľ správcu obsahuje znaky, ktoré nie sú povolené", - "The all-in-one AI application.": "Aplikácia UI.", + "The all-in-one AI application.": "Univerzálna aplikácia umelej inteligencie.", + "The application '{app_id}' does not come from LinuxServer": "Aplikácia '{app_id}' nepochádza z LinuxServer", + "The application '{app_id}' is not in the index": "Aplikácia '{app_id}' nie je v indexe", "The application configuration needs a first start to complete.": "Konfigurácia aplikácie potrebuje prvý štart na dokončenie.", "The application could not be modified:": "Aplikáciu nebolo možné upraviť:", - "The application could not be recovered:": "Aplikáciu nebolo možné obnoviť:", + "The application could not be recovered:": "Aplikáciu sa nepodarilo znova zaregistrovať:", "The application could not be recreated:": "Aplikáciu nebolo možné znova vytvoriť:", - "The application did not complete its initial setup:": "Žiadosť nevyplnila svoje pôvodné nastavenie:", + "The application did not complete its initial setup:": "Aplikácia nedokončila úvodné nastavenie:", "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 did not respond in time:": "Aplikácia neodpovedala včas:", + "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:", @@ -6358,7 +6438,7 @@ "The application was removed": "Aplikácia bola odstránená", "The archive could not be extracted.": "Archív sa nepodarilo rozbaliť.", "The archive destination directory is INSIDE one of the paths you are about to back up. Writing the archive there would copy the backup into itself — producing a corrupted archive, or growing without limit until the disk fills up.": "Cieľový priečinok archívu je VNÚTRI jednej z ciest, ktoré sa chystáte zálohovať. Zápis archívu na toto miesto by zálohu kopíroval samu do seba - vznikol by poškodený archív alebo by rástol, kým sa disk nezaplní.", - "The backup could not be identified; the image is not replaced": "Zálohovanie nebolo možné identifikovať; obrázok nie je nahradený", + "The backup could not be identified; the image is not replaced": "Zálohu sa nepodarilo identifikovať; obraz sa nenahradí", "The backup could not be started on node": "Zálohovanie nebolo možné spustiť na uzle", "The backup did not pass its integrity check; creating it again...": "Záloha neprešla kontrolou integrity;vytváram to znova...", "The backup made before changing the application does not fit on the system disk of the host.": "Záloha vytvorená pred zmenou aplikácie sa nezmestí na systémový disk hostiteľa.", @@ -6369,43 +6449,44 @@ "The backup storage does not exist:": "Úložisko záloh neexistuje:", "The backup was altered; recovery blocked": "Záloha bola zmenená; obnova zablokovaná", "The backup was taken on a different PVE or kernel major.minor. These paths will be SKIPPED to keep the boot safe:": "Záloha bola vytvorená na inom PVE alebo inom major.minor kerneli. Tieto cesty sa PRESKOČIA, aby zostal štart bezpečný:", - "The bind mount target escapes the rootfs:": "Záväzná pripojiť cieľ unikne koreňom:", - "The block device does not exist:": "Blokovacie zariadenie neexistuje:", + "The bind mount target escapes the rootfs:": "Cieľ pripojenia bind smeruje mimo koreňového súborového systému:", + "The block device does not exist:": "Blokové zariadenie neexistuje:", + "The block found does not look like a Docker Compose file": "Nájdený blok nevyzerá ako súbor Docker Compose", "The build could not be checked beforehand; continuing without that check.": "Zostavenie nebolo možné vopred skontrolovať;pokračovanie bez tejto kontroly.", "The cached image does not match the current digest": "Comment", - "The cached image is damaged; it will be downloaded again.": "Comment", + "The cached image is damaged; it will be downloaded again.": "Obraz vo vyrovnávacej pamäti je poškodený; stiahne sa znova.", "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 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 sa opýta na heslo, ktoré sa pri písaní nezobrazuje. Po vytvorení používateľov bude webové rozhranie vyžadovať používateľské meno a heslo.", + "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á", "The configuration changed after the new container was validated": "Konfigurácia zmenená po overení nového kontajnera", "The configuration changed during the NVIDIA refresh": "Konfigurácia sa zmenila počas obnovovania NVIDIA", "The configuration evidence does not match": "Konfiguračný dôkaz nezodpovedá", - "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 must run as root on Proxmox VE": "Nastavenie musí bežať pod používateľom root na Proxmox VE", + "The configuration of a new member changed after it was created": "Nastavenie nového kontajnera sa po jeho vytvorení zmenilo", "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ť:", - "The container could not be started:": "Nádoba nemohla byť spustená:", + "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:": "Kontajner sa nepodarilo automaticky odstrániť:", + "The container could not be started:": "Kontajner sa nepodarilo spustiť:", "The container creation does not match the prepared instance": "Vytvorenie kontajnera nezodpovedá pripravenej inštancii", "The container devices do not match the saved record": "Zariadenie kontajnera nezodpovedá uloženému záznamu", - "The container did not stop to update its persistent configuration:": "Kontajner neprestal aktualizovať svoju pretrvávajúcu konfiguráciu:", + "The container did not stop to update its persistent configuration:": "Kontajner sa nezastavil na aktualizáciu svojich trvalých nastavení:", "The container did not stop; its disks are not touched": "Kontajner sa nezastavil; jeho disky nie sú dotknuté", "The container disks do not match the saved record": "disky kontajnera nezodpovedajú uloženému záznamu", - "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 does not exist:": "Kontajner neexistuje:", + "The container does not have the fuse=1 feature enabled": "Kontajner nemá zapnutú funkciu fuse=1", + "The container does not need it any more; an update downloads the new version when there is one.": "Kontajner ho už nepotrebuje. Pri aktualizácii sa stiahne nový obraz, ak je dostupný.", + "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á", @@ -6413,66 +6494,68 @@ "The container is currently stopped. Do you want to start it now to install the package?": "Kontajner je momentálne zastavený. Chcete ho teraz spustiť, aby sa balík nainštaloval?", "The container is not modified because a host directory is not available:": "Kontajner nie je modifikovaný, pretože adresár hostiteľa nie je k dispozícii:", "The container is restarted to apply the changes. Its own data, the database and the other containers of the application are not touched.": "Kontajner sa reštartuje, aby sa zmeny uplatnili. Jeho vlastné údaje, databáza a ostatné kontajnery aplikácie nie sú dotknuté.", - "The container no longer exists:": "Obal už neexistuje:", - "The container of a member was replaced; the assembly is not resumed": "Zásobník člena bol nahradený; zhromaždenie sa neobnovuje", + "The container no longer exists:": "Kontajner už neexistuje:", + "The container of a member was replaced; the assembly is not resumed": "Kontajner zostavy bol nahradený; zostavovanie nebude pokračovať", "The container runs on another node of the cluster; migrate it back to this node to remove it:": "Kontajner beží na inom uzle klastra; migrujte ho späť do tohto uzla, aby ste ho odstránili:", "The container should now start as privileged": "Kontajner by sa teraz mal spustiť ako privilegovaný", "The container should now start as unprivileged": "Kontajner by sa teraz mal spustiť ako neprivilegovaný", - "The container stopped after starting:": "Nádoba sa zastavila po začatí:", - "The container stopped before publishing the mount": "Kontajner sa zastavil pred zverejnením vrchu", + "The container stopped after starting:": "Kontajner sa po spustení zastavil:", + "The container stopped before publishing the mount": "Kontajner sa zastavil pred sprístupnením pripojenia", "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 before the application responded:": "Kontajner sa zastavil pred odpoveďou aplikácie:", "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 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 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 ProxMenuxu a aktualizácia by tieto zmeny zahodila:", + "The container was created from a downloaded OCI image": "Kontajner bol vytvorený zo stiahnutého obrazu 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 containers were created from downloaded OCI images": "Kontajnery boli vytvorené zo stiahnutých obrazov 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", "The current template changes the image or identity; an explicit migration is required": "Aktuálna šablóna mení obraz alebo identitu; explicitná migrácia je required", - "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 current template changes the template identity or image repository; an explicit migration is required": "Aktuálna šablóna mení identitu šablóny alebo repozitár obrazu; je potrebná výslovná migrácia", + "The current template requires a new persistent path:": "Aktuálna šablóna vyžaduje nové trvalé úložisko pre 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 data and document volumes need at least 8 GB": "Údaje a objemy dokumentov potrebujú najmenej 8 GB", + "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": "Dátové zväzky pre údaje a dokumenty musia mať 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", - "The dependency hook and the stack recipe differ": "Závislosť hák a stack recept sa líšia", - "The dependency hook was modified; review it before updating": "Závislosť hák bol upravený, prehodnocovať pred aktualizáciou", - "The developer-friendly cloud platform for building and running LLM agents for AI-native applications.": "Developer-friendly cloud platforma pre budovanie a prevádzku LLM agentov pre AI-natívne aplikácie.", + "The dedicated adapter still requires replaying its rootfs changes": "Vyhradený adaptér stále vyžaduje zopakovanie zmien koreňového súborového systému", + "The dependency hook and the stack recipe differ": "Spúšťací skript závislostí nezodpovedá konfigurácii aplikácie", + "The dependency hook was modified; review it before updating": "Spúšťací skript závislostí bol zmenený; pred aktualizáciou ho skontrolujte", + "The developer-friendly cloud platform for building and running LLM agents for AI-native applications.": "Cloudová platforma pre vývojárov na tvorbu a prevádzku agentov LLM v aplikáciách postavených na AI.", "The device directory does not exist:": "Adresár zariadenia neexistuje:", - "The device must keep its /dev path inside the LXC:": "Zariadenie musí udržať svoju / Dev cestu vnútri LXC:", + "The device must keep its /dev path inside the LXC:": "Zariadenie musí mať v LXC zachovanú svoju cestu /dev:", "The device must keep its native path without duplicates": "Zariadenie musí udržiavať svoju pôvodnú cestu bez duplikátov", "The device to remove is not attached:": "Zariadenie na odstránenie nie je pripojené:", - "The directory contains no character devices:": "Adresár neobsahuje žiadne znaky zariadenia:", + "The directory contains no character devices:": "Adresár neobsahuje žiadne znakové zariadenia:", "The directory does not exist in the CT.": "Priečinok v CT neexistuje.", "The disk": "Disk", "The disk does not belong to this CT; automatic adoption is unsafe": "Disk nepatrí k tomuto CT;automatická adopcia nie je bezpečná", "The disk size cannot be reproduced": "Veľkosť disku nie je možné reprodukovať", "The disk usage of the container could not be read": "Použitie disku kontajnera nebolo možné prečítať", "The disks of the failed attempt could not be removed and stay in the temporary container:": "Disky neúspešného pokusu sa nepodarilo odstrániť a zostávajú v dočasnom kontajneri:", - "The domain must resolve to the public address of this network before the certificate can be issued.": "Doména musí pred vydaním certifikátu vyriešiť verejnú adresu tejto siete.", - "The download client still needs to be configured.": "Stiahnuť klienta ešte treba nakonfigurovať.", - "The download stopped progressing; cancelling this attempt.": "Sťahovanie zastavilo postup, zrušilo tento pokus.", + "The docker-compose block is not closed": "Blok docker-compose nie je ukončený", + "The docker-compose section contains no code block": "Sekcia docker-compose neobsahuje blok kódu", + "The domain must resolve to the public address of this network before the certificate can be issued.": "Pred vydaním certifikátu musí doména smerovať na verejnú adresu tejto siete.", + "The download client still needs to be configured.": "Klienta na sťahovanie ešte treba nastaviť.", + "The download stopped progressing; cancelling this attempt.": "Sťahovanie prestalo napredovať; tento pokus sa ruší.", "The downloaded image does not match its manifest": "Stiahnutý obrázok nezodpovedá jeho manifestu", - "The downloaded image is corrupt:": "Stiahnutý obrázok je poškodený:", + "The downloaded image is corrupt:": "Stiahnutý obraz je poškodený:", "The dpkg package database is clean.": "Databáza balíkov dpkg je čistá.", "The driver installed but does not drive this GPU.": "Ovládač nainštalovaný, ale nepoháňa tento GPU.", "The dynamic NVIDIA hook is missing": "Dynamický NVIDIA hák chýba", "The dynamic NVIDIA hook is missing or duplicated": "Dynamický NVIDIA hák chýba alebo sa zdvojí", - "The dynamic NVIDIA profile requires an unprivileged LXC": "Dynamický profil NVIDIA requires a unprivileged LXC", - "The dynamic profile does not support static driver mounts": "Dynamický profil nepodporuje statické zapojenia vodiča", + "The dynamic NVIDIA profile requires an unprivileged LXC": "Dynamický profil NVIDIA vyžaduje neprivilegovaný kontajner LXC", + "The dynamic profile does not support static driver mounts": "Dynamický profil nepodporuje statické pripojenia ovládača", "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:", + "The final cleanup did not complete:": "Záverečné upratovanie sa nedokončilo:", "The following DKMS-managed drivers will now be rebuilt against it so they keep working after reboot:": "Nasledujúce ovládače spravované cez DKMS sa teraz znovu zostavia pre nový kernel, aby fungovali aj po reštarte:", "The following LXC containers have NVIDIA passthrough configured:": "Tieto LXC kontajnery majú nastavený NVIDIA passthrough:", "The following backup paths are kernel-tied and are excluded from the picker to keep the target's boot safe. The operator's own tuning inside these paths (IOMMU cmdline, VFIO IDs, custom quirks) is merged back automatically via kernel-agnostic merge:": "Nasledujúce cesty zálohy sú viazané na kernel a sú vylúčené z výberu, aby zostal štart cieľa bezpečný. Vlastné ladenie správcu v týchto cestách (IOMMU cmdline, VFIO ID, vlastné úpravy) sa automaticky znovu zlúči spôsobom nezávislým od kernelu:", @@ -6488,116 +6571,119 @@ "The fstab entry will still be removed; reboot or manual umount needed.": "Záznam vo fstab sa aj tak odstráni; bude potrebný reštart alebo ručné odpojenie.", "The gateway must be another usable address in the same subnet.": "Vstupnou bránou musí byť ďalšia použiteľná adresa v tej istej podsiete.", "The gateway should appear in your Tailscale admin console shortly.": "Brána by sa čoskoro mala objaviť v Tailscale administrácii.", + "The generated template does not match the schema:": "Vygenerovaná šablóna nezodpovedá schéme:", "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ý", "The host directory does not exist": "Adresár na hostiteľovi neexistuje", "The host directory may not be accessible from an unprivileged container.": "Priečinok na hostovi nemusí byť dostupný z neprivilegovaného kontajnera.", - "The host has no IPv4 address on the selected bridge": "Hostiteľ nemá IPv4 adresu na vybranom moste", + "The host has no IPv4 address on the selected bridge": "Hostiteľ nemá IPv4 adresu na vybranom sieťovom moste (bridge)", "The host loses access to them. If the group includes a network or storage controller the host needs, cancel at the summary.": "Hostiteľ k nim stratí prístup. Ak skupina obsahuje sieťový alebo úložný radič, ktorý hostiteľ potrebuje, zrušte to v súhrne.", "The host monitor does not see the real host memory": "Monitor hostiteľa nevidí skutočnú pamäť hostiteľa", - "The host monitor does not share this host namespace:": "Monitor hostiteľa nezdieľa tento menový priestor hostiteľa:", + "The host monitor does not share this host namespace:": "Monitor hostiteľa nezdieľa tento menný priestor hostiteľa:", "The host monitor include is unknown or differs from the saved record": "Include monitora hostiteľa je neznámy alebo sa líši od uloženého záznamu", "The host monitor needs consent for privileged access to the host": "Hostiteľský monitor potrebuje súhlas na privilegovaný prístup k hostiteľovi", - "The host monitor profile does not support another sysctl include": "Profil monitora hostiteľa nepodporuje ďalšie sysctl patrí", + "The host monitor profile does not support another sysctl include": "Profil monitora hostiteľa nepodporuje ďalší pripojený konfiguračný súbor sysctl", "The host monitor uses the host network, without DHCP or its own gateway": "Hostiteľský monitor využíva hostiteľskú sieť bez DHCP alebo vlastnej brány", "The host port is already in use:": "Hostiteľský port sa už používa:", - "The host-monitor firewall bridge does not match the selected bridge": "Bridge firewallu pre monitor hostiteľa nezodpovedá vybranému bridgeu", + "The host-monitor firewall bridge does not match the selected bridge": "Sieťový most (bridge) firewallu monitora hostiteľa nezodpovedá vybranému sieťovému mostu (bridge)", "The host-monitor firewall declaration is invalid": "Deklarácia firewallu pre monitor hostiteľa je neplatná", - "The host-monitor firewall port does not match exactly one TCP port in the container contract": "Port firewallu hostiteľa a monitora sa nezhoduje presne s jedným portom TCP v zmluve o kontajneri", + "The host-monitor firewall port does not match exactly one TCP port in the container contract": "Port firewallu monitora hostiteľa sa nezhoduje s práve jedným portom TCP v definícii kontajnera", "The host-monitor firewall port is invalid": "Port firewallu pre monitor hostiteľa je neplatný", "The host-monitor firewall port is not declared as the web port": "Port firewallu pre monitor hostiteľa nie je deklarovaný ako webový port", "The host-monitor firewall port is not declared by this profile": "Port firewallu pre monitor hostiteľa nie je deklarovaný týmto profilom", "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 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 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", - "The image documentation describes them:": "Dokumentácia k obrázku ich popisuje:", + "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": "Obraz mení používateľa očakávaného adaptérom", + "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": "Obraz deklaruje dátové cesty, ktoré sú stále uložené v koreňovom súborovom systéme", + "The image did not grant the application user access to the devices; check its native init. Host permissions were not relaxed.": "Obraz nesprístupnil zariadenia používateľovi aplikácie; skontrolujte jeho natívne spúšťanie. Oprávnenia hostiteľa sa neuvoľnili.", + "The image did not pass the integrity check": "Obraz neprešiel kontrolou integrity", + "The image documentation describes them:": "Popis nájdete v dokumentácii obrazu:", "The image does not declare support for this architecture:": "Obraz nevyhlasuje podporu tejto architektúry:", - "The image download did not complete correctly; downloading it again...": "Sťahovanie obrázku nebolo správne dokončené; sťahovanie...", + "The image download did not complete correctly; downloading it again...": "Sťahovanie obrazu sa nedokončilo správne; sťahuje sa znova...", "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 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.", + "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": "Obraz požaduje NVIDIA, ale hostiteľ nemá 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 požaduje vypnutie časti obmedzení AppArmor alebo seccomp. Pokračujte iba vtedy, ak obrazu dôverujete a riziko prijímate.", + "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 požaduje vypnutie časti obmedzení AppArmor alebo seccomp. Súbor Compose ponúka ich voliteľné uvoľnenie, ktoré zostane vypnuté, kým ho používateľ nevyberie. Pokračujte iba vtedy, ak obrazu dôverujete a riziko prijímate.", "The image was not found in its registry, or it is private:": "Obrázok nebol nájdený v jeho registri, alebo je súkromný:", - "The imported Compose requests privileged, but the official jlesage/handbrake documentation does not require it; ProxMenux keeps the LXC unprivileged.": "Dovážané kompozície žiadosti privilegované, ale oficiálna jlesage/handbrake dokumentácia nie je require to; ProxMenux udržuje LXC neprivilegované.", + "The imported Compose requests privileged, but the official jlesage/handbrake documentation does not require it; ProxMenux keeps the LXC unprivileged.": "Importovaný súbor Compose požaduje privilegovaný režim, oficiálna dokumentácia jlesage/handbrake ho však nevyžaduje. ProxMenux ponechá kontajner LXC neprivilegovaný.", "The imported OCI groups are not numeric": "Dovezené skupiny OCI nie sú číselné", "The imported OCI user or group is not numeric": "Dovážaný užívateľ alebo skupina OCI nie je numerická", - "The initial user name and password stay written in /etc/pve/lxc/.conf as INIT_USERNAME and INIT_PASSWORD. They can be removed after the first login, with the container stopped.": "Počiatočné užívateľské meno a heslo zostávajú zapísané v /etc/pve/lxc/.conf ako INIT_USERNAME a INIT_PASSWORD. Môžu byť odstránené po prvom prihlásení, pričom kontajner sa zastaví.", - "The installation asks which one to use for these paths.": "Inštalácia žiada, ktorý z nich sa má použiť pre tieto cesty.", + "The initial user name and password stay written in /etc/pve/lxc/.conf as INIT_USERNAME and INIT_PASSWORD. They can be removed after the first login, with the container stopped.": "Počiatočné meno a heslo zostávajú v /etc/pve/lxc/.conf ako INIT_USERNAME a INIT_PASSWORD. Po prvom prihlásení ich možno odstrániť pri zastavenom kontajneri.", + "The installation asks which one to use for these paths.": "Inštalačný sprievodca sa opýta, ktorú možnosť použiť pre tieto cesty.", "The installation ended with exit code": "Inštalácia skončila kódom výstupu", "The installation requires a server restart to apply changes. Do you want to restart now?": "Na použitie zmien je po inštalácii potrebný reštart servera. Chcete reštartovať teraz?", - "The installation runs on the Proxmox node itself, as root": "Inštalácia beží na Proxmox uzol sám, ako koreň", + "The installation runs on the Proxmox node itself, as root": "Inštalácia beží priamo na uzle Proxmox pod používateľom root", "The installation stopped because of an unexpected error": "Inštalácia zastavená kvôli neočakávanej chybe", "The installation/changes require a server restart to apply correctly. Do you want to reboot now?": "Aby sa inštalácia alebo zmeny správne použili, server treba reštartovať. Chcete reštartovať teraz?", - "The installer must run as root on Proxmox VE": "Inštalatér musí spustiť ako koreň na Proxmox VE", + "The installer must run as root on Proxmox VE": "Inštalátor musí bežať pod používateľom root na Proxmox VE", "The instance changed while it was being edited; configure Recreate again": "Inštancia sa zmenila počas editácie; znovu nakonfigurujte Recreate", "The instance changed while it was being edited; open Modify again": "Inštancia sa zmenila počas úpravy; znova otvorte Upraviť", - "The instance does not use NVIDIA": "Tento prípad nepoužíva NVIDIU", - "The instance has a pending operation": "Inštancia má prebiehajúci operation", - "The instance identity or status must be reviewed before updating.": "Pred aktualizáciou sa musí preskúmať totožnosť alebo status prípadu.", - "The instance is not ready to be updated": "Prípad nie je pripravený na aktualizáciu", - "The instance is not ready; review its pending operation": "Inštancia nie je pripravená; preskúma svoju očakávanú operation", - "The instance record operation did not complete; no container was modified.": "Záznam o inštancii operation sa nedokončil; žiadna nádoba nebola zmenená.", + "The instance does not use NVIDIA": "Táto inštancia nepoužíva NVIDIA", + "The instance has a pending operation": "Inštancia má nedokončenú operáciu", + "The instance identity or status must be reviewed before updating.": "Pred aktualizáciou treba preveriť identitu alebo stav inštancie.", + "The instance is not ready to be updated": "Inštancia nie je pripravená na aktualizáciu", + "The instance is not ready; review its pending operation": "Inštancia nie je pripravená; skontrolujte jej nedokončenú operáciu", + "The instance record operation did not complete; no container was modified.": "Operácia so záznamom inštancie sa nedokončila; žiadny kontajner sa nezmenil.", "The instance registry is not safe": "Inštančný register nie je bezpečný", - "The journal belongs to another VMID": "Časopis patrí inému VMIDu.", - "The journal belongs to another stack": "Časopis patrí inému stohu", - "The journal has an incomplete recovery state": "Časopis má neúplný stav obnovy", + "The journal belongs to another VMID": "Záznam operácie patrí inému VMID", + "The journal belongs to another stack": "Záznam operácie patrí inej aplikácii s viacerými kontajnermi", + "The journal has an incomplete recovery state": "Záznam operácie obsahuje neúplný stav obnovy", "The kernel module is not active:": "Modul jadra nie je aktívny:", "The kernel module of version": "Modul jadra verzie", "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 local storage does not accept snippets": "Úložisko local nepodporuje obsah typu snippets", "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 Compose service cannot be identified unambiguously": "Hlavnú službu v súbore Compose nemožno jednoznačne určiť", + "The main Compose service has no image.": "Hlavná služba v súbore Compose nemá zadaný žiadny obraz.", "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ý", - "The main member of the stack is missing": "Hlavný člen zásobníka chýba", + "The main member must stop first and start last": "Hlavný kontajner sa musí zastaviť ako prvý a spustiť ako posledný", + "The main member of the stack is missing": "Chýba hlavný kontajner aplikácie", "The managed host firewall rule could not be removed and was left unchanged.": "Spravované pravidlo firewallu hostiteľa sa nepodarilo odstrániť a zostalo bez zmeny.", - "The manifest does not match its digest": "Manifest nezodpovedá jeho tráveniu", - "The member journal belongs to another stack operation": "Členský časopis patrí do ďalšieho stohu operation", - "The member journal is outside the registry": "Členský časopis je mimo registra", + "The manifest does not match its digest": "Manifest nezodpovedá svojmu identifikátoru digest", + "The member journal belongs to another stack operation": "Záznam operácie člena aplikácie patrí k inej operácii celej aplikácie", + "The member journal is outside the registry": "Záznam operácie člena aplikácie je mimo registra", "The mode of this job is stop: its guests are shut down during the backup.": "Režim tejto úlohy je stop: jej hostia sú počas zálohovania vypnutí.", - "The mount evidence does not match the verified directories": "Pripojiť dôkazy nezodpovedá overených adresárov", + "The mount evidence does not match the verified directories": "Záznam o pripojení nezodpovedá overeným adresárom", "The mount source or options were not kept": "Zdroj alebo možnosti pripojenia neboli zachované", - "The mounted source differs from the configured directory": "Inštalovaný zdroj sa líši od nakonfigurovaného adresára", - "The mounts of the new container do not match the proposal": "Montáže nového kontajnera nezodpovedajú návrhu", + "The mounted source differs from the configured directory": "Pripojený zdroj sa líši od nastaveného adresára", + "The mounts of the new container do not match the proposal": "Pripojené cesty nového kontajnera nezodpovedajú návrhu", "The name must start with a lowercase letter and use only lowercase letters, digits, - or _": "Názov musí začínať malým písmenom a používať iba malé písmená, číslice, - alebo _", "The native GPU permissions were not kept": "Natívne povolenia GPU neboli ponechané", - "The native unprivileged idmap is required": "Natívne neprivilegované idmapa je required", + "The native unprivileged idmap is required": "Vyžaduje sa natívne mapovanie ID neprivilegovaného kontajnera", "The new SSH key was installed and is now authorized on the server.\nKey file:": "Nový SSH kľúč bol nainštalovaný a je teraz povolený na serveri.\nSúbor kľúča:", "The new SSH key was pushed to the LXC via 'pct exec' on": "Nový SSH kľúč bol odoslaný do LXC cez 'pct exec' na", - "The new Valkey volume contains unexpected data": "Nový Valkey objem obsahuje neočakávané dáta", - "The new container did not pass validation": "Nová nádoba neprešla validáciou", - "The new container is not authorized by the operation journal": "Nový kontajner nie je povolený časopisom operation", - "The new image adds a symbolic link in a generated path": "Nový obrázok pridáva symbolické spojenie na generovanej ceste", - "The new image changes the PostgreSQL major version; the data must be migrated before updating": "Nový obrázok mení PostgreSQL hlavnú verziu; údaje musia byť premiestnené pred aktualizáciou", - "The new image could not be installed": "Nový obrázok nemohol byť nainštalovaný", - "The new image could not be installed:": "Nový obrázok sa nepodarilo nainštalovať:", - "The new image does not fit on the storage where images are downloaded:": "Nový image sa nezmestí na úložisko, kam sa sťahujú image:", - "The new image does not keep a required executable": "Nový obrázok neudržuje spustiteľný required", - "The new image is more recent than the minimum age set for scheduled updates; it is not installed yet.": "Nový obrázok je novší ako minimálny vek nastavený pre plánované aktualizácie;ešte nie je nainštalovaný.", - "The new image requires additional persistent paths": "Nový obrázok requires ďalšie pretrvávajúce cesty", + "The new Valkey volume contains unexpected data": "Nový dátový zväzok Valkey obsahuje neočakávané údaje", + "The new container did not pass validation": "Nový kontajner neprešiel overením", + "The new container is not authorized by the operation journal": "Záznam operácie nepovoľuje tento nový kontajner", + "The new image adds a symbolic link in a generated path": "Nový obraz pridáva symbolický odkaz do generovanej cesty", + "The new image changes the PostgreSQL major version; the data must be migrated before updating": "Nový obraz mení hlavnú verziu PostgreSQL; pred aktualizáciou je potrebné migrovať údaje", + "The new image could not be installed": "Nový obraz sa nepodarilo nainštalovať", + "The new image could not be installed:": "Nový obraz sa nepodarilo nainštalovať:", + "The new image does not fit on the storage where images are downloaded:": "Nový obraz sa nezmestí na úložisko určené na sťahovanie obrazov:", + "The new image does not keep a required executable": "Nový obraz neobsahuje požadovaný spustiteľný súbor", + "The new image is more recent than the minimum age set for scheduled updates; it is not installed yet.": "Nový obraz zatiaľ nedosiahol minimálny vek nastavený pre plánované aktualizácie, preto sa ešte nenainštaluje.", + "The new image requires additional persistent paths": "Nový obraz vyžaduje ďalšie trvalé dátové adresáre", "The new image requires additional persistent paths; use Modify": "Nový obraz vyžaduje ďalšie trvalé cesty; použite Upraviť", "The new image requires additional persistent paths; use Recreate": "Nový obrázok requires ďalšie pretrvávajúce cesty; používať Recreate", "The new prompt will be used in new terminal sessions.": "Nový príkazový riadok sa použije v nových reláciách terminálu.", "The next visit to the dashboard will show the initial setup wizard.": "Pri ďalšom otvorení dashboardu sa zobrazí úvodný sprievodca nastavením.", - "The observed inventory differs from the validated runtime": "Pozorovaný inventár sa líši od overeného času", + "The observed inventory differs from the validated runtime": "Zistený zoznam zariadení sa líši od overeného prostredia NVIDIA", "The oci-compose has errors:": "oci-compose obsahuje chyby:", "The oci-compose is incomplete: it does not say which image to install.": "oci-compose je neúplný: nehovorí, ktorý obraz sa má nainštalovať.", "The oci-compose is not valid JSON:": "oci-compose nie je platný JSON:", @@ -6605,12 +6691,12 @@ "The official inventory contains no NVIDIA devices": "Oficiálny inventár neobsahuje žiadne zariadenia NVIDIA", "The official inventory contains no NVIDIA driver components": "Oficiálny inventár neobsahuje žiadne komponenty ovládača NVIDIA", "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": "operation už skončil; nie je automaticky obnovená", - "The operation could not be completed": "operation nebolo možné dokončiť", + "The official startup of the application is missing": "Chýba oficiálny spôsob spustenia 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": "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:", + "The operation was stopped because a shared directory changed its identity:": "Operácia bola zastavená, pretože zdieľaný adresár zmenil svoju identitu:", "The original MOTD backup is unavailable; no changes were made": "Pôvodná záloha MOTD nie je k dispozícii;neboli vykonané žiadne zmeny", "The original MOTD configuration has been restored": "Pôvodná konfigurácia MOTD bola obnovená", "The original MOTD state is unavailable; no changes were made": "Pôvodný stav MOTD nie je k dispozícii;neboli vykonané žiadne zmeny", @@ -6618,85 +6704,85 @@ "The original rpcbind state could not be restored completely": "Pôvodný stav rpcbind nebolo možné úplne obnoviť", "The original rpcbind state is unavailable; no service state was changed": "Pôvodný stav rpcbind nie je k dispozícii;žiadny servisný stav sa nezmenil", "The package is currently in a broken state and is blocking apt updates on this system.": "Balík je momentálne v nefunkčnom stave a blokuje aktualizácie apt v tomto systéme.", - "The parent of an NVIDIA destination is not a directory": "Materská destinácia NVIDIA nie je adresár", - "The parent of the target is not a directory:": "Materský cieľ nie je adresár:", + "The parent of an NVIDIA destination is not a directory": "Nadradená cesta cieľa NVIDIA nie je adresár", + "The parent of the target is not a directory:": "Nadradená cesta cieľa nie je adresár:", "The password could not be retrieved automatically": "Heslo nebolo možné získať automaticky", "The passwords do not match. Please try again.": "Heslá sa nezhodujú. Skúste to znova.", - "The path escapes the rootfs:": "Cesta uniká koreňom:", + "The path escapes the rootfs:": "Cesta smeruje mimo koreňového súborového systému:", "The path must be absolute and normalized": "Cesta musí byť absolútna a normalizovaná", "The path overlaps an existing mount": "Trasa sa prekrýva s existujúcou montážou", "The path to remove is not mounted:": "Cesta na odstránenie nie je pripojená:", "The persistent NVIDIA hook does not match the installer:": "Trvalý NVIDIA hák nezodpovedá inštalátorovi:", - "The persistent WebUI credentials were not found": "Trvalé WebUI credentials neboli nájdené", + "The persistent WebUI credentials were not found": "Trvalé prihlasovacie údaje webového rozhrania sa nenašli", "The physical NVIDIA selection changed": "Fyzický výber NVIDIA sa zmenil", - "The post-start configuration cannot be applied with the LXC stopped": "Konfigurácia po štarte sa nedá použiť s zastavením LXC.", - "The postgres user was not found in the image": "Užívateľ postgres nebol nájdený v obrázku", - "The prepared directory escapes the rootfs:": "Pripravený adresár unikne koreňom:", + "The post-start configuration cannot be applied with the LXC stopped": "Nastavenia po spustení nemožno použiť, keď je kontajner LXC zastavený", + "The postgres user was not found in the image": "Používateľ postgres sa v obraze nenašiel", + "The prepared directory escapes the rootfs:": "Pripravený adresár smeruje mimo koreňového súborového systému:", "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 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 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 definícia zostavy nie je bezpečná; pred opätovným použitím ju skontrolujte", "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:", + "The previous stack contract still has containers or VMs:": "K predchádzajúcej definícii zostavy stále patria kontajnery alebo VM:", "The private address is already assigned to another container:": "Súkromná adresa je už pridelená k inému kontajneru:", - "The private bridge does not have the expected address:": "Súkromný most nemá očakávanú adresu:", - "The private journal has an unsafe owner or permissions": "Súkromný časopis má nebezpečného majiteľa alebo povolenia", - "The private network allocator was not found": "Private Network alocator nebol nájdený", + "The private bridge does not have the expected address:": "Súkromný sieťový most (bridge) nemá očakávanú adresu:", + "The private journal has an unsafe owner or permissions": "Súkromný záznam operácie má nebezpečného vlastníka alebo prístupové práva", + "The private network allocator was not found": "Nástroj na prideľovanie súkromných sietí sa nenašiel", "The private network is still used by another container and is kept:": "Súkromná sieť sa stále používa v inej nádobe a udržiava sa:", "The private network is still used by another guest and is kept:": "Súkromnú sieť stále používa iná VM alebo iný CT a zostáva zachovaná:", "The private network must be assigned automatically": "Súkromná sieť musí byť automaticky pridelená", "The private network of the application is already in use on this host:": "Súkromná sieť aplikácie sa už na tomto hostiteľovi používa:", "The privilege mode of the container does not match the saved record": "Režim oprávnení kontajnera sa nezhoduje s uloženým záznamom", - "The privileged deployment does not include the required explicit consent": "Privilegované nasadenie nezahŕňa required výslovný súhlas", - "The prlimit soft value exceeds the hard value": "Prlimit soft hodnota presahuje tvrdú hodnotu", + "The privileged deployment does not include the required explicit consent": "Privilegované nasadenie nemá požadovaný výslovný súhlas", + "The prlimit soft value exceeds the hard value": "Mäkký limit prlimit prekračuje pevný limit", "The profile sets SETUP_PORT=8123. Port 80 is only used when that variable is emptied.": "Profil nastavuje SETUP_PORT=8123. Port 80 sa používa iba vtedy, keď je táto premenná prázdna.", "The proposal changes the identity of the instance": "Návrh mení totožnosť inštancie", "The proposed ARC maximum is below Proxmox VE's pool-size guideline:": "Navrhované maximum ARC je nižšie ako smernica Proxmox VE pre veľkosť bazéna:", "The proposed changes no longer match; nothing was adopted": "Navrhované zmeny sa už nezhodujú;nič nebolo prijaté", - "The published views must be inside the common root": "Publikované názory musia byť vo vnútri spoločného koreňa", + "The published views must be inside the common root": "Sprístupnené pohľady musia byť v spoločnom koreňovom adresári", "The read-only view does not apply the expected protection": "Pohľad len na čítanie neuplatňuje očakávanú ochranu", - "The read-only view was not published": "Zobrazenie nebolo zverejnené", + "The read-only view was not published": "Pohľad iba na čítanie sa nesprístupnil", "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 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", - "The record of a member was replaced; the assembly is not resumed": "Záznam o členovi bol nahradený; zhromaždenie sa neobnovuje", + "The recipe requires configuration at startup; its coordinated replay is not available": "Konfigurácia vyžaduje úpravy pri spustení, ktoré koordinovaná aktualizácia zatiaľ nevie zopakovať", + "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í inému kontajneru", + "The record does not belong to this operation": "Záznam nepatrí k tejto operácii", + "The record no longer belongs to this operation": "Záznam už nepatrí tejto operácii", + "The record of a member was replaced; the assembly is not resumed": "Záznam kontajnera bol nahradený; zostavovanie nebude pokračovať", "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 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 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 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ý identifikátor digest obrazu", + "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:": "Vzdialené úložisko neexistuje; najprv ho vytvorte a autorizujte vo webovom rozhraní:", + "The remote installer must run as root on Proxmox VE": "Vzdialený inštalátor musí bežať pod používateľom root 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.", - "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 remote path must be relative and cannot contain line breaks": "Cesta vo vzdialenom úložisku musí byť relatívna a nesmie obsahovať zalomenia riadkov", "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", - "The requested machine learning GPU profile is not working; it is not replaced by CPU": "Požadovaný profil strojového učenia sa GPU nefunguje; nie je nahradený CPU", + "The requested machine learning GPU profile is not working; it is not replaced by CPU": "Požadovaný profil GPU pre strojové učenie nefunguje; nenahradí sa CPU", "The resource edit could not be fully rolled back. Open Manage again to review and import the current Proxmox settings.": "Zmenu prostriedkov sa nepodarilo úplne vrátiť späť. Znova otvorte správu aplikácií, skontrolujte aktuálne nastavenia systému Proxmox a prevezmite ich.", "The restored service did not pass its health check": "Obnovená služba neprešla kontrolou stavu", "The restored service stopped; the recovery is not confirmed": "Obnovená služba sa zastavila; obnova sa nepotvrdila", - "The reviewed Tandoor stack does not require a privileged LXC.": "Preskúmaný Tandoor stack require privilegovaný LXC.", + "The reviewed Tandoor stack does not require a privileged LXC.": "Overená zostava Tandoor nevyžaduje privilegovaný kontajner LXC.", "The root password is asked for when connecting from another machine. Inside the container, the mariadb command opens as root without a password.": "Heslo používateľa root sa vyžaduje pri pripojení z iného počítača. Vnútri kontajnera sa príkaz mariadb otvorí ako root bez hesla.", - "The rootfs capture only belongs to the running installation": "Rootfs capture patrí len do bežiacej inštalácie", + "The rootfs capture only belongs to the running installation": "Zachytenie koreňového súborového systému patrí iba prebiehajúcej inštalácii", "The rootfs is not managed by Proxmox": "Rootfs nie je riadený Proxmox", - "The rootfs is not mounted": "Korene nie sú namontované", + "The rootfs is not mounted": "Koreňový súborový systém nie je pripojený", "The same GPU cannot be used by two VMs at the same time.": "Rovnakú GPU nemôžu používať dve VM naraz.", - "The same connection can be given as container variables instead of the file: UN_SONARR_0_URL and UN_SONARR_0_API_KEY, or the UN_RADARR_0_ equivalents.": "Rovnaké spojenie možno uviesť ako kontajnerové premenné namiesto súboru: UN_SONARR_0_URL a UN_SONARR_0_API_KEY, alebo UN RADARR 0 equivalents.", + "The same connection can be given as container variables instead of the file: UN_SONARR_0_URL and UN_SONARR_0_API_KEY, or the UN_RADARR_0_ equivalents.": "Namiesto súboru možno pripojenie nastaviť premennými kontajnera: UN_SONARR_0_URL a UN_SONARR_0_API_KEY alebo zodpovedajúcimi premennými UN_RADARR_0_.", "The saved MOTD state is invalid; no changes were made": "Uložený stav MOTD je neplatný;neboli vykonané žiadne zmeny", "The saved OCI record is incomplete or has an unexpected format.": "Uložený záznam OCI je neúplný alebo má neočakávaný formát.", "The saved image channel is checked for a newer image. If replacement is needed, the CT is stopped and a native backup is verified before its root is replaced. Host directories are outside that backup.": "Kanál uložených obrázkov sa skontroluje, či neobsahuje novší obrázok. Ak je potrebná výmena, CT sa zastaví a pred nahradením koreňa sa overí natívna záloha. Hostiteľské adresáre sú mimo tejto zálohy.", @@ -6733,13 +6819,13 @@ "The selected VM": "Vybraná VM", "The selected VM is running.": "Vybraná VM beží.", "The selected base folder does not exist and could not be created:": "Vybraný základný priečinok neexistuje a nepodarilo sa ho vytvoriť:", - "The selected bridge does not exist": "Vybraný sieťový most neexistuje", - "The selected bridge has no IPv4 subnet for the host-monitor firewall": "Vybraný bridge nemá IPv4 podsieť pre firewall monitora hostiteľa", + "The selected bridge does not exist": "Vybraný sieťový most (bridge) neexistuje", + "The selected bridge has no IPv4 subnet for the host-monitor firewall": "Vybraný sieťový most (bridge) nemá IPv4 podsieť pre firewall monitora hostiteľa", "The selected configuration needs to start the LXC during the installation": "Vybraná konfigurácia musí spustiť LXC počas inštalácie", "The selected container is unprivileged. A privileged container is required for direct device passthrough.": "Vybraný kontajner je neprivilegovaný. Na priame priradenie zariadenia je potrebný privilegovaný kontajner.", "The selected device": "Vybrané zariadenie", - "The selected device is not a block device": "Vybrané zariadenie nie je blokovacie zariadenie", - "The selected device is not a character device": "Vybrané zariadenie nie je charakterové zariadenie", + "The selected device is not a block device": "Vybrané zariadenie nie je blokové zariadenie", + "The selected device is not a character device": "Vybrané zariadenie nie je znakové zariadenie", "The selected directory does not exist:": "Vybraný priečinok neexistuje:", "The selected disk has an active swap partition. Aborting.": "Vybraný disk má aktívny swap oddiel. Akcia sa ruší.", "The selected disk is currently used by a RUNNING VM or CT. Stop it before formatting.": "Vybraný disk práve používa BEŽIACA VM alebo CT. Pred formátovaním ju zastavte.", @@ -6753,8 +6839,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:", @@ -6762,39 +6848,39 @@ "The shared directory points to a protected host path": "Zdieľaný adresár ukazuje na chránenú cestu hostiteľa", "The shared path exists but is not a directory:": "Spoločná cesta existuje, ale nie je adresárom:", "The size of existing disks is not rounded": "Veľkosť existujúcich diskov nie je zaokrúhlená", - "The source Compose requests privileged: true, but this does not prove that the image needs a privileged LXC. ProxMenux will use an unprivileged LXC by default and will offer the broad mode only as an option. Continue only if you trust the image and accept this risk.": "Zdroj tvoria požiadavky privilegované: pravda, ale to nedokazuje, že obraz potrebuje privilegovaný LXC. ProxMenux štandardne použije neprivilegovaný LXC a ponúkne široký režim len ako možnosť. Pokračujte len vtedy, ak dôverujete obrazu a prijmete toto riziko.", - "The source Compose requests privileged: true, but this does not prove that the image needs a privileged LXC. ProxMenux will use an unprivileged LXC by default and will offer the broad mode only as an option. The Compose offers an optional AppArmor or seccomp relaxation; it will stay disabled unless the user selects it. The Docker rootlesskit profile does not exist in LXC and will be replaced by AppArmor unconfined, which is less restrictive. Continue only if you trust the image and accept this risk.": "Zdroj tvoria požiadavky privilegované: pravda, ale to nedokazuje, že obraz potrebuje privilegovaný LXC. ProxMenux štandardne použije neprivilegovaný LXC a ponúkne široký režim len ako možnosť. Skladba ponúka voliteľnú AppArmor alebo seccomp relaxáciu; zostane vypnutá, ak si ju užívateľ nevyberie. Profil Docker rootlesskit neexistuje v LXC a nahradí ho AppArmor unconfined, čo je menej obmedzujúce. Pokračujte len vtedy, ak dôverujete obrazu a prijmete toto riziko.", + "The source Compose requests privileged: true, but this does not prove that the image needs a privileged LXC. ProxMenux will use an unprivileged LXC by default and will offer the broad mode only as an option. Continue only if you trust the image and accept this risk.": "Zdrojový súbor Compose požaduje privileged: true, čo však nedokazuje, že obraz vyžaduje privilegovaný kontajner LXC. ProxMenux predvolene použije neprivilegovaný kontajner LXC a režim so širšími oprávneniami ponúkne iba ako možnosť. Pokračujte iba vtedy, ak obrazu dôverujete a toto riziko prijímate.", + "The source Compose requests privileged: true, but this does not prove that the image needs a privileged LXC. ProxMenux will use an unprivileged LXC by default and will offer the broad mode only as an option. The Compose offers an optional AppArmor or seccomp relaxation; it will stay disabled unless the user selects it. The Docker rootlesskit profile does not exist in LXC and will be replaced by AppArmor unconfined, which is less restrictive. Continue only if you trust the image and accept this risk.": "Zdrojový súbor Compose požaduje privileged: true, čo však nedokazuje, že obraz vyžaduje privilegovaný kontajner LXC. ProxMenux predvolene použije neprivilegovaný kontajner a širšie oprávnenia ponúkne iba voliteľne. Voliteľné uvoľnenie AppArmor alebo seccomp zostane vypnuté, kým ho používateľ nevyberie. Profil Docker rootlesskit v LXC neexistuje a nahradí sa menej obmedzujúcim režimom AppArmor unconfined. Pokračujte iba vtedy, ak obrazu dôverujete a riziko prijímate.", "The source VM also has these audio devices, likely added together with the GPU. Remove them too?": "Zdrojová VM má aj tieto audio zariadenia, pravdepodobne pridané spolu s GPU. Odstrániť aj tie?", "The specified directory does not exist:": "Zadaný priečinok neexistuje:", "The stability period must be shorter than the healthcheck timeout": "Obdobie stability musí byť kratšie ako časový limit pre kontrolu zdravotného stavu.", - "The stack contains devices or directives without a translation": "Stock obsahuje zariadenia alebo smernice bez prekladu", - "The stack does not have the expected native hook": "Stack nemá očakávaný materinský hák", - "The stack journal is outside the registry": "Denník je mimo registra.", - "The stack member has no declared adaptation profile": "Stack člen nemá deklarovaný adaptačný profil", - "The stack name only accepts lowercase letters, numbers and hyphens": "Názov stohu prijíma len malé písmená, čísla a pomlčky", - "The stack needs member adaptations or a verification of missing volumes": "Stack potrebuje členské úpravy alebo overenie chýbajúcich objemov", - "The stack operation had already finished": "Stack operation už skončil", - "The stack operation has not finished yet": "Stack operation ešte neskončil", - "The stack operation stopped halfway. Select the stack again in the OCI management menu to recover it.": "Operácia so zásobníkom sa zastavila v polovici. Ak ju chcete obnoviť, v ponuke Správca OCI aplikácií znova vyberte zásobník.", - "The stack registry is incomplete; review the private contracts.": "Register stoh je neúplný; preskúma súkromné zmluvy.", - "The stack startup hook was not found": "Stack startup hák nebol nájdený", - "The stack update was saved.": "Aktualizácia stohu bola uložená.", + "The stack contains devices or directives without a translation": "Zostava obsahuje zariadenia alebo direktívy bez podporovaného prevodu", + "The stack does not have the expected native hook": "Aplikácia nemá očakávaný natívny spúšťací skript", + "The stack journal is outside the registry": "Záznam operácie celej aplikácie je mimo registra", + "The stack member has no declared adaptation profile": "Kontajner zostavy nemá deklarovaný adaptačný profil", + "The stack name only accepts lowercase letters, numbers and hyphens": "Názov zostavy môže obsahovať iba malé písmená, číslice a pomlčky", + "The stack needs member adaptations or a verification of missing volumes": "Aplikácia vyžaduje úpravy svojich kontajnerov alebo overenie chýbajúcich dátových zväzkov", + "The stack operation had already finished": "Operácia celej aplikácie už bola dokončená", + "The stack operation has not finished yet": "Operácia celej aplikácie ešte nebola dokončená", + "The stack operation stopped halfway. Select the stack again in the OCI management menu to recover it.": "Operácia celej aplikácie zostala nedokončená. Ak ju chcete obnoviť, v ponuke správy OCI znova vyberte danú aplikáciu.", + "The stack registry is incomplete; review the private contracts.": "Register zostavy je neúplný; skontrolujte súkromné definície.", + "The stack startup hook was not found": "Spúšťací skript zostavy sa nenašiel", + "The stack update was saved.": "Aktualizácia celej aplikácie bola uložená.", "The startup differs from the declared Nextcloud adapter": "Spustenie sa líši od deklarovaného Nextcloud adaptéra", "The startup differs from the declared adapter": "Spustenie sa líši od deklarovaného adaptéra", - "The staticfiles volume needs at least 1 GB": "Objem statických súborov potrebuje aspoň 1 GB", + "The staticfiles volume needs at least 1 GB": "Dátový zväzok staticfiles musí mať najmenej 1 GB", "The storage chosen for this backup cannot be written:": "Do úložiska vybratého pre túto zálohu sa nedá zapisovať:", "The storage chosen for this backup has no room either:": "Ani na úložisku vybratom pre túto zálohu nie je dostatok miesta:", "The storage does not accept backups:": "Úložisko neprijíma zálohy:", "The storage has been removed and the disk unmounted.": "Úložisko bolo odstránené a disk odpojený.", - "The storage has less than 40 GB free for the ROCm image.": "V úložisku je voľných menej ako 40 GB pre obrázok ROCm.", + "The storage has less than 40 GB free for the ROCm image.": "Na úložisku je menej než 40 GB voľného miesta pre obraz ROCm.", "The sysctl content was modified outside the saved record": "Obsah sysctl bol upravený mimo uloženého záznamu", - "The sysctl include is a link:": "Sysctl patrí je odkaz:", - "The sysctl include is not a safe host file": "Sysctl patrí nie je bezpečný hostiteľský súbor", - "The sysctl include is not restored over a symbolic link": "Sysctl patrí nie je obnovený cez symbolické spojenie", - "The sysctl include is unknown or differs from the saved record": "Sysctl patrí nie je známe alebo sa líši od uloženého záznamu", + "The sysctl include is a link:": "Pripojený konfiguračný súbor sysctl je odkaz:", + "The sysctl include is not a safe host file": "Pripojený konfiguračný súbor sysctl nie je bezpečný súbor hostiteľa", + "The sysctl include is not restored over a symbolic link": "Konfiguračný súbor sysctl sa neobnovuje cez symbolický odkaz", + "The sysctl include is unknown or differs from the saved record": "Pripojený konfiguračný súbor sysctl je neznámy alebo sa líši od uloženého záznamu", "The temporary password could not be retrieved.": "Dočasné heslo nebolo možné získať späť.", "The test will continue even if you close this terminal.": "Test bude pokračovať aj po zatvorení tohto terminálu.", - "The tmpfs mounts of the container differ from the saved record": "Tmpfs držiaky kontajnera sa líšia od uloženého záznamu", + "The tmpfs mounts of the container differ from the saved record": "Pripojenia tmpfs v kontajneri sa líšia od uloženého záznamu", "The tmpfs path or size is outside the supported profile": "Tmpfs cesta alebo veľkosť je mimo podporovaný profil", "The translated recipe changed during the preparation": "Preložený recept sa počas prípravy zmenil", "The update check could not be completed. Try again later.": "Kontrolu aktualizácií sa nepodarilo dokončiť. Skúste to znova neskôr.", @@ -6802,7 +6888,7 @@ "The value must be a number:": "Hodnota musí byť číslo:", "The values do not match. Enter them again.": "Hodnoty sa nezhodujú. Zadajte ich znova.", "The variable contains control characters:": "Premenná obsahuje kontrolné znaky:", - "The variable contains line breaks:": "Premenná obsahuje prestávky na riadku:", + "The variable contains line breaks:": "Premenná obsahuje zalomenia riadkov:", "The vfio.conf entries have been removed and initramfs rebuilt.": "Položky vfio.conf boli odstránené a initramfs prebudované.", "The volume ID does not contain a disk name for this CT; automatic adoption is unsafe": "ID zväzku neobsahuje názov disku tohto CT; automatické prevzatie nie je bezpečné", "The watchdog could not be enabled. Turn it on from Manage installed OCI applications.": "Watchdog sa nepodarilo povoliť. Zapnite ho v Spravovať nainštalované aplikácie OCI.", @@ -6810,20 +6896,20 @@ "The web UI user contains characters that are not allowed": "Webový užívateľ UI obsahuje znaky, ktoré nie sú povolené", "The web interface is served over plain HTTP on port 51821 (INSECURE=true). Keep it inside the local network or publish it through a reverse proxy with TLS.": "Webové rozhranie sa podáva cez obyčajný HTTP na porte 51821 (INSECURE=true). Držte ho v miestnej sieti alebo ho publikujte prostredníctvom reverzného proxy s TLS.", "The web interface uses a self-signed certificate, so the browser shows a warning the first time.": "Webové rozhranie používa samopodpísaný certifikát, takže prehliadač prvýkrát zobrazí varovanie.", - "The wizard writes a .conf file in /config. Restart the container afterwards so the bot starts with that configuration.": "Čarodejník píše súbor .conf v /config. Potom znovu spustite kontajner, takže robot začne s touto konfiguráciou.", + "The wizard writes a .conf file in /config. Restart the container afterwards so the bot starts with that configuration.": "Sprievodca zapíše súbor .conf do /config. Potom kontajner reštartujte, aby robot použil tieto nastavenia.", "The world's fastest framework for building websites": "Najrýchlejší rámec na svete pre vytváranie webových stránok", - "Thelounge (a fork of shoutIRC) is a web IRC client that you host on your own server.": "Thelounge (fork screamIRC) je webový IRC klient, ktorý hosťujete na svojom vlastnom serveri.", + "Thelounge (a fork of shoutIRC) is a web IRC client that you host on your own server.": "The Lounge (odnož shoutIRC) je webový IRC klient, ktorý prevádzkujete na vlastnom serveri.", "Then bind-mount to container": "Potom pripojiť do kontajnera cez bind mount", "Then change the VM display to none (vga: none) when the guest is stable.": "Keď bude VM stabilná, zmeňte jej display na none (vga: none).", "Then change the VM display to none (vga: none) when the system is stable.": "Keď bude systém stabilný, zmeňte display VM na none (vga: none).", "Then run this option again:": "Potom túto možnosť spustite znova:", "Then update /etc/fstab on the host with the same options.": "Potom aktualizujte /etc/fstab na hoste s rovnakými možnosťami.", - "There are extra disks or bind mounts outside the journal; the rootfs is not replaced": "Tam sú ďalšie disky alebo pripojiť mimo denníka; rootfs nie je nahradený", + "There are extra disks or bind mounts outside the journal; the rootfs is not replaced": "Ďalšie disky alebo pripojené adresáre nie sú uvedené v zázname operácie; rootfs sa nenahradí", "There are no LXC containers available. OCI containers are not included.": "Nie sú k dispozícii žiadne kontajnery LXC. Kontajnery OCI nie sú zahrnuté.", - "There is no temporary container of this operation to keep the current disks": "Neexistuje žiadny dočasný kontajner tohto operation udržať aktuálne disky", - "There is no verified backup; a modified container is not touched": "Neexistuje žiadna overená záloha; modifikovaný kontajner sa nedotýka", + "There is no temporary container of this operation to keep the current disks": "Chýba dočasný kontajner tejto operácie na zachovanie aktuálnych diskov", + "There is no verified backup; a modified container is not touched": "Chýba overená záloha; zmenený kontajner zostáva nedotknutý", "These Proxmox resources were added outside ProxMenux:": "Tieto zdroje Proxmox boli pridané mimo ProxMenux:", - "These VMIDs are not free:": "Tieto VMID nie sú zadarmo:", + "These VMIDs are not free:": "Tieto VMID nie sú voľné:", "These are the changes that will be made": "Tieto zmeny sa vykonajú", "These changes were made in Proxmox outside ProxMenux:": "Tieto zmeny boli vykonané v Proxmox mimo ProxMenux:", "These container mount paths have an extension-like suffix:": "Tieto cesty pripojenia v kontajneri majú príponu podobnú koncovke súboru:", @@ -6836,7 +6922,7 @@ "These paths will not be restored live and will be extracted for manual recovery.": "Tieto cesty sa neobnovia za behu a rozbalia sa na ručnú obnovu.", "These settings require an application-specific adaptation. The image was not downloaded and the container was not recreated.": "Tieto nastavenia vyžadujú úpravu špecifickú pre aplikáciu. Obraz sa nestiahol a kontajner sa nevytvoril znova.", "These values are asked during the installation:": "Tieto hodnoty sa požadujú počas inštalácie:", - "They are described in the image documentation:": "Ich popis nájdete v dokumentácii image:", + "They are described in the image documentation:": "Ich popis nájdete v dokumentácii obrazu:", "They will be added to oci-compose before continuing. Unsupported or changed resources are not imported.": "Pred pokračovaním budú pridané do oci-compose. Nepodporované alebo zmenené zdroje sa neimportujú.", "They will be saved in oci-compose before continuing.": "Pred pokračovaním budú uložené v oci-compose.", "This CIFS share is mounted with restrictive permissions.": "Toto CIFS zdieľanie je pripojené s obmedzujúcimi oprávneniami.", @@ -6844,11 +6930,11 @@ "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:": "Túto aplikáciu zatiaľ nemožno znova zaregistrovať:", "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.", @@ -6858,8 +6944,8 @@ "This backup is encrypted.": "Táto záloha je šifrovaná.", "This backup was taken on kernel": "Táto záloha bola vytvorená na kerneli", "This cleanup will:": "Toto čistenie:", - "This container belongs to a stack; publish the whole stack": "Tento kontajner patrí do stohu; publikovať celý zásobník", - "This container belongs to a stack; recover the whole stack": "Tento kontajner patrí do stohu; obnoviť celý zásobník", + "This container belongs to a stack; publish the whole stack": "Tento kontajner patrí do zostavy; sprístupnite celú zostavu", + "This container belongs to a stack; recover the whole stack": "Tento kontajner patrí do aplikácie s viacerými kontajnermi; obnovte celú aplikáciu", "This container does not have apt-get. NFS client installation only supports Debian/Ubuntu containers.": "Tento kontajner nemá apt-get. Inštalácia NFS klienta je podporovaná iba v Debian/Ubuntu kontajneroch.", "This container does not have apt-get. Samba client installation only supports Debian/Ubuntu containers.": "Tento kontajner nemá apt-get. Inštalácia Samba klienta je podporovaná iba v Debian/Ubuntu kontajneroch.", "This container has no GPU configured. Coral TPU works best alongside hardware video decoding (Quick Sync, VA-API, NVENC) for apps like Frigate.": "Tento kontajner nemá nastavenú GPU. Coral TPU funguje najlepšie spolu s hardvérovým dekódovaním videa (Quick Sync, VA-API, NVENC) v aplikáciách ako Frigate.", @@ -6876,11 +6962,12 @@ "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 requires the host module": "Tento obrázok requires hostiteľský modul", + "This host runs {name} on {suite}, but these {name} repositories are for another suite: {details}. Disable or remove them in {ui} and run the update again; no repository changed.": "Na serveri beží {name} na vydaní {suite}, ale tieto repozitáre {name} sú pre iné vydanie: {details}. Vypnite alebo odstráňte ich v {ui} a spustite aktualizáciu znova; žiadny repozitár sa nezmenil.", + "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 obraz vyžaduje modul hostiteľa", "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:", "This installer will:": "Tento inštalátor urobí toto:", @@ -6891,8 +6978,8 @@ "This is a simple configuration change": "Ide o jednoduchú zmenu nastavenia", "This is an external community script maintained by": "Toto je externý komunitný skript, ktorý spravuje", "This is an external script that creates a macOS VM in Proxmox VE in just a few steps, whether you are using AMD or Intel hardware.": "Toto je externý skript, ktorý v Proxmox VE vytvorí VM s macOS v niekoľkých krokoch. Funguje na AMD aj Intel hardvéri.", - "This is not a coordinated stack": "Toto nie je koordinovaný stack", - "This is not a valid image reference:": "Toto nie je platný odkaz na obrázok:", + "This is not a coordinated stack": "Toto nie je aplikácia so spoločne spravovanými kontajnermi", + "This is not a valid image reference:": "Toto nie je platný odkaz na obraz:", "This is unexpected since credentials were validated.": "Toto je nečakané, pretože prihlasovacie údaje už boli overené.", "This is what ProxMenux understood from the": "To je to, čo ProxMenux pochopil z", "This is what the oci-compose installs:": "Toto nainštaluje oci-compose:", @@ -6906,7 +6993,7 @@ "This means the credentials are incorrect.": "To znamená, že prihlasovacie údaje nie sú správne.", "This menu requires Proxmox Backup Server.": "Táto ponuka vyžaduje Proxmox Backup Server.", "This might indicate network connectivity issues.": "Môže to znamenať problém so sieťovým pripojením.", - "This monitor uses a privileged LXC, shares processes and network with Proxmox and disables AppArmor in the CT. It uses the IP address and firewall of the host. A compromised image could affect the host; do not expose its web UI to the Internet.": "Tento monitor používa privilegovaný LXC, zdieľa procesy a sieť s Proxmox a vypne AppArmor v CT. Používa IP adresu a firewall hostiteľa. Kompromitovaný obraz by mohol mať vplyv na hostiteľa; nevystavujte svoje webové UI internetu.", + "This monitor uses a privileged LXC, shares processes and network with Proxmox and disables AppArmor in the CT. It uses the IP address and firewall of the host. A compromised image could affect the host; do not expose its web UI to the Internet.": "Tento monitor používa privilegovaný kontajner LXC, zdieľa procesy a sieť s Proxmoxom a vypína AppArmor v kontajneri. Používa IP adresu a firewall hostiteľa. Napadnutý obraz by mohol ohroziť hostiteľa. Jeho webové rozhranie nevystavujte na internet.", "This only removes the schedule. Existing backup archives are NOT deleted.": "Týmto sa odstráni iba plán. Existujúce zálohy NEBUDÚ vymazané.", "This operation may take several minutes and requires internet connectivity.": "Táto operácia môže trvať niekoľko minút a vyžaduje pripojenie na internet.", "This operation requires a Proxmox VE host. Use the PBS menu on Proxmox Backup Server.": "Táto operácia vyžaduje hostiteľa Proxmox VE. Na Proxmox Backup Serveri použite ponuku PBS.", @@ -6932,17 +7019,17 @@ "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 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 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.": "Táto aplikácia vyžaduje úpravy koreňového súborového systému, ktoré koordinovaná aktualizácia zatiaľ nevie zopakovať.", "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.", "This state indicates a high risk of passthrough failure due to": "Tento stav znamená vysoké riziko zlyhania passthrough pre", - "This template requests the host PID namespace, which has no validated safe LXC translation yet": "Táto šablóna vyžaduje PID formát hostiteľa, ktorý zatiaľ nemá overený bezpečný LXC preklad", + "This template requests the host PID namespace, which has no validated safe LXC translation yet": "Táto šablóna požaduje menný priestor PID hostiteľa, ktorý zatiaľ nemá overený bezpečný prevod do LXC", "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 variant requires the device": "Tento variant requires zariadenie", + "This translator only supports the Nextcloud stack": "Tento nástroj na prevod podporuje iba zostavu Nextcloud", + "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:", "This will add the mount to /etc/fstab so it persists after reboot.": "Týmto sa pripojenie pridá do /etc/fstab, takže zostane aj po reštarte.", @@ -6964,7 +7051,7 @@ "This will restart the network service and may cause a brief disconnection. Continue?": "Reštartuje sa sieťová služba a môže dôjsť ku krátkemu odpojeniu. Pokračovať?", "This will take time. Answer prompts carefully - see notes below.": "Bude to chvíľu trvať. Na otázky odpovedajte opatrne - pozrite poznámky nižšie.", "This will upgrade this node to Proxmox VE 9 on Debian Trixie.": "Týmto sa tento uzol aktualizuje na Proxmox VE 9 na Debiane Trixie.", - "Thunderbird is a free and open-source personal information manager primarily used as an e-mail client with a calendar and contactbook, as well as an RSS feed reader, chat client, and news client.": "Thunderbird je bezplatný a open-source personal information manager používaný predovšetkým ako e-mailový klient s kalendárom a kontaktnou knihou, rovnako ako RSS feed čítačka, chat klient, a novinky klient.", + "Thunderbird is a free and open-source personal information manager primarily used as an e-mail client with a calendar and contactbook, as well as an RSS feed reader, chat client, and news client.": "Thunderbird je bezplatný správca osobných informácií s otvoreným zdrojovým kódom. Slúži najmä ako e-mailový klient s kalendárom a adresárom kontaktov, ale aj ako čítačka RSS, chatový klient a klient diskusných skupín.", "Tick the paths to include in this backup. Press \"Add custom path\" to add a folder or file of your own to the list.": "Označte cesty, ktoré chcete zahrnúť do tejto zálohy. Stlačte \"Pridať vlastnú cestu\", ak chcete do zoznamu pridať vlastný priečinok alebo súbor.", "Tick the paths to remove (they will not be deleted from disk — only from this list):": "Označte cesty na odstránenie (z disku sa nevymažú - odstránia sa iba z tohto zoznamu):", "Time is up; Home Assistant OS could not be confirmed as running": "Čas vypršal; Home Assistant OS nebolo možné potvrdiť ako bežiace", @@ -7004,15 +7091,15 @@ "Tool output:": "Výstup nástroja:", "Tools": "Nástroje", "Top memory processes in CT": "Procesy s najväčšou spotrebou pamäte v CT", - "Top-level configs, secrets and other global options are not yet supported": "Najlepšie konfigy, tajomstvá a iné globálne možnosti zatiaľ nie sú podporované", - "Top-level volume options are not yet supported": "Najvyššie možnosti objemu zatiaľ nie sú podporované", + "Top-level configs, secrets and other global options are not yet supported": "Položky configs, secrets a ďalšie globálne voľby na najvyššej úrovni zatiaľ nie sú podporované", + "Top-level volume options are not yet supported": "Voľby dátových zväzkov na najvyššej úrovni zatiaľ nie sú podporované", "Total": "Spolu", "Total members:": "Počet členov:", "Total routes": "Počet trás", "Total size:": "Celková veľkosť:", "Transaction log:": "Záznam transakcií:", "Translation files:": "Prekladové súbory:", - "Transmission is designed for easy, powerful use. Transmission has the features you want from a BitTorrent client: encryption, a web interface, peer exchange, magnet links, DHT, µTP, UPnP and NAT-PMP port forwarding, webseed support, watch directories, tracker editing, global and per-torrent speed limits, and more.": "Transmission je určený pre jednoduché, výkonné použitie. Transmission má funkcie, ktoré chcete od BitTorrent klienta: šifrovanie, webové rozhranie, peer exchange, magnet odkazy, DHT, μTP, UPnP a NAT-PMP port forwarding, podpora webových seedov, sledovať adresáre, tracker editovanie, globálne a per-torrent rýchlostné limity, a ďalšie.", + "Transmission is designed for easy, powerful use. Transmission has the features you want from a BitTorrent client: encryption, a web interface, peer exchange, magnet links, DHT, µTP, UPnP and NAT-PMP port forwarding, webseed support, watch directories, tracker editing, global and per-torrent speed limits, and more.": "Transmission je ľahko ovládateľný klient BitTorrent s bohatými funkciami: šifrovaním, webovým rozhraním, výmenou partnerov, magnetickými odkazmi, DHT, µTP, presmerovaním portov cez UPnP a NAT-PMP, webovými zdrojmi, sledovaním adresárov, úpravou trackerov a spoločnými aj samostatnými limitmi rýchlosti torrentov.", "Tried pvesm path and manual detection methods": "Skúšal sa pvesm path aj ručné hľadanie", "Trust this certificate and save it for scheduled backups?": "Dôverovať tomuto certifikátu a uložiť ho pre naplánované zálohy?", "Try Again": "Skúsiť znova", @@ -7022,7 +7109,7 @@ "Try automatic repair of detected issues": "Skúsiť automatickú opravu zistených problémov", "Try username and password authentication.": "Vyskúšajte overenie používateľského mena a hesla.", "Tvheadend works as a proxy server: is a TV streaming server and recorder for Linux, FreeBSD and Android supporting DVB-S, DVB-S2, DVB-C, DVB-T, ATSC, ISDB-T, IPTV, SAT>IP and HDHomeRun as input sources.": "Tvheadend funguje ako proxy server: je televízny streamovací server a záznamník pre Linux, FreeBSD a Android podporujúci DVB-S, DVB-S2, DVB-C, DVB-T, ATSC, ISDB-T, IPTV, SAT>IP a HDHomeRun ako vstupné zdroje.", - "Twingate Connector for self-hosted server": "Twingate Connector pre self-hosted server", + "Twingate Connector for self-hosted server": "Twingate Connector pre vlastný server", "Two-factor authentication and backup codes will be removed.": "Dvojfaktorové overenie a záložné kódy sa odstránia.", "Type": "Typ", "Type the device path EXACTLY to confirm formatting:": "Na potvrdenie formátovania zadajte PRESNÚ cestu zariadenia:", @@ -7032,7 +7119,7 @@ "Typed value does not match selected disk. Operation cancelled.": "Zadaná hodnota sa nezhoduje s vybraným diskom. Operácia bola zrušená.", "UID in CT": "UID v CT", "UID of the plex user (also owner of the GPU device)": "UID používateľa plex (tiež majiteľ zariadenia GPU)", - "UID that Emby runs as": "UID, že Emby beží ako", + "UID that Emby runs as": "UID používateľa, pod ktorým beží Emby", "UPGRADE PROMPTS - RECOMMENDED ANSWERS:": "OTÁZKY PRI AKTUALIZÁCII - ODPORÚČANÉ ODPOVEDE:", "UPS monitoring and power outage notification system": "Systém monitorovania UPS a oznamovania výpadku napájania", "USB Accelerators:": "USB akcelerátory:", @@ -7050,7 +7137,7 @@ "Udev rules for Coral USB devices added and rules reloaded.": "Udev pravidlá pre Coral USB zariadenia boli pridané a znovu načítané.", "Udev rules for Coral USB devices already exist.": "Udev pravidlá pre Coral USB zariadenia už existujú.", "Udev rules for Coral USB devices appended and rules reloaded.": "Udev pravidlá pre Coral USB zariadenia boli doplnené a znovu načítané.", - "UltiMaker Cura is free, easy-to-use 3D printing software trusted by millions of users. Fine-tune your 3D model with 400+ settings for the best slicing and printing results.": "UltiMaker Cura je bezplatný, ľahko použiteľný 3D tlačový softvér dôveryhodný miliónom užívateľov. Vyrovnajte svoj 3D model s nastavením 400+ pre najlepšie výsledky krájania a tlače.", + "UltiMaker Cura is free, easy-to-use 3D printing software trusted by millions of users. Fine-tune your 3D model with 400+ settings for the best slicing and printing results.": "UltiMaker Cura je bezplatný a ľahko použiteľný softvér na 3D tlač, ktorému dôverujú milióny používateľov. Viac ako 400 nastavení umožňuje doladiť prípravu vrstiev modelu a výsledok tlače.", "Umbrel OS installer script by Helper Scripts\n\nVisit the GitHub repo to learn more, contribute, or support the project:\n\nhttps://community-scripts.github.io/ProxmoxVE/scripts?id=umbrel-os-vm": "Inštalačný skript Umbrel OS od Helper Scripts\n\nNavštívte GitHub repozitár, kde nájdete viac informácií, môžete prispieť alebo podporiť projekt:\n\nhttps://community-scripts.github.io/ProxmoxVE/scripts?id=umbrel-os-vm", "Unable to detect Proxmox version": "Nepodarilo sa zistiť verziu Proxmoxu", "Unable to detect Proxmox version.": "Nepodarilo sa zistiť verziu Proxmoxu.", @@ -7061,9 +7148,9 @@ "Unapplied changes": "Nepoužité zmeny", "Understand the security implications of privileged containers": "Uistite sa, že rozumiete bezpečnostným dôsledkom privilegovaných kontajnerov", "Unexpected Proxmox inventory; recovery blocked": "Neočakávaný inventár Proxmox; zablokovaná obnova", - "Unexpected formatting directory in the new Valkey volume": "Neočakávaný formátovanie adresára v novom hlasitosti Valkey", - "Ungoogled Chromium is Google Chromium, sans dependency on Google web services.": "Ungoogled Chromium je Google Chromium, sans závislosti na webových služieb Google.", - "Unified LLM Fine-Tuning with 100+ Models": "Unified LLM Fine-Tuning s 100+ Models", + "Unexpected formatting directory in the new Valkey volume": "Neočakávaný adresár vytvorený formátovaním v novom dátovom zväzku Valkey", + "Ungoogled Chromium is Google Chromium, sans dependency on Google web services.": "Ungoogled Chromium je Chromium bez závislosti od webových služieb Google.", + "Unified LLM Fine-Tuning with 100+ Models": "Jednotné dolaďovanie viac ako 100 jazykových modelov LLM", "Uninstall Coral drivers and configuration": "Odinštalovať ovládače a nastavenie Coral", "Uninstall Fail2Ban": "Odinštalovať Fail2Ban", "Uninstall Lynis": "Odinštalovať Lynis", @@ -7094,7 +7181,7 @@ "Unknown CPU vendor. Cannot determine IOMMU parameter.": "Neznámy výrobca CPU. Parameter IOMMU sa nedá určiť.", "Unknown GPU": "Neznáma GPU", "Unknown adapter role": "Neznáma úloha adaptéra", - "Unknown credential service:": "Neznámy credential servis:", + "Unknown credential service:": "Neznáma služba pre prihlasovací údaj:", "Unknown dependency:": "Neznáma závislosť:", "Unknown host monitor": "Neznámy monitor hostiteľa", "Unknown model": "Neznámy model", @@ -7113,9 +7200,9 @@ "Unmounting": "Odpájam", "Unmounting disk...": "Odpájam disk...", "Unpackerr configured": "Konfigurovaný Unpackerr", - "Unpackerr has no web interface and extracts nothing until it is pointed at a Starr application. Uncomment the [sonarr.0] or [radarr.0] section in /config/unpackerr.conf inside the container, set its url and api_key, then restart the container.": "Unpackerr nemá webové rozhranie a nič nevyberá, kým nie je namierená na Starr aplikáciu. Odpojte časť [sonarr.0] alebo [radarr.0] v časti /config/unpackerr.conf vo vnútri kontajnera, nastavte jeho url a api key, potom znovu reštartujte kontajner.", - "Unpackerr requires Sonarr, Radarr or Lidarr in this suite": "Unpackerr requires Sonarr, Radarr alebo Lidarr v tomto súbore", - "Unpackerr stopped during its first start": "Unpackerr zastavil počas svojho prvého štartu", + "Unpackerr has no web interface and extracts nothing until it is pointed at a Starr application. Uncomment the [sonarr.0] or [radarr.0] section in /config/unpackerr.conf inside the container, set its url and api_key, then restart the container.": "Unpackerr nemá webové rozhranie a nerozbaľuje nič, kým ho neprepojíte s aplikáciou Starr. V /config/unpackerr.conf v kontajneri odkomentujte sekciu [sonarr.0] alebo [radarr.0], nastavte url a api_key a kontajner reštartujte.", + "Unpackerr requires Sonarr, Radarr or Lidarr in this suite": "Unpackerr v tejto zostave vyžaduje Sonarr, Radarr alebo Lidarr", + "Unpackerr stopped during its first start": "Unpackerr sa počas prvého spustenia zastavil", "Unprivileged": "Neprivilegovaný", "Unprivileged Container Access": "Prístup neprivilegovaného kontajnera", "Unprivileged container": "Neprivilegovaný kontajner", @@ -7127,55 +7214,57 @@ "Unrecognized Immich adapter": "Nerozpoznaný adaptér Immich", "Unrecognized adaptation format": "Nerozpoznaný formát adaptácie", "Unrecognized adaptation recipe": "Nerozpoznaný adaptačný recept", - "Unrecognized dependency order of the stack:": "Nerozpoznané poradie závislosti stohu:", + "Unrecognized dependency order of the stack:": "Nerozpoznané poradie závislostí aplikácie:", "Unrecognized host monitor profile": "Nerozpoznaný profil monitora hostiteľa", "Unrecognized native configuration": "Nerozpoznaná natívna konfigurácia", "Unrecognized qBittorrent configuration format": "Nerozpoznaný formát konfigurácie qBittorrent", - "Unrecognized stack adapter or role": "Nerozpoznaný stack adaptér alebo role", - "Unrecognized stack adapter:": "Nerozpoznaný zásobník adaptér:", - "Unrecognized stack structure:": "Nerozpoznaná štruktúra stohu:", - "Unrecognized volume definition": "Nerozpoznaná definícia objemu", + "Unrecognized stack adapter or role": "Nerozpoznaný adaptér alebo úloha kontajnera v zostave", + "Unrecognized stack adapter:": "Nerozpoznaný adaptér aplikácie s viacerými kontajnermi:", + "Unrecognized stack structure:": "Nerozpoznaná štruktúra aplikácie s viacerými kontajnermi:", + "Unrecognized volume definition": "Nerozpoznaná definícia dátového zväzku", "Unresolved variable:": "Nevyriešená premenná:", "Unsafe OCI archive path": "Nebezpečná cesta k archívu OCI", - "Unsafe dependency contract": "Zmluva o neistej závislosti", - "Unsafe dependency hook contract": "Zmluva o nebezpečnom háku", + "Unsafe dependency contract": "Nebezpečné nastavenie závislostí", + "Unsafe dependency hook contract": "Nebezpečné nastavenie spúšťacieho skriptu závislostí", "Unsafe instance directory": "Nebezpečný priečinok inštancie", - "Unsafe instance record": "Nebezpečný záznam o udalosti", + "Unsafe instance record": "Nebezpečný záznam inštancie", "Unsafe journal or lock file": "Nebezpečný súbor denníka alebo zámku", "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", - "Unsafe stack assembly": "Nebezpečná montáž zásobníka", - "Unsafe volume path": "Nebezpečná trasa objemu", + "Unsafe stack assembly": "Nebezpečné zostavenie aplikácie", + "Unsafe volume path": "Nebezpečná cesta dátového zväzku", "Unsupported CPU allocation mode:": "Nepodporovaný režim prideľovania CPU:", "Unsupported GID strategy:": "Nepodporovaná stratégia GID:", "Unsupported NVIDIA mode:": "Nepodporovaný režim NVIDIA:", - "Unsupported OCI digest:": "Nepodporovaná digescia OCI:", + "Unsupported OCI digest:": "Nepodporovaný identifikátor digest OCI:", "Unsupported OCI-LXC AppArmor profile:": "Nepodporovaný profil OCI-LXC AppArmor:", "Unsupported OCI-LXC seccomp profile:": "Nepodporovaný profil OCI-LXC seccomp:", + "Unsupported Proxmox suite; no repository changed.": "Nepodporované vydanie Proxmoxu; žiadny repozitár sa nezmenil.", "Unsupported Terminal": "Nepodporovaný terminál", "Unsupported architecture for Figurine:": "Nepodporovaná architektúra pre Figurine:", "Unsupported architecture:": "Nepodporovaná architektúra:", "Unsupported backup compression": "Nepodporovaná kompresia zálohy", - "Unsupported credential pattern:": "Nepodporovaný credential vzor:", + "Unsupported credential pattern:": "Nepodporovaný vzor prihlasovacích údajov:", "Unsupported declarative ostype:": "Nepodporovaný deklaratívny typ os:", "Unsupported device GID strategy": "Stratégia GID nepodporovaného zariadenia", "Unsupported device options": "Nepodporované možnosti zariadenia", "Unsupported device type:": "Nepodporovaný typ zariadenia:", "Unsupported dynamic NVIDIA capabilities:": "Nepodporované dynamické schopnosti NVIDIA:", "Unsupported format. Only .ova and .ovf files are supported.": "Nepodporovaný formát. Podporované sú iba .ova a .ovf súbory.", + "Unsupported host architecture:": "Nepodporovaná architektúra hostiteľa:", "Unsupported kept setting:": "Nepodporované uchované nastavenie:", - "Unsupported media storage mode:": "Nepodporovaný režim pamäťového média:", + "Unsupported media storage mode:": "Nepodporovaný režim úložiska médií:", "Unsupported mount options": "Nepodporované možnosti pripojenia", "Unsupported mount type": "Nepodporovaný typ pripojenia", "Unsupported mount type:": "Nepodporovaný typ pripojenia:", - "Unsupported native device type:": "Nepodporovaný natívne typ zariadenia:", + "Unsupported native device type:": "Nepodporovaný natívny typ zariadenia:", "Unsupported network settings": "Nepodporované sieťové nastavenia", - "Unsupported operation": "Nepodporovaná operation", + "Unsupported operation": "Nepodporovaná operácia", "Unsupported or unknown Proxmox version; no repository changed.": "Nepodporovaná alebo neznáma verzia Proxmox; žiadne úložisko sa nezmenilo.", "Unsupported output format:": "Nepodporovaný výstupný formát:", "Unsupported owner strategy:": "Nepodporovaná stratégia vlastníka:", @@ -7183,16 +7272,16 @@ "Unsupported pre-start check:": "Nepodporovaná kontrola pred začiatkom:", "Unsupported pre-start repair:": "Nepodporovaná oprava pred štartom:", "Unsupported prlimit resource": "Nepodporovaný prlimit zdroj", - "Unsupported secret generator:": "Nepodporovaný tajný generátor:", + "Unsupported secret generator:": "Nepodporovaný generátor tajných údajov:", "Unsupported storage mode:": "Nepodporovaný režim skladovania:", "Unsupported tmpfs options": "Nepodporované možnosti tmpfs", - "Unsupported volume options:": "Nepodporované možnosti objemu:", + "Unsupported volume options:": "Nepodporované voľby dátového zväzku:", "Until they are registered again they cannot be updated or managed from here. The recovery checks first that everything they need is on this host and changes nothing otherwise.": "Kým nie sú znova zaregistrované, nemožno ich aktualizovať ani spravovať odtiaľto. Obnova najprv skontroluje, či všetko, čo potrebujú, je na tomto hostiteľovi a inak nič nezmení.", "Until they are registered again they cannot be updated or managed from here. The recovery checks first that everything they need is on this host; an application that lacks something is not registered.": "Kým nie sú znova zaregistrované, nemožno ich aktualizovať ani spravovať odtiaľto. Obnova najprv skontroluje, či všetko, čo potrebujú, je na tomto hostiteľovi; aplikácia, ktorej niečo chýba, nie je zaregistrovaná.", - "Until they are registered again they cannot be updated or managed from here. The recovery checks first what prevents their registration; an application with such a problem is not registered. A Rclone mount that has to be enabled again does not prevent it, but then the applications are not started automatically.": "Kým nie sú znova zaregistrované, nemožno ich aktualizovať ani spravovať odtiaľto. Obnova najprv skontroluje, čo bráni ich registrácii; aplikácia s takýmto problémom nie je zaregistrovaná. Pripojenie Rclone, ktoré je potrebné znova povoliť, tomu nebráni, ale aplikácie sa potom nespúšťajú automaticky.", - "Untrusted or modified NVIDIA hook": "Nespoľahlivý alebo modifikovaný háčik NVIDIA", - "Unused image removed from the cache:": "Nevyužitý obrázok odstránený z vyrovnávacej pamäte:", - "Unused images removed from the cache:": "Nepoužité obrázky odstránené z vyrovnávacej pamäte:", + "Until they are registered again they cannot be updated or managed from here. The recovery checks first what prevents their registration; an application with such a problem is not registered. A Rclone mount that has to be enabled again does not prevent it, but then the applications are not started automatically.": "Kým nie sú znova zaregistrované, nemožno ich odtiaľto aktualizovať ani spravovať. Pred opätovnou registráciou sa skontroluje, čo jej bráni. Aplikácia s takýmto problémom sa nezaregistruje. Pripojenie Rclone, ktoré treba znova povoliť, registrácii nebráni, ale aplikácie sa potom nespúšťajú automaticky.", + "Untrusted or modified NVIDIA hook": "Nedôveryhodný alebo zmenený spúšťací skript NVIDIA", + "Unused image removed from the cache:": "Nepoužívaný obraz odstránený z vyrovnávacej pamäte:", + "Unused images removed from the cache:": "Nepoužívané obrazy odstránené z vyrovnávacej pamäte:", "Update": "Aktualizácia", "Update Available": "Dostupná aktualizácia", "Update Ceph repository (Only if using Ceph):": "Aktualizujte Ceph repozitár (iba ak používate Ceph):", @@ -7200,8 +7289,8 @@ "Update Export": "Aktualizovať export", "Update Lynis to latest version": "Aktualizovať Lynis na najnovšiu verziu", "Update NVIDIA in LXC Containers": "Aktualizovať NVIDIA v LXC kontajneroch", - "Update OCI": "Aktualizovať OCI", - "Update OCI stack": "Aktualizovať OCI stack", + "Update OCI": "Aktualizovať aplikáciu", + "Update OCI stack": "Aktualizovať aplikáciu s viacerými kontajnermi", "Update PBS using configured repositories": "Aktualizovať PBS pomocou nakonfigurovaných repozitárov", "Update PVE enterprise repository (Only if using enterprise):": "Aktualizujte PVE enterprise repozitár (iba ak používate enterprise):", "Update Proxmox VE Appliance Manager": "Aktualizovať správcu aplikácií Proxmox VE", @@ -7213,19 +7302,20 @@ "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?", + "Update now?": "Spustiť aktualizáciu?", "Update package index:": "Aktualizujte index balíkov:", - "Update prepared": "Aktualizácia", + "Update prepared": "Aktualizácia je pripravená", "Update selected OCI applications": "Aktualizovať vybrané aplikácie OCI", "Update system to latest PVE 8.4+ (if not done already):": "Aktualizujte systém na najnovšie PVE 8.4+ (ak to ešte nie je hotové):", - "Update the image with the saved configuration": "Aktualizovať obrázok pomocou uloženej konfigurácie", - "Update the whole stack?": "Aktualizovať celú kopu?", + "Update the image with the saved configuration": "Aktualizovať obraz s uloženými nastaveniami", + "Update the whole stack?": "Aktualizovať celú aplikáciu?", + "Update, modify or recreate one installed OCI instance": "Aktualizovať, upraviť alebo znova vytvoriť jednu nainštalovanú inštanciu OCI", "Updated": "Aktualizované", "Updated sharedfiles group to GID: 101000": "Skupina sharedfiles bola aktualizovaná na GID: 101000", - "Updated stack checked": "Aktualizovaný stack", + "Updated stack checked": "Aktualizovaná aplikácia je skontrolovaná", "Updated:": "Aktualizované:", "Updates all Proxmox and Debian packages": "Aktualizuje všetky balíky Proxmoxu a Debianu", "Updates and Packages Commands": "Príkazy pre aktualizácie a balíky", @@ -7257,7 +7347,7 @@ "Upgrade assistant: Proxmox VE 8 → 9 (Trixie)": "Asistent aktualizácie: Proxmox VE 8 → 9 (Trixie)", "Upgrade canceled by user": "Aktualizácia zrušená používateľom", "Upgrade one node at a time": "Aktualizujte vždy iba jeden uzol naraz", - "Upgrade the system, offering the": "Aktualizujte systém a ponúknite", + "Upgrade the system, offering the": "Aktualizácia systému a prípadný prechod na", "Upgrade to Proxmox VE 9": "Aktualizovať na Proxmox VE 9", "Upgrading NVIDIA utils (Arch)...": "Aktualizujem NVIDIA nástroje (Arch)...", "Upload an encrypted copy of the key to PBS so you can recover it on a reinstalled host with just a passphrase?": "Nahrať šifrovanú kópiu kľúča do PBS, aby ste ju vedeli obnoviť na preinštalovanom hostovi iba pomocou frázy?", @@ -7286,7 +7376,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é", @@ -7302,7 +7392,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:", @@ -7317,13 +7407,13 @@ "User chose to exit for manual backup creation.": "Používateľ ukončil akciu, aby mohol ručne vytvoriť zálohu.", "User name for the SSH login": "Užívateľské meno pre prihlásenie SSH", "User name of the administrator of the web interface": "Užívateľské meno správcu webového rozhrania", - "User name of the deprecated Flowise application login (only read by Flowise versions before 3.0.1)": "Užívateľské meno depreciovaného prihlasovacieho protokolu aplikácie Flowise (prečítané iba verziami Flowise pred 3.0.1)", + "User name of the deprecated Flowise application login (only read by Flowise versions before 3.0.1)": "Používateľské meno zastaraného prihlasovania aplikácie Flowise (používajú iba verzie pred 3.0.1)", "User of the AdGuard Home that receives the settings": "Užívateľ AdGuard Home, ktorý prijíma nastavenia", "User of the MariaDB server": "Používateľ servera MariaDB", "User of the PostgreSQL server": "Používateľ servera PostgreSQL", "User of the database server (mysql and pgsql only)": "Používateľ databázového servera (iba mysql a pgsql)", "User of the main AdGuard Home": "Užívateľ hlavného AdGuard Home", - "User-friendly WebUI for LLMs (Formerly Ollama WebUI)": "Užívateľsky prívetivé WebUI pre LLM (predovšetkým Ollama WebUI)", + "User-friendly WebUI for LLMs (Formerly Ollama WebUI)": "Používateľsky prívetivé webové rozhranie pre LLM (predtým Ollama WebUI)", "Username": "Používateľské meno", "Username (e.g. root@pam or user@pbs!token):": "Používateľské meno (napr. root@pam alebo user@pbs!token):", "Username / token": "Používateľské meno / token", @@ -7338,7 +7428,7 @@ "Using advanced configuration": "Používa sa pokročilé nastavenie", "Using default Proxmox logo...": "Používam predvolené logo Proxmoxu...", "Using existing encryption key:": "Používa sa existujúci šifrovací kľúč:", - "Using the image verified by the transaction": "Použitie obrázku overené transakcie", + "Using the image verified by the transaction": "Používa sa obraz overený transakciou", "Using the verified image from the cache": "Použitie overeného obrazu z vyrovnávacej pamäte", "Utilities": "Nástroje", "Utilities Installation Menu": "Menu inštalácie nástrojov", @@ -7347,7 +7437,7 @@ "Utilities and Tools": "Nástroje", "Utilities installation completed": "Inštalácia nástrojov je dokončená", "Utilities installed by ProxMenux have been removed": "Pomôcky nainštalované používateľom ProxMenux boli odstránené", - "VA-API driver": "Vodič VA-API", + "VA-API driver": "Ovládač VA-API", "VA-API render device": "VA-API vykresľovacie zariadenie", "VA-API video acceleration": "VA-API video zrýchlenie", "VFIO device IDs removed from /etc/modprobe.d/vfio.conf": "ID VFIO zariadení boli odstránené z /etc/modprobe.d/vfio.conf", @@ -7359,7 +7449,7 @@ "VFIO orphans cleared but initramfs rebuild failed; check /var/log/proxmenux logs.": "Osirelé VFIO väzby boli vyčistené, ale znovuvytvorenie initramfs zlyhalo; skontrolujte záznamy v /var/log/proxmenux.", "VFS cache mode": "Režim vyrovnávacej pamäte VFS", "VLAN": "VLAN", - "VLC Media Player is a free and open source cross-platform multimedia player and framework that delivers dependable performance across multiple devices.": "VLC Médiá Hráč je voľný a otvorený zdroj multimediálneho prehrávača a rámca, ktorý poskytuje spoľahlivý výkon vo viacerých zariadeniach.", + "VLC Media Player is a free and open source cross-platform multimedia player and framework that delivers dependable performance across multiple devices.": "VLC Media Player je bezplatný multiplatformový multimediálny prehrávač a rámec s otvoreným zdrojovým kódom, ktorý poskytuje spoľahlivý výkon na rôznych zariadeniach.", "VM": "VM", "VM Conflict Policy": "Riešenie konfliktu VM", "VM ID": "ID VM", @@ -7393,17 +7483,17 @@ "VMID in use": "VMID sa už používa", "VMID must be a number.": "VMID musí byť číslo.", "VMID of the Borg server LXC on": "VMID Borg server LXC na", - "VMID of the Rclone OCI container": "VMID nádoby Rclone OCI", + "VMID of the Rclone OCI container": "VMID OCI kontajnera Rclone", "VMs to destroy:": "VM na zničenie:", "VMs, LXCs, network, /etc/pve, users, cron, packages, drivers, ProxMenux state, etc.": "VM, LXC, sieť, /etc/pve, používatelia, cron, balíky, ovládače, stav ProxMenux atď.", - "VS Code is an integrated development environment developed by Microsoft. This container runs the full desktop application, for a web native version see Code Server.": "VS Code je integrované vývojové prostredie vyvinuté spoločnosťou Microsoft. Tento kontajner spúšťa plnú desktopovú aplikáciu, pre web natívne verziu pozri Code Server.", - "VSCodium is a community-driven, freely-licensed binary distribution of Microsoft’s editor VS Code.": "VSCodium je komunita-riadený, voľne licencované binárne distribúcie Microsoft a editor VS Kód.", + "VS Code is an integrated development environment developed by Microsoft. This container runs the full desktop application, for a web native version see Code Server.": "VS Code je integrované vývojové prostredie od Microsoftu. Tento kontajner spúšťa úplnú desktopovú aplikáciu. Verziu určenú priamo pre web nájdete pod názvom Code Server.", + "VSCodium is a community-driven, freely-licensed binary distribution of Microsoft’s editor VS Code.": "VSCodium je komunitne spravovaná binárna distribúcia editora VS Code od Microsoftu so slobodnou licenciou.", "Valid backups for all VMs/CTs": "Platné zálohy všetkých VM/CT", "Validating Proxmox 9 repositories (checking 'proxmox-ve' candidate)...": "Overujem Proxmox 9 repozitáre (kontrolujem kandidáta 'proxmox-ve')...", "Validating credentials with server": "Overujem prihlasovacie údaje na serveri", "Validating disk safety...": "Overujem bezpečnosť disku...", - "Validation method: http (port 80 forwarded) or dns (DNS provider plugin)": "Validačná metóda: http (port 80 expedované) alebo dns (DNS modul poskytovateľa)", - "Value for": "Hodnota", + "Validation method: http (port 80 forwarded) or dns (DNS provider plugin)": "Spôsob overenia: http (presmerovaný port 80) alebo dns (doplnok poskytovateľa DNS)", + "Value for": "Hodnota pre", "Variable name": "Názov premennej", "Variables": "Premenné", "Variables the installation asks for:": "Premenné, ktoré požaduje inštalácia:", @@ -7415,7 +7505,7 @@ "Verify Options > OS Type — currently set to:": "Overte Options > OS Type - aktuálne nastavené na:", "Verify PVE version (must be 8.4.1 or newer):": "Overte verziu PVE (musí byť 8.4.1 alebo novšia):", "Verify active exports:": "Overiť aktívne exporty:", - "Verify bridge assignment and NIC model — change to VirtIO if guest drivers are available": "Overte priradenie bridgu a model sieťovej karty - ak sú v hosťovi dostupné ovládače, zmeňte na VirtIO", + "Verify bridge assignment and NIC model — change to VirtIO if guest drivers are available": "Overte priradenie sieťového mosta (bridge) a model sieťovej karty - ak sú v hosťovi dostupné ovládače, zmeňte na VirtIO", "Verify iSCSI sessions and storage status:": "Overiť iSCSI relácie a stav úložiska:", "Verify inside container:": "Overiť vo vnútri kontajnera:", "Verify installations": "Overiť inštalácie", @@ -7435,7 +7525,7 @@ "Version:": "Verzia:", "Version: Auto-negotiation (NFSv3/NFSv4)": "Verzia: automatické dohodnutie (NFSv3/NFSv4)", "Versions shown belong to maintained NVIDIA branches that list your GPU PCI ID and are new enough to build against the running kernel. DKMS compilation is the final validation. The recommended version keeps the current branch, or uses the NVIDIA Production Branch on a fresh install.": "Zobrazené verzie patria do udržiavaných pobočiek NVIDIA, ktoré uvádzajú vaše ID PCI GPU a sú dostatočne nové na to, aby sa dali postaviť proti bežiacemu jadru. Kompilácia DKMS je konečným overením. Odporúčaná verzia ponecháva aktuálnu vetvu alebo používa NVIDIA Production Branch pri novej inštalácii.", - "Video acceleration and object detection are independent choices; the installer does not write camera or detector YAML.": "Video zrýchlenie a detekcia objektu sú nezávislé voľby; inštalátor nepíše fotoaparát alebo detektor YAML.", + "Video acceleration and object detection are independent choices; the installer does not write camera or detector YAML.": "Zrýchlenie videa a detekcia objektov sú nezávislé voľby. Inštalačný sprievodca nezapisuje nastavenia kamier ani detektorov do YAML.", "Video transcoding acceleration": "Zrýchlenie priepustnosti videa", "Video transcoding profile not implemented:": "Profil transkódovania videa nie je implementovaný:", "View CIFS Mounts (pvesm + fstab)": "Zobraziť CIFS mounty (pvesm + fstab)", @@ -7453,7 +7543,7 @@ "View raw VM configuration file": "Zobraziť konfiguračný súbor VM", "View restore plan": "Zobraziť plán obnovy", "View self-test log": "Zobraziť log samo-testu", - "View status": "Stav zobrazenia", + "View status": "Zobraziť stav", "VirtIO (advanced - high performance)": "VirtIO (pokročilé - vysoký výkon)", "VirtIO ISO not found after selection.": "Po výbere sa VirtIO ISO nenašlo.", "VirtIO ISO selection cancelled.": "Výber VirtIO ISO bol zrušený.", @@ -7474,14 +7564,15 @@ "Visit https://osx-proxmox.com for more information.": "Viac informácií nájdete na https://osx-proxmox.com.", "Visit the website to discover more scripts, stay updated with the latest updates, and support the project:": "Navštívte web, kde nájdete ďalšie skripty, novinky a môžete podporiť projekt:", "Visit the website to discover more scripts, stay updated with the latest updates, and support the project:\n\nhttps://community-scripts.github.io/ProxmoxVE": "Navštívte web, kde nájdete ďalšie skripty, novinky a môžete podporiť projekt:\n\nhttps://community-scripts.github.io/ProxmoxVE", - "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", - "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é", - "Vscodium-web is a community-driven, freely-licensed binary distribution of the remote host web component of Microsoft's editor VS Code.": "Vscodium-web je komunitne riadený, voľne licencovaná binárna distribúcia vzdialenej webovej zložky Microsoft editor VS Code.", + "Vivaldi is a Norwegian freeware, cross-platform web browser with a built-in email client developed by Vivaldi Technologies.": "Vivaldi je bezplatný multiplatformový webový prehliadač so vstavaným e-mailovým klientom, ktorý vyvíja nórska spoločnosť Vivaldi Technologies.", + "Volume configuration cancelled": "Nastavenie dátového úložiska bolo zrušené", + "Volume options are not yet supported": "Voľby dátových zväzkov zatiaľ nie sú podporované", + "Volume size in GB": "Veľkosť dátového disku v GB", + "Volumes": "Dátové zväzky", + "Volumes attached": "Dátové zväzky sú pripojené", + "Volumes prepared for the first start:": "Dátové zväzky pripravené na prvé spustenie:", + "Volumes shared between services are not yet supported": "Dátové zväzky zdieľané medzi službami zatiaľ nie sú podporované", + "Vscodium-web is a community-driven, freely-licensed binary distribution of the remote host web component of Microsoft's editor VS Code.": "VSCodium Web je komunitne spravovaná binárna distribúcia vzdialenej webovej súčasti editora VS Code od Microsoftu so slobodnou licenciou.", "Vulnerability detection": "hľadania zraniteľností", "WARNING": "UPOZORNENIE", "WARNING — This backup contains paths that are risky to restore on a running system:": "UPOZORNENIE - táto záloha obsahuje cesty, ktoré je rizikové obnovovať na bežiacom systéme:", @@ -7506,7 +7597,7 @@ "WARNING: this will ERASE EVERYTHING on the disk.": "UPOZORNENIE: týmto sa VYMAŽE VŠETKO na disku.", "WEB UI to manage WireGuard VPN.": "WEB UI pre správu WireGuard VPN.", "WILL BE PERMANENTLY ERASED.": "BUDÚ NATRVALO VYMAZANÉ.", - "WPS Office is a lightweight, feature-rich comprehensive office suite with high compatibility. As a handy and professional office software, WPS Office allows you to edit files in Writer, Presentation, Spreadsheet, and PDF to improve your work efficiency.": "WPS Office je ľahký, vybavený komplexný kancelársky apartmán s vysokou kompatibilitou. Ako praktický a profesionálny kancelársky softvér vám WPS Office umožňuje upravovať súbory v programe Writer, Prezentácia, Spreadsheet, a PDF pre zlepšenie vašej pracovnej efektívnosti.", + "WPS Office is a lightweight, feature-rich comprehensive office suite with high compatibility. As a handy and professional office software, WPS Office allows you to edit files in Writer, Presentation, Spreadsheet, and PDF to improve your work efficiency.": "WPS Office je nenáročný kancelársky balík s množstvom funkcií a vysokou kompatibilitou. Umožňuje efektívne upravovať textové dokumenty, prezentácie, tabuľky a súbory PDF.", "Wait for each node to complete before starting next": "Pred začiatkom ďalšieho uzla počkajte, kým aktuálny skončí", "Waiting for Home Assistant OS...": "Čakám na Home Assistant OS...", "Waiting for the FUSE mount:": "Čakám na FUSE mount:", @@ -7526,7 +7617,7 @@ "Watchdog (on): restart the application when it crashes": "Watchdog (zapnutý): reštartovať aplikáciu, keď zlyhá", "Watchdog disabled.": "Watchdog vypnutý.", "Watchdog enabled: the application is restarted when it crashes.": "Watchdog zapnutý: aplikácia sa pri zlyhaní reštartuje.", - "WeKnora is an LLM-powered framework designed for deep document understanding and semantic retrieval, especially for handling complex, heterogeneous documents.": "WeKnora je LLM-poháňaný rámec určený pre hlboké pochopenie dokumentov a sémantické vyhľadávanie, najmä pre manipuláciu complex, heterogénne dokumenty.", + "WeKnora is an LLM-powered framework designed for deep document understanding and semantic retrieval, especially for handling complex, heterogeneous documents.": "WeKnora je rámec využívajúci veľké jazykové modely (LLM) na dôkladné porozumenie dokumentom a sémantické vyhľadávanie, najmä v zložitých dokumentoch rôzneho typu.", "Web UI": "Web UI", "Web UI 1": "Web UI 1", "Web UI 2": "Web UI 2", @@ -7536,18 +7627,18 @@ "Web address of the AdGuard Home that receives the settings (e.g. http://192.168.1.3)": "Webová adresa AdGuard Home, ktorá prijíma nastavenia (napr. http://192.168.1.3)", "Web address of the main AdGuard Home, whose settings are copied (e.g. http://192.168.1.2)": "Webová adresa hlavného AdGuard Home, ktorého nastavenia sú kopírované (napr. http://192.168.1.2)", "Web interface to manage devices running Tasmota firmware.": "Webové rozhranie pre správu zariadení bežiacich na Tasmota firmware.", - "WebCord can be summarized as a pack of security and privacy hardenings, Discord features reimplementations, Electron / Chromium / Discord bugs workarounds, stylesheets, internal pages and wrapped https://discord.com page, designed to conform with ToS as much as it is possible (or hide the changes that might violate it from Discord's eyes).": "WebCord možno zhrnúť ako balík bezpečnostných a súkromia kalenie, Discord funkcie reimplementácie, Electron / Chromium / Discord chyby práce, štýlové listy, vnútorné stránky a zabalené https://discord.com stránky, navrhnutý tak, aby zodpovedali ToS tak, ako je to možné (alebo skryť zmeny, ktoré by mohli porušovať z očí Discord).", - "Webgrabplus is a multi-site incremental xmltv epg grabber. It collects tv-program guide data from selected tvguide sites for your favourite channels.": "Webgrabplus je multi-site prírastkové xmltv epg grabber. Zhromažďuje tv-program sprievodcu dátami z vybraných tvguide stránok pre vaše obľúbené kanály.", + "WebCord can be summarized as a pack of security and privacy hardenings, Discord features reimplementations, Electron / Chromium / Discord bugs workarounds, stylesheets, internal pages and wrapped https://discord.com page, designed to conform with ToS as much as it is possible (or hide the changes that might violate it from Discord's eyes).": "WebCord je klient obklopujúci stránku https://discord.com, ktorý zlepšuje bezpečnosť a súkromie, upravuje funkcie Discordu, obchádza chyby Electronu, Chromia a Discordu a pridáva štýly aj interné stránky. Snaží sa čo najviac dodržiavať podmienky používania alebo skryť pred Discordom úpravy, ktoré by ich mohli porušovať.", + "Webgrabplus is a multi-site incremental xmltv epg grabber. It collects tv-program guide data from selected tvguide sites for your favourite channels.": "WebGrab+Plus priebežne získava elektronický programový sprievodca (EPG) vo formáte XMLTV z viacerých webov. Zhromažďuje televízny program vybraných staníc z podporovaných stránok.", "Webservers & Proxies": "Webové servery a proxy", "Website": "Webová stránka", - "Webstation is a web native emulation focused LXQt desktop based on Ubuntu.": "Webstation je webová natívne emulácia zameraná LXQt plocha na základe Ubuntu.", - "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č.", + "Webstation is a web native emulation focused LXQt desktop based on Ubuntu.": "Webstation poskytuje pracovnú plochu LXQt založenú na Ubuntu, prístupnú cez web a zameranú na emuláciu.", + "Webtop - Alpine, Ubuntu, Fedora, and Arch based containers containing full desktop environments in officially supported flavors accessible via any modern web browser.": "Webtop poskytuje kontajnery založené na Alpine, Ubuntu, Fedore a Archu s úplnými pracovnými prostrediami v oficiálne podporovaných variantoch, prístupnými cez 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ť:", + "Weixin (WeChat) is an instant messaging, social media, and mobile payment app developed by Tencent.": "Weixin (WeChat) je aplikácia na okamžité správy, sociálne siete a mobilné platby vyvíjaná spoločnosťou Tencent.", + "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ť?", @@ -7564,7 +7655,7 @@ "Where to store": "Kde uchovávať", "Where to store the Immich library": "Kde uložiť knižnicu Immich", "Where to store the Nextcloud files, configuration and data": "Kam uložiť súbory, konfiguráciu a dáta Nextcloud", - "Where to store the consume and export folders": "Kam uložiť priečinky spotreby a exportu", + "Where to store the consume and export folders": "Kam uložiť priečinky consume a export", "Where to store the recipe images and files": "Kam ukladať obrázky a súbory receptov", "Which guests should this job back up?": "Ktorých hostí by mala táto úloha zálohovať?", "While the server allows guest listing, no shares are actually accessible without authentication.": "Server síce dovolí hosťovi zobraziť zoznam, ale bez prihlásenia nie je dostupné žiadne zdieľanie.", @@ -7572,26 +7663,26 @@ "Will be configured now": "Nastaví sa teraz", "Windows Installation Options": "Možnosti inštalácie Windowsu", "Windows path:": "Cesta pre Windows:", - "WineGUI is a user-interface friendly Wine manager that provides a graphical frontend for creating and managing Wine bottles.": "WineGUI je užívateľsky ústretový Wine manager, ktorý poskytuje grafický frontend pre vytváranie a správu fliaš vína.", + "WineGUI is a user-interface friendly Wine manager that provides a graphical frontend for creating and managing Wine bottles.": "WineGUI je používateľsky prívetivý správca Wine s grafickým rozhraním na vytváranie a správu oddelených prostredí Wine (bottles).", "Wipe all — erase partitions + metadata": "Vymazať všetko - odstrániť oddiely + metadáta", "Wipe all — remove partitions + metadata": "Vymazať všetko - odstrániť oddiely + metadáta", "Wipe old signatures and partition table (DESTRUCTIVE):": "Vymazať staré podpisy a tabuľku oddielov (DEŠTRUKTÍVNE):", "Wiping existing partition table...": "Vymazávam existujúcu tabuľku oddielov...", "Wiping partitions and metadata...": "Vymazávam oddiely a metadáta...", "WireGuard Easy web interface": "Webové rozhranie WireGuard Easy", - "WireGuard® is an extremely simple yet fast and modern VPN that utilizes state-of-the-art cryptography. It aims to be faster, simpler, leaner, and more useful than IPsec, while avoiding the massive headache. It intends to be considerably more performant than OpenVPN. WireGuard is designed as a general purpose VPN for running on embedded interfaces and super computers alike, fit for many different circumstances. Initially released for the Linux kernel, it is now cross-platform (Windows, macOS, BSD, iOS, Android) and widely deployable. It is currently under heavy development, but already it might be regarded as the most secure, easiest to use, and simplest VPN solution in the industry.": "WireGuard® je extrémne jednoduchá, ale rýchla a moderná VPN, ktorá využíva najmodernejšiu kryptografiu. Jeho cieľom je byť rýchlejší, jednoduchší, štíhlejší a užitočnejší ako IPsec, pričom sa vyhýba masívnej bolesti hlavy. Má v úmysle byť výrazne výkonnejší ako OpenVPN. WireGuard je navrhnutý ako všeobecný účel VPN pre prevádzku na vstavaných rozhraniach a super počítačoch podobne, vhodný pre mnoho rôznych okolností. Spočiatku sa vydáva pre jadro Linuxu, je teraz cross-platform (Windows, macOS, BSD, iOS, Android) a široko rozmiestnený. To je v súčasnosti v ťažkom vývoji, ale už to môže byť považované za najbezpečnejšie, najjednoduchšie použitie, a najjednoduchšie riešenie VPN v priemysle.", + "WireGuard® is an extremely simple yet fast and modern VPN that utilizes state-of-the-art cryptography. It aims to be faster, simpler, leaner, and more useful than IPsec, while avoiding the massive headache. It intends to be considerably more performant than OpenVPN. WireGuard is designed as a general purpose VPN for running on embedded interfaces and super computers alike, fit for many different circumstances. Initially released for the Linux kernel, it is now cross-platform (Windows, macOS, BSD, iOS, Android) and widely deployable. It is currently under heavy development, but already it might be regarded as the most secure, easiest to use, and simplest VPN solution in the industry.": "WireGuard® je jednoduchá, rýchla a moderná VPN využívajúca súčasnú kryptografiu. Je navrhnutá ako jednoduchšia a menej náročná alternatíva k IPsec s cieľom prekonať výkon OpenVPN. Hodí sa pre vstavané zariadenia aj superpočítače. Pôvodne vznikla pre jadro Linuxu, dnes podporuje aj Windows, macOS, BSD, iOS a Android. Napriek pokračujúcemu vývoju je považovaná za bezpečné a ľahko použiteľné riešenie VPN.", "Wired NICs in backup missing on target:": "Káblové sieťové karty zo zálohy chýbajú na cieli:", - "Wireshark is the world’s foremost and widely-used network protocol analyzer. It lets you see what’s happening on your network at a microscopic level and is the de facto (and often de jure) standard across many commercial and non-profit enterprises, government agencies, and educational institutions. Wireshark development thrives thanks to the volunteer contributions of networking experts around the globe and is the continuation of a project started by Gerald Combs in 1998.": "Wireshark je prvoradý a široko používaný sieťový protokol analyzátor. Umožňuje vidieť, čo sa deje na vašej sieti na mikroskopickej úrovni a je de facto (a často de jure) štandard v mnohých komerčných a neziskových podnikoch, vládnych agentúr a vzdelávacích inštitúcií. Rozvoj Wireshark sa darí vďaka dobrovoľným príspevkom odborníkov na vytváranie sietí po celom svete a je pokračovaním projektu, ktorý začal Gerald Combs v roku 1998.", + "Wireshark is the world’s foremost and widely-used network protocol analyzer. It lets you see what’s happening on your network at a microscopic level and is the de facto (and often de jure) standard across many commercial and non-profit enterprises, government agencies, and educational institutions. Wireshark development thrives thanks to the volunteer contributions of networking experts around the globe and is the continuation of a project started by Gerald Combs in 1998.": "Wireshark je široko používaný analyzátor sieťových protokolov. Umožňuje podrobne sledovať prevádzku v sieti a je štandardným nástrojom vo firmách, neziskových organizáciách, úradoch aj školách. Vďaka dobrovoľným príspevkom sieťových odborníkov z celého sveta pokračuje v projekte, ktorý Gerald Combs začal v roku 1998.", "With another storage they stop running.": "S iným úložiskom prestanú fungovať.", "With another storage this job no longer starts them. Another job that writes to the original storage still does.": "S iným úložiskom ich už táto úloha nespúšťa. Iná úloha, ktorá zapisuje do pôvodného úložiska, ich spúšťa naďalej.", - "With dns validation, the DNSPLUGIN variable names the provider plugin. The advanced installation asks for it; otherwise add the line lxc.environment.runtime: DNSPLUGIN= to /etc/pve/lxc/.conf with the container stopped.": "Pri validácii dns, DNSPLUGIN premenná názvy poskytovateľa plugin. Pokročilá inštalácia si to vyžaduje; inak pridajte riadok lxc.environment.runtime: DNSPLUGIN= k /etc/pve/lxc/.conf s kontajnerom zastavil.", - "With dns validation, write the provider credentials in /config/dns-conf/.ini inside the container and restart it.": "S validáciou dns, napíšte poskytovateľa credentials v /config/dns-conf/.ini vnútri kontajnera a reštartujte ho.", - "With http validation, port 80 of the router must be forwarded to port 80 of this container.": "Pri validácii http sa port 80 routeru musí zaslať do prístavu 80 tohto kontajnera.", + "With dns validation, the DNSPLUGIN variable names the provider plugin. The advanced installation asks for it; otherwise add the line lxc.environment.runtime: DNSPLUGIN= to /etc/pve/lxc/.conf with the container stopped.": "Pri overení dns určuje premenná DNSPLUGIN doplnok poskytovateľa. Pokročilá inštalácia sa naň opýta. Inak pri zastavenom kontajneri pridajte do /etc/pve/lxc/.conf riadok lxc.environment.runtime: DNSPLUGIN=.", + "With dns validation, write the provider credentials in /config/dns-conf/.ini inside the container and restart it.": "Pri overení dns zapíšte prihlasovacie údaje poskytovateľa do /config/dns-conf/.ini v kontajneri a kontajner reštartujte.", + "With http validation, port 80 of the router must be forwarded to port 80 of this container.": "Pri overení http musí byť port 80 smerovača presmerovaný na port 80 tohto kontajnera.", "With warnings": "S upozorneniami", "Without Function Level Reset (FLR), passthrough is not considered reliable": "Bez Function Level Reset (FLR) sa passthrough nepovažuje za spoľahlivý", "Without a usable reset path, passthrough reliability is poor and VM": "Bez použiteľnej reset cesty je spoľahlivosť passthrough nízka a VM", "Wizard cancelled": "Sprievodca zrušený", - "Wolfenstein: Blade of Agony is a story-driven WWII shooter inspired by Wolfenstein and Doom.": "Wolfenstein: Blade of Agony je príbeh-riadený WWII strelec inšpirovaný Wolfenstein a Doom.", + "Wolfenstein: Blade of Agony is a story-driven WWII shooter inspired by Wolfenstein and Doom.": "Wolfenstein: Blade of Agony je príbehová strieľačka z druhej svetovej vojny inšpirovaná hrami Wolfenstein a Doom.", "Workflow automation tool": "Nástroj na automatizáciu pracovného toku", "Working directory:": "Pracovný priečinok:", "Works with LVM, ZFS, and BTRFS storage types": "Funguje s typmi úložísk LVM, ZFS a BTRFS", @@ -7604,10 +7695,10 @@ "Write access verified for user:": "Prístup na zápis bol overený pre používateľa:", "Write the value it produces instead.": "Napíšte namiesto toho hodnotu, ktorú vytvára.", "Wrong SHA-256 in": "Nesprávne SHA-256 v", - "Wrong inherited registry lock": "Nesprávny zdedený register", + "Wrong inherited registry lock": "Nesprávny zdedený zámok registra", "Wrong passphrase": "Nesprávna fráza", "Wrong size in": "Nesprávna veľkosť", - "Xbackbone is a simple, self-hosted, lightweight PHP file manager that support the instant sharing tool ShareX and *NIX systems. It supports uploading and displaying images, GIF, video, code, formatted text, and file downloading and uploading. Also have a web UI with multi user management, past uploads history and search support.": "Xbackbone je jednoduchý, self-hosted, ľahký PHP správca súborov, ktoré podporujú nástroj okamžité zdieľanie ShareX a *NIX systémy. Podporuje nahrávanie a zobrazovanie obrázkov, GIF, video, kód, formátovaný text a sťahovanie a nahrávanie súborov. Tiež majú webové UI s multi užívateľským manažmentom, minulé nahráva históriu a podporu vyhľadávania.", + "Xbackbone is a simple, self-hosted, lightweight PHP file manager that support the instant sharing tool ShareX and *NIX systems. It supports uploading and displaying images, GIF, video, code, formatted text, and file downloading and uploading. Also have a web UI with multi user management, past uploads history and search support.": "XBackBone je jednoduchý a nenáročný správca súborov v PHP na vlastnom serveri s podporou ShareX a systémov *NIX. Podporuje nahrávanie, zobrazovanie a sťahovanie obrázkov, GIF, videa, kódu a formátovaného textu. Webové rozhranie ponúka správu viacerých používateľov, históriu nahratých súborov a vyhľadávanie.", "Yaak is a desktop API client for organizing and executing REST, GraphQL, and gRPC requests. It's built using Tauri, Rust, and ReactJS.": "Yaak je desktopový API klient pre organizovanie a vykonávanie REST, GraphQL, a gRPC požiadavky. Je postavený pomocou Tauri, Rust a ReactJS.", "Yes": "Áno", "Yes, upload": "Áno, nahrať", @@ -7639,9 +7730,9 @@ "You should now be able to access the Proxmox web interface.": "Teraz by ste mali mať prístup k webovému rozhraniu Proxmoxu.", "You will need a Tailscale auth key from: https://login.tailscale.com/admin/settings/keys": "Budete potrebovať Tailscale auth key z: https://login.tailscale.com/admin/settings/keys", "Your Coral USB device and its runtime (libedgetpu1) will NOT be affected.": "Vaše zariadenie Coral USB a jeho runtime (libedgetpu1) NEBUDÚ ovplyvnené.", - "Your machine learning Env work with Jupyter Lab": "Vaše strojové učenie Env práce s Jupyter Lab", + "Your machine learning Env work with Jupyter Lab": "Prostredie strojového učenia s JupyterLab", "Your next YouTube media manager": "Váš ďalší manažér médií YouTube", - "Your_spotify is a self-hosted application that tracks what you listen and offers you a dashboard to explore statistics about it! It's composed of a web server which polls the Spotify API every now and then and a web application on which you can explore your statistics.": "Your_spotify je self-hosted aplikácie, ktorá sleduje to, čo počúvate a ponúka palubnú dosku preskúmať štatistiky o tom! Skladá sa z webového servera, ktorý skúma API Spotify sem tam a tam a webovej aplikácie, na ktorej môžete preskúmať svoje štatistiky.", + "Your_spotify is a self-hosted application that tracks what you listen and offers you a dashboard to explore statistics about it! It's composed of a web server which polls the Spotify API every now and then and a web application on which you can explore your statistics.": "Your_spotify je aplikácia na vlastnom serveri, ktorá sleduje počúvanie hudby a zobrazuje štatistiky. Tvorí ju server pravidelne zisťujúci údaje cez Spotify API a webové rozhranie na ich prezeranie.", "ZFS ARC config removed (kernel defaults will apply on reboot)": "Nastavenie ZFS ARC bolo odstránené (predvolené hodnoty kernelu sa použijú po reštarte)", "ZFS ARC maximum configured:": "Maximálna veľkosť ZFS ARC je nastavená na:", "ZFS ARC optimization completed": "Optimalizácia ZFS ARC je dokončená", @@ -7678,6 +7769,7 @@ "ZRAM profile removed, but package purge failed": "Profil ZRAM bol odstránený, ale vymazanie balíka zlyhalo", "ZRAM still holds pages; configuration was preserved": "ZRAM stále drží stránky; konfigurácia bola zachovaná", "ZRAM still holds pages; profile remains active": "ZRAM stále drží stránky; profil zostáva aktívny", + "ZRAM swap profile": "Profil swapu ZRAM", "ZRAM swap profile enabled": "Swap profil ZRAM povolený", "ZRAM swap profile removed": "Výmenný profil ZRAM bol odstránený", "ZSTD - fast, good ratio (recommended)": "ZSTD - rýchly, dobrý pomer (odporúčané)", @@ -7685,13 +7777,13 @@ "Zero all data — partition table preserved, data wiped": "Vynulovať všetky dáta - tabuľka oddielov zostane, dáta sa vymažú", "Zero all data — partition table preserved": "Vynulovať všetky dáta - tabuľka oddielov zostane", "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.", + "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 sprostredkujúci server pre IRC (bouncer, BNC). Udržiava spojenie so serverom a kanálmi nezávisle od klienta. Viacerí klienti z rôznych miest sa môžu súčasne pripojiť k jednému účtu ZNC a vystupovať na IRC pod rovnakou prezývkou.", "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", + "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.", + "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 siete ED2K na zdieľanie súborov, založený na klientovi eMule pre Windows. Vznikol v auguste 2003 ako odnož xMule, ktorý vychádzal z lMule.", "active VF(s)": "aktívne VF", "active VFs": "aktívnymi VF", "active Virtual Functions. Changing its driver binding would destroy every VF.": "aktívnymi Virtual Functions. Zmena naviazania ovládača by zrušila každú VF.", @@ -7718,13 +7810,13 @@ "apex group still has members; left in place:": "Skupina apex stále má členov, preto zostáva ponechaná:", "apex kernel module not loaded on host. Run \"Install Coral on Host\" first or the container will not see /dev/apex_0.": "Kernel modul apex nie je na hoste načítaný. Najprv spustite \"Install Coral on Host\", inak kontajner neuvidí /dev/apex_0.", "appears to be part of a": "vyzerá, že je súčasťou", - "apply requires the OCI archive of the resolved image": "aplikovať requires archív OCI vyriešeného obrazu", + "apply requires the OCI archive of the resolved image": "Akcia apply vyžaduje archív OCI určeného obrazu", "applying minimal banner patch": "používam minimálnu úpravu bannera", "apt cache refreshed.": "apt cache bola obnovená.", "apt-get exited": "apt-get skončil", "apt-get update returned warnings. Continuing anyway; check": "apt-get update vrátil varovania. Pokračujem ďalej; skontrolujte", "as": "ako", - "assembling": "montáž", + "assembling": "zostavovanie", "automatically. Install it manually inside the container.": "automaticky. Nainštalujte ho ručne vo vnútri kontajnera.", "automatically. Reboot LXC to fully release.": "automaticky. Pre úplné uvoľnenie reštartujte LXC.", "available": "K dispozícii", @@ -7732,11 +7824,11 @@ "available in this same GPU and TPU menu.": "dostupnej v tomto istom GPU a TPU menu.", "backup at /etc/fstab.proxmenux.bak": "záloha v /etc/fstab.proxmenux.bak", "ban": "zákaz", - "belongs to another OCI installation": "patrí do iného zariadenia OCI", + "belongs to another OCI installation": "patrí do inej inštalácie OCI", "blocking issue(s).": "blokujúcich problémov.", "btrfs — Proxmox dir storage (snapshots, compression)": "btrfs — Proxmox dir úložisko (snapshoty, kompresia)", "btrfs — snapshots and compression": "btrfs - snapshoty a kompresia", - "budge is an open source 'budgeting with envelopes' personal finance app.": "budge je otvorený zdroj \"budgeting s obálkami\" aplikácie osobného financovania.", + "budge is an open source 'budgeting with envelopes' personal finance app.": "budge je aplikácia na správu osobných financií s otvoreným zdrojovým kódom, ktorá používa obálkovú metódu rozpočtu.", "builds against kernel": "stavia proti jadru", "but it does not match the one used to create the backup. Replace it with the correct keyfile from the source host and retry.": "ale nezhoduje sa s tým, ktorý bol použitý pri vytvorení zálohy. Nahraďte ho správnym keyfile zo zdrojového hosta a skúste to znova.", "bytes": "bajtov", @@ -7744,17 +7836,18 @@ "chmod 1777 + setfacl o::rwx (applied on the NFS share from this host)": "chmod 1777 + setfacl o::rwx (použité na NFS zdieľaní z tohto hosta)", "chmod failed — NFS server may be restricting changes from root": "chmod zlyhal - NFS server môže obmedzovať zmeny od roota", "chown/chmod failed — likely unprivileged CT against host bind mount. Falling back to ACL.": "chown/chmod zlyhalo - pravdepodobne ide o neprivilegovaný CT nad bind mountom z hosta. Skúšam náhradné riešenie cez ACL.", + "clone source mount tree": "klonovanie zdrojového stromu pripojenia", "containers": "kontajnery", "containers of": "nádob", "content:": "obsah:", "copyparty web interface": "Webové rozhranie copyparty", "could not be compiled for kernel": "nepodarilo sa skompilovať pre jadro", "could not validate NVIDIA; exit code": "nemohol potvrdiť NVIDIA; kód výstupu", - "cpuunits must be between 8 and 10000": "cpujednotky musia byť od 8 do 10000", - "custom": "zvyk", + "cpuunits must be between 8 and 10000": "Hodnota cpuunits musí byť od 8 do 10000", + "custom": "vlastné", "custom dependency commands are not yet supported": "Vlastné príkazy závislosti ešte nie sú podporované", "custom path(s) saved.": "uložených vlastných ciest.", - "darktable is an open source photography workflow application and raw developer. A virtual lighttable and darkroom for photographers. It manages your digital negatives in a database, lets you view them through a zoomable lighttable and enables you to develop raw images and enhance them.": "darktable je aplikácia fotografií s otvoreným zdrojom a surový vývojár. Virtuálna svetelná a tmavá miestnosť pre fotografov. Spravuje vaše digitálne negatíva v databáze, umožňuje vám ich prezerať pomocou zoomovateľného svetelného zariadenia a umožňuje vám vyvinúť surové obrázky a zlepšiť ich.", + "darktable is an open source photography workflow application and raw developer. A virtual lighttable and darkroom for photographers. It manages your digital negatives in a database, lets you view them through a zoomable lighttable and enables you to develop raw images and enhance them.": "darktable je fotografická aplikácia s otvoreným zdrojovým kódom na správu pracovného postupu a spracovanie RAW. Slúži ako virtuálny prehliadací stôl a tmavá komora: digitálne negatívy spravuje v databáze, umožňuje ich prehliadať s priblížením, vyvolávať a upravovať.", "ddclient starts with the example configuration and updates nothing yet. Write your provider, login and domains in /config/ddclient.conf inside the container, then restart it.": "ddclient začína s konfiguráciou príkladu a ešte nič neaktualizuje. Napíšte svojho poskytovateľa, prihlásenie a domény do /config/ddclient.conf vnútri kontajnera a potom ho reštartujte.", "default": "predvolené", "delete the credentials file (if any)": "vymazať súbor s prihlasovacími údajmi (ak existuje)", @@ -7764,7 +7857,7 @@ "devices": "zariadenia", "devices (dynamic runtime)": "zariadenia (dynamický čas chodu)", "did not become ready. Skipping.": "nebol pripravený. Preskakujem.", - "digiKam: Professional Photo Management with the Power of Open Source": "digiKam: Profesionálny Photo Management s výkonom otvoreného zdroja", + "digiKam: Professional Photo Management with the Power of Open Source": "digiKam: profesionálna správa fotografií so silou otvoreného zdrojového kódu", "disabled": "zakázané", "disk(s) added to CT": "diskov pridaných do CT", "disk(s) added to VM": "diskov pridaných do VM", @@ -7772,17 +7865,18 @@ "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", + "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 s ukážkovým nastavením a k ničomu sa nepripája. Token robota Discord zapíšte do discord_token v /config/config.toml v kontajneri.", + "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 components": "súčasti ovládača", "driver:": "ovládač:", "e.g.": "napr.", "empty = generate": "prázdne = generovať", + "enter container namespace": "vstup do menného priestoru kontajnera", "exFAT (portable: Windows/Linux/macOS)": "exFAT (prenosné: Windows/Linux/macOS)", "exFAT tools installed successfully.": "Nástroje exFAT boli úspešne nainštalované.", "experimental on this GPU": "experimentálne na tomto GPU", @@ -7807,7 +7901,7 @@ "for this policy and may fail after first use or on subsequent VM starts.": "podľa týchto pravidiel a môže zlyhať po prvom použití alebo pri ďalších štartoch VM.", "formatted as": "naformátované ako", "found": "nájdené", - "free": "bez cla", + "free": "voľné", "from": "zo siete", "from Proxmox web interface (you will be asked)": "z webového rozhrania Proxmoxu (ešte sa vás opýta)", "from container": "z kontajnera", @@ -7829,14 +7923,14 @@ "has a different MAC than the backup — update any DHCP static reservation": "má inú MAC než v zálohe - aktualizujte prípadnú statickú rezerváciu v DHCP", "has a new MAC": "má novú MAC", "has only": "má iba", - "health and persistence profile not yet defined": "profil zdravia a pretrvávania, zatiaľ nedefinovaný", - "hiSHtory is a better shell history. It stores your shell history in context (what directory you ran the command in, whether it succeeded or failed, how long it took, etc). This is all stored locally and end-to-end encrypted for syncing to to all your other computers.": "HISHtory je lepšia história mušlí. Ukladá históriu vášho shellu v kontexte (v akom adresári ste spustili príkaz, či sa to podarilo alebo zlyhalo, ako dlho to trvalo, atď). Toto všetko je uložené lokálne a end-to-end zašifrované pre synchronizáciu so všetkými ostatnými počítačmi.", - "host directory": "adresár host", + "health and persistence profile not yet defined": "profil kontroly stavu a trvalého úložiska zatiaľ nie je definovaný", + "hiSHtory is a better shell history. It stores your shell history in context (what directory you ran the command in, whether it succeeded or failed, how long it took, etc). This is all stored locally and end-to-end encrypted for syncing to to all your other computers.": "hiSHtory uchováva históriu príkazov shellu spolu s kontextom: adresárom, výsledkom aj trvaním príkazu. Údaje zostávajú uložené lokálne a pri synchronizácii medzi počítačmi sú chránené koncovým šifrovaním.", + "host directory": "adresár hostiteľa", "host fstab only (not registered as Proxmox storage)": "iba host fstab (nie je zaregistrované ako úložisko Proxmoxu)", "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Á", @@ -7853,8 +7947,8 @@ "iSCSI storage provides raw block devices for VM disk images.": "iSCSI úložisko poskytuje surové blokové zariadenia pre disky virtuálnych strojov.", "iSCSI tools installed": "iSCSI nástroje sú nainštalované", "iftop usage": "Použitie iftop", - "image cache on": "Comment", - "image itself": "samotný obrázok", + "image cache on": "vyrovnávacia pamäť obrazov na", + "image itself": "samotného obrazu", "imported:": "importované:", "in CT": "v CT", "in backups": "v zálohách", @@ -7862,6 +7956,7 @@ "individual template is blocked": "individuálna šablóna je zablokovaná", "initramfs updated": "initramfs aktualizovaný", "initramfs updated.": "initramfs bol aktualizovaný.", + "installable": "možno nainštalovať", "installed": "nainštalovaný", "installed but command not immediately available": "nainštalované, ale príkaz nie je hneď dostupný", "installed correctly and available": "nainštalované správne a dostupné", @@ -7904,20 +7999,26 @@ "is one of the": "je jedným z", "is referenced in the following stopped VM(s)/CT(s):": "je uvedený v týchto zastavených VM/CT:", "it asks for the network of the host; the container gets its own address instead": "žiada o sieť hostiteľa; kontajner dostane namiesto toho svoju vlastnú adresu", + "it asks for two different memory limits": "požaduje dva rozdielne limity pamäte", "it could not be started:": "nedalo sa spustiť:", - "it is locked or its disk could not be mounted": "je zamknutá alebo sa jej disk nepodarilo pripojiť", + "it describes more than one image": "definuje viac než jeden obraz", + "it is locked or its disk could not be mounted": "je uzamknutý alebo sa nepodarilo pripojiť jeho disk", "it publishes no other architecture": "nepublikuje žiadnu inú architektúru", - "it uses an NVIDIA GPU and this host has no working NVIDIA driver and Container Toolkit. Install them and run the recovery again.": "používa NVIDIA GPU a tento hostiteľ nemá funkčný ovládač NVIDIA a súpravu kontajnerových nástrojov. Nainštalujte ich a znova spustite obnovenie.", + "it uses Compose configs, which have no equivalent here": "používa nastavenia Compose configs, ktoré tu nemajú ekvivalent", + "it uses an NVIDIA GPU and this host has no working NVIDIA driver and Container Toolkit. Install them and run the recovery again.": "používa GPU NVIDIA, ale na tomto serveri nie je funkčný ovládač NVIDIA alebo NVIDIA Container Toolkit. Nainštalujte chýbajúce súčasti a registráciu zopakujte.", "it uses the Compose option": "používa možnosť Compose", "its NVIDIA runtime could not be rebuilt for the driver of this host; the container will not start until it is installed again:": "jeho runtime NVIDIA nebolo možné prebudovať pre ovládač tohto hostiteľa; kontajner sa nespustí, kým nebude znova nainštalovaný:", - "its Rclone mount is published again on this host at": "jeho pripojenie Rclone je opäť zverejnené na tomto hostiteľovi na adrese", + "its Rclone mount is published again on this host at": "jeho pripojenie Rclone sa na tomto serveri opäť sprístupní v ceste", "its Rclone mount is published by a host script that a backup does not include. Enable the mount again from the Rclone entry of the catalog before starting it.": "jeho pripojenie Rclone je publikované hostiteľským skriptom, ktorý záloha neobsahuje. Pred spustením znova povoľte pripojenie v položke Rclone v katalógu.", "its backup was made before ProxMenux kept the record inside the container": "jeho záloha bola vykonaná skôr, ako ProxMenux uchovával záznam v kontajneri", "its configuration could not be read": "nepodarilo sa prečítať jeho konfiguráciu", + "its health check is not written in a way that can be read": "kontrola stavu je zadaná v nepodporovanom formáte", "its hookscript does not exist on this host:": "jeho hookscript na tomto hostiteľovi neexistuje:", "its host firewall rule was not added:": "pravidlo brány firewall hostiteľa nebolo pridané:", "its include exists with other content:": "jeho include existuje s iným obsahom:", "its record is missing and it was not found among the restored containers": "jeho záznam chýba a medzi obnovenými kontajnermi sa nenašiel", + "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", + "its stop timeout is not written in a way that can be read": "časový limit zastavenia je zadaný v nepodporovanom formáte", "journald MaxLevelStore is adequate for auth logging": "journald MaxLevelStore je vhodný na logovanie prihlásení", "journald drop-in created: /etc/systemd/journald.conf.d/proxmenux-loglevel.conf": "journald drop-in vytvorený: /etc/systemd/journald.conf.d/proxmenux-loglevel.conf", "journald log level restored": "Úroveň logovania journald bola obnovená", @@ -7933,6 +8034,7 @@ "keep-weekly (0 disables)": "keep-weekly (0 vypne)", "keep-yearly (0 disables)": "keep-yearly (0 vypne)", "keeping current settings": "ponechávam aktuálne nastavenie", + "kernel": "jadro", "kexec configured successfully. Use the command: reboot-quick": "kexec je úspešne nastavený. Použite príkaz: reboot-quick", "kexec-pve service enabled": "Služba kexec-pve je zapnutá", "kexec-pve service file created": "Súbor služby kexec-pve bol vytvorený", @@ -7945,13 +8047,16 @@ "layers": "vrstvy", "legacy .link file(s) to the ProxMenux-managed format": "staršie .link súbory do formátu spravovaného ProxMenuxom", "log2ram completely removed from system": "log2ram bol úplne odstránený zo systému", + "main container of the application": "hlavný kontajner aplikácie", + "make cloned mount tree read-only": "nastavenie klonovaného stromu pripojenia iba na čítanie", "manually inside the container before starting it.": "ručne vo vnútri kontajnera pred jeho spustením.", "manually inside the container.": "ručne vo vnútri kontajnera.", "maximum performance": "maximálny výkon", "may be closed — trying discovery anyway...": "môže byť zatvorený - aj tak skúšam vyhľadanie...", - "melonDS aims at providing fast and accurate Nintendo DS emulation.": "Cieľom melonDS je poskytovať rýchle a accurate Nintendo DS emulácia.", + "melonDS aims at providing fast and accurate Nintendo DS emulation.": "melonDS sa zameriava na rýchlu a presnú emuláciu Nintendo DS.", "members:": "členovia:", - "minimum": "minimálna", + "memory": "pamäť", + "minimum": "minimum", "missing": "chýba", "mkfs.btrfs not found. Install btrfs-progs and retry.": "mkfs.btrfs sa nenašiel. Nainštalujte btrfs-progs a skúste to znova.", "more": "ďalších", @@ -7961,12 +8066,13 @@ "mstream is a personal music streaming server. You can use mStream to stream your music from your home computer to any device, anywhere. There are mobile apps available for both Android and iPhone.": "mstream je osobný hudobný streamovací server. Môžete použiť mStream na streamovanie hudby z vášho domáceho počítača do akéhokoľvek zariadenia, kdekoľvek. K dispozícii sú mobilné aplikácie pre Android aj iPhone.", "must contain a valid numeric UID for the GPU": "musí obsahovať platné číselné UID pre GPU", "needed": "potrebné", - "needs a privileged LXC": "potrebuje privilegovanú LXC", + "needs a privileged LXC": "vyžaduje privilegovaný kontajner LXC", "needs a relaxed AppArmor or seccomp profile": "potrebuje uvoľnený AppArmor alebo seccomp profil", - "needs stack review": "Potreby stack review", + "needs stack review": "vyžaduje kontrolu zostavy", "needs these external services, already running:": "vyžaduje tieto už spustené externé služby:", + "network": "sieť", "never": "nikdy", - "next free": "next free", + "next free": "ďalšie voľné", "next free block": "ďalší voľný blok", "nftables not available - using iptables ban action": "nftables nie je dostupné - používam zákaz cez iptables", "no": "nie", @@ -7975,11 +8081,14 @@ "no declarative value": "žiadna deklaratívna hodnota", "no passphrase": "bez frázy", "no password": "bez hesla", + "no-subscription repository": "repozitár no-subscription", "no_root_squash": "no_root_squash", "non-ProxMenux .tar archive(s) in this path": "non-ProxMenux .tar archívy v tejto ceste", + "none": "žiadne", "not available yet": "zatiaľ nedostupné", "not changed": "bez zmeny", "not found.": "sa nenašiel.", + "not generated": "nevygenerované", "not installed": "nie je nainštalované", "not reliable on this hardware due to the following limitations": "na tomto hardvéri nespoľahlivý pre tieto obmedzenia", "nouveau driver has been blacklisted.": "Ovládač nouveau bol pridaný na blacklist.", @@ -7997,9 +8106,9 @@ "of free disk space.": "voľného miesta na disku.", "older firmware may increase passthrough instability": "starší firmvér môže zvýšiť nestabilitu priameho priradenia", "oldest driver offered:": "najstarší ponúkaný ovládač:", - "on": "o", + "on": "na", "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,24 +8123,27 @@ "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:", "pending (reboot required to enumerate full group)": "čaká (na zistenie celej skupiny je potrebný reštart)", + "pending adaptation": "čaká na prispôsobenie", "phpMyAdmin is installed with arbitrary server connections enabled: the login page has a Server field where the address of the MySQL or MariaDB server is entered, together with its user and password.": "phpMyAdmin je nainštalovaný so zapnutými ľubovoľnými pripojeniami servera: prihlasovacia stránka má pole servera, kde je zadaná adresa servera MySQL alebo MariaDB, spolu s jeho užívateľom a heslom.", "pigz configuration completed": "Nastavenie pigz je dokončené", "pigz enabled in vzdump configuration": "pigz je zapnutý v nastavení vzdump", "pigz installed successfully": "pigz bol úspešne nainštalovaný", "pigz removed": "pigz bol odstránený", "pigz wrapper script created": "Wrapper skript pre pigz bol vytvorený", - "playit.gg has to claim this agent before it forwards anything. The agent prints a one-time claim link on the container console and keeps it there until the link is opened.": "playit.gg musí žiadať tohto agenta pred tým, než niečo postúpi. Agent vytlačí jednorázový reklamačný odkaz na konzolu kontajnera a nechá ho tam až do otvorenia odkazu.", + "playit.gg has to claim this agent before it forwards anything. The agent prints a one-time claim link on the container console and keeps it there until the link is opened.": "Pred presmerovaním prevádzky treba agenta priradiť k účtu playit.gg. Agent vypíše na konzole kontajnera jednorazový odkaz na priradenie a ponechá ho tam, kým ho neotvoríte.", "port": "port", "portmapper/rpcbind has been disabled": "portmapper/rpcbind bol zakázaný", - "private network assigned automatically": "privátne siete pridelené automaticky", - "privileged LXC": "Privilegované LXC", + "print the estimated unpacked size in MiB (0 when unknown)": "vypísať odhad rozbalenej veľkosti v MiB (0, ak nie je známa)", + "private network assigned automatically": "súkromná sieť pridelená automaticky", + "privileged LXC": "privilegovaný kontajner LXC", "proxmox-backup-client reported:": "proxmox-backup-client oznámil:", "proxmox-boot-tool refreshed": "proxmox-boot-tool bol obnovený", + "publish mount tree": "sprístupnenie stromu pripojenia", "pve-enterprise.list update skipped (no change)": "Aktualizácia pve-enterprise.list preskočená (bez zmeny)", "pve-enterprise.list updated to Trixie": "pve-enterprise.list aktualizovaný na Trixie", "pvecm command not found (might not be in a cluster)": "Príkaz pvecm sa nenašiel (možno nejde o klaster)", @@ -8042,15 +8154,16 @@ "pvesm not found.": "pvesm sa nenašiel.", "pvesm path failed, trying manual detection...": "pvesm path zlyhal, skúšam ručné zistenie...", "pvesm status failed": "pvesm status zlyhal", - "pyLoad is a Free and Open Source download manager written in Python and designed to be extremely lightweight, easily extensible and fully manageable via web.": "pyLoad je Free and Open Source manažér download napísaný v Pythone a navrhnutý tak, aby bol veľmi ľahký, ľahko rozšíriteľný a plne zvládnuteľný cez web.", + "pyLoad is a Free and Open Source download manager written in Python and designed to be extremely lightweight, easily extensible and fully manageable via web.": "pyLoad je bezplatný správca sťahovania s otvoreným zdrojovým kódom napísaný v Pythone. Je nenáročný, ľahko rozšíriteľný a plne ovládateľný cez web.", "pyLoad web interface": "webové rozhranie pyLoad", + "python3-jsonschema is required to generate templates": "Na generovanie šablón je potrebný python3-jsonschema", "qBittorrent WebUI password (user: admin)": "qBittorrent WebUI heslo (používateľ: admin)", "qBittorrent already has a configuration; it is not overwritten": "qBittorrent už má konfiguráciu; nie je prepísaná", "qBittorrent configured": "Konfigurovaný qBittorrent", "qBittorrent did not apply the category:": "qBittorrent neuplatnila kategóriu:", "qBittorrent did not apply the download paths": "qBittorrent nepoužila cesty na stiahnutie", - "qBittorrent requires a non-empty password": "qBittorrent requires a non-prázdne heslo", - "qBittorrent: authenticated access to the preferences could not be verified": "qBittorrent: nemohol sa overiť overený prístup k preferenciám", + "qBittorrent requires a non-empty password": "qBittorrent vyžaduje neprázdne heslo", + "qBittorrent: authenticated access to the preferences could not be verified": "qBittorrent: nepodarilo sa overiť prihlásený prístup k nastaveniam", "qBittorrent: invalid login response or missing session cookie": "qBittorrent: neplatná odpoveď prihlásenia alebo chýbajúci súbor cookie sedenia", "raw USB disk — no filesystem (will be FORMATTED)": "surový USB disk - bez súborového systému (bude NAformátovaný)", "read-only": "iba na čítanie", @@ -8059,24 +8172,26 @@ "recognition": "rozpoznávanie", "recognition only": "iba rozpoznávanie", "recommended": "odporúčané", - "recovering": "zotavenie", + "recovering": "obnova", "remapped users": "remapovanými používateľmi", "remove the (now-empty) directory if possible": "odstrániť teraz prázdny priečinok, ak to bude možné", "removed from Proxmox": "odstránené z Proxmoxu", "removed in Proxmox": "odstránené v Proxmox", "removed successfully from Proxmox.": "úspešne odstránené z Proxmoxu.", + "removed unused image archive: {path} ({size} bytes)": "odstránený nepoužívaný archív obrazu: {path} ({size} bajtov)", "requires running the official installer, which restarts the Monitor service.": "vyžaduje spustenie oficiálneho inštalátora, ktorý reštartuje službu Monitor.", "requires the package": "vyžaduje balík", "restarted successfully": "úspešne reštartované", "restoring /etc/network would lose connectivity": "obnova /etc/network by prerušila pripojenie", "restoring on:": "obnova na:", "retries": "pokusov", + "return to host namespace": "návrat do menného priestoru hostiteľa", "reverse proxy": "reverse proxy", "root and real users only": "iba root a skutoční používatelia", "rpcbind could not be disabled completely": "rpcbind nebolo možné úplne vypnúť", "rpcbind service and socket have been disabled and stopped": "Služba rpcbind a socket boli deaktivované a zastavené", "rpcbind units were not found; no changes were made": "jednotky rpcbind neboli nájdené;neboli vykonané žiadne zmeny", - "rsnapshot starts with the default configuration, which backs up /data into /.snapshots. Edit /config/rsnapshot.conf inside the container to set your own backup points, snapshot root and retention intervals.": "rsnapshot začína štandardnou konfiguráciou, ktorá zálohuje / dáta do /.snapshots. Upraviť /config/rsnapshot.conf vnútri kontajnera nastaviť svoje vlastné záložné body, snímky koreňov a intervaly uchovávania.", + "rsnapshot starts with the default configuration, which backs up /data into /.snapshots. Edit /config/rsnapshot.conf inside the container to set your own backup points, snapshot root and retention intervals.": "rsnapshot začína s predvoleným nastavením, ktoré zálohuje /data do /.snapshots. V kontajneri upravte /config/rsnapshot.conf a nastavte vlastné zdroje záloh, koreňový adresár snímok a intervaly uchovávania.", "running": "beží", "runs in": "beží v", "safe paths now (configs, packages, /etc, /root, ...)": "bezpečné cesty teraz (nastavenia, balíky, /etc, /root, ...)", @@ -8109,32 +8224,37 @@ "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ľ.", "storage(s) from backup exist on target": "úložiská zo zálohy existujú na cieli", "storage.": "úložisko.", + "subscription banner": "upozornenie na predplatné", "successfully formatted with": "úspešne naformátované ako", "suggested:": "navrhované:", "switch_gpu_mode.sh was not found.": "switch_gpu_mode.sh sa nenašiel.", "sysfs ROM dump failed — trying ACPI VFCT table...": "sysfs ROM dump zlyhal - skúšam ACPI VFCT tabuľku...", - "syslog-ng allows you to flexibly collect, parse, classify, rewrite and correlate logs from across your infrastructure and store or route them to log analysis tools.": "syslog-ng umožňuje flexibilne zbierať, spracovať, klasifikovať, prepísať a korelovať protokoly z celej vašej infraštruktúry a ukladať alebo smerovať ich do log analytické nástroje.", + "syslog-ng allows you to flexibly collect, parse, classify, rewrite and correlate logs from across your infrastructure and store or route them to log analysis tools.": "syslog-ng umožňuje flexibilne zbierať, spracúvať, triediť, upravovať a prepájať záznamy z celej infraštruktúry a ukladať ich alebo odosielať do nástrojov na analýzu denníkov.", "systemctl restart networking failed:": "systemctl restart networking zlyhal:", "systemd OnCalendar expression": "systemd OnCalendar výraz", "the API key was not generated on the first start": "kľúč API nebol vytvorený pri prvom štarte", - "the NVIDIA hook of the container is not available:": "hák NVIDIA kontajnera nie je k dispozícii:", - "the bridge does not exist on this host:": "most na tomto hostiteľovi neexistuje:", - "the bridge exists on this host with another network:": "most existuje na tomto hostiteľovi s inou sieťou:", - "the container has its own address, so the port Docker published on the host is not needed": "kontajner má svoju vlastnú adresu, takže port Docker zverejnené na hostiteľa nie je potrebné", + "the GPU did not answer in time": "GPU neodpovedalo včas", + "the NVIDIA hook of the container is not available:": "spúšťací skript NVIDIA pre tento kontajner nie je dostupný:", + "the bridge does not exist on this host:": "sieťový most (bridge) na tomto hostiteľovi neexistuje:", + "the bridge exists on this host with another network:": "sieťový most (bridge) existuje na tomto hostiteľovi s inou sieťou:", + "the container has its own address, so the port Docker published on the host is not needed": "kontajner má vlastnú adresu, takže port zverejnený Dockerom na hostiteľovi nie je potrebný", "the containers do not agree on the private network of": "kontajnery sa nezhodujú na súkromnej sieti", "the device does not exist on this host:": "zariadenie na tomto hostiteľovi neexistuje:", + "the devices it asks for are not written in a way that can be read": "požadované zariadenia sú zadané v nepodporovanom formáte", "the host directory does not exist:": "hostiteľský adresár neexistuje:", "the host firewall rule of the installation is not added again; allow its port in the firewall of this host if you use it.": "pravidlo hostiteľského firewallu inštalácie sa znova nepridá; povoľte jeho port vo firewalle tohto hostiteľa, ak ho používate.", + "the memory limit it asks for cannot be applied": "požadovaný limit pamäte nemožno uplatniť", "the minimum number of characters is": "minimálny počet znakov je", "the qBittorrent schema is not available": "schéma qBittorrent nie je k dispozícii", "the record it carries does not belong to this container": "záznam, ktorý nesie, nepatrí do tohto kontajnera", "the record of the application does not list this container": "v zázname aplikácie nie je uvedený tento kontajner", + "the resource limits it asks for cannot be applied": "požadované limity systémových prostriedkov nemožno uplatniť", "the settings of its include are not in the record:": "nastavenia jeho include nie sú v zázname:", "the start order of its dependencies is not in the record": "poradie spúšťania jeho závislostí nie je v zázname", "this configuration needs the device": "táto konfigurácia potrebuje zariadenie", @@ -8154,10 +8274,10 @@ "umount the path if currently mounted": "odpojiť cestu, ak je práve pripojená", "unknown include:": "neznámy include:", "unknown mount hook:": "neznámy hook pripojenia:", - "unprivileged LXC": "LXC unprivileged", - "unsupported credential generator": "nepodporovaný credential generátor", - "unsupported dependency condition": "stav bez podpory závislosti", - "unsupported external credential or boolean": "nepodporované externé credential alebo boolean", + "unprivileged LXC": "neprivilegovaný LXC", + "unsupported credential generator": "nepodporovaný generátor prihlasovacích údajov", + "unsupported dependency condition": "nepodporovaná podmienka závislosti", + "unsupported external credential or boolean": "nepodporovaný externý prihlasovací údaj alebo logická hodnota", "unsupported variable": "nepodporovaná premenná", "updating": "aktualizácia", "updating NVIDIA userspace libs": "aktualizujem používateľské NVIDIA knižnice", @@ -8187,6 +8307,7 @@ "with Proxmox": "s Proxmox", "with prefix, e.g.": "s predponou, napr.", "with the password you provided.": "s heslom, ktoré ste zadali.", + "x-casaos.main must name an existing service.": "Položka x-casaos.main musí odkazovať na existujúcu službu.", "xemu is a free and open-source application that emulates the original Microsoft Xbox game console, enabling people to play their original Xbox games on Windows, macOS, and Linux systems.": "xemu je bezplatná a open-source aplikácia, ktorá napodobňuje originálnu konzolu Microsoft Xbox, ktorá umožňuje ľuďom hrať svoje pôvodné Xbox hry na systémoch Windows, macOS a Linux.", "xfs — Proxmox dir storage (large files and VMs)": "xfs — Proxmox dir úložisko (veľké súbory a VM)", "xfs — better for large files": "xfs - lepšie pre veľké súbory", @@ -8202,16 +8323,17 @@ "zfs-auto-snapshot removed (existing snapshots preserved on the pool)": "zfs-auto-snapshot bol odstránený (existujúce snapshoty v poole zostali zachované)", "zpool command not found. Install zfsutils-linux and retry.": "Príkaz zpool sa nenašiel. Nainštalujte zfsutils-linux a skúste to znova.", "zpool not found. Install zfsutils-linux and retry.": "zpool sa nenašiel. Nainštalujte zfsutils-linux a skúste to znova.", + "{application} runs in {count} containers.": "Počet kontajnerov aplikácie {application}: {count}.", "{count} saved account.": "{count} uložený účet.", "{count} saved accounts.": "{count} uložené účty.", "{path} already exists and belongs to another user of the host, so {app} cannot write to it.\n\nProxMenux can add access rules (ACL) to this directory, to everything inside it and to what is created there later, for the users and groups {app} runs as on the host (IDs {ids}). The owner of the files does not change and whatever reads or writes them today keeps doing so; the owner of the directory also gets access to the files {app} creates.\n\nGrant {app} access to this directory?": "{path} už existuje a patrí inému používateľovi hostiteľa, takže {app} naň nemôže zapisovať.\n\nProxMenux môže pridať pravidlá prístupu (ACL) k tomuto adresáru, ku všetkému v ňom a k tomu, čo sa v ňom vytvorí neskôr, pre používateľov a skupiny, pod ktorými {app} beží na hostiteľovi (ID {ids}). Vlastník súborov sa nemení a čokoľvek, čo ich dnes číta alebo zapisuje, to robí aj naďalej; vlastník adresára tiež získa prístup k súborom, ktoré {app} vytvorí.\n\nUdeliť {app} prístup k tomuto adresáru?", "{path} already exists and belongs to another user of the host, so {app} cannot write to it.\n\nProxMenux can add an access rule (ACL) for the identity {app} uses on the host (UID {uid}). Nothing that is there changes owner or permissions: whatever reads or writes those files today keeps doing so, and the owner of the directory also gets access to the files {app} creates.\n\nGrant {app} access to this directory?": "{path} už existuje a patrí inému používateľovi hostiteľa, takže {app} naň nemôže zapisovať.\n\nProxMenux môže pridať pravidlo prístupu (ACL) pre identitu, ktorú {app} používa na hostiteľovi (UID {uid}).Nič z toho, čo tam je, nemení vlastníka ani oprávnenia: čokoľvek, čo dnes číta alebo zapisuje tieto súbory, to robí aj naďalej a vlastník adresára tiež získa prístup k súborom, ktoré {app} vytvorí.\n\nUdeliť {app} prístup k tomuto adresáru?", - "{registry} answered with plain HTTP. Use a registry with HTTPS; TLS verification remains enabled.": "{registry} odpovedal jednoduchým HTTP. Použite register s HTTPS; Overenie TLS zostáva povolené.", + "{registry} answered with plain HTTP. Use a registry with HTTPS; TLS verification remains enabled.": "Register {registry} odpovedal nešifrovaným HTTP. Použite register s HTTPS. Overovanie TLS zostáva zapnuté.", "{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é)", diff --git a/lang/sv.json b/lang/sv.json index 34e596b1..5b65adf2 100644 --- a/lang/sv.json +++ b/lang/sv.json @@ -1,6 +1,9 @@ { "# Alternative if you prefer screen": "# Alternativ om du föredrar skärm", "# Recommended: avoids disconnection during upgrade": "# Rekommenderas: undviker frånkoppling under uppgradering", + "%s of %s updates failed — see the messages above.": "%s av %s uppdateringar misslyckades — se meddelandena ovan.", + "%s of %s updates failed.": "%s av %s uppdateringar misslyckades.", + "'auto'/'local', or root@IP for development": "'auto'/'local' eller root@IP för utveckling", "(Checked entries will be removed. Uncheck to keep in VM.)": "(Markerade poster kommer att tas bort. Avmarkera för att behålla i VM.)", "(Import is selected by default — required for disk image imports)": "(Import är valt som standard - krävs för import av diskavbildningar)", "(Only the host directory is modified. Nothing inside the container is changed.": "(Endast värdkatalogen ändras. Ingenting i behållaren ändras.", @@ -163,6 +166,7 @@ "APT configured to skip additional languages": "APT konfigurerad för att hoppa över ytterligare språk", "APT configured to skip downloading additional languages": "APT konfigurerad för att hoppa över nedladdning av ytterligare språk", "APT configured to use IPv4": "APT konfigurerad för att använda IPv4", + "APT hook syntax issue, removing...": "Syntaxproblem i APT-hook, tar bort...", "APT index update failed after switching to no-subscription. See log:": "APT-indexuppdatering misslyckades efter att ha bytt till ingen prenumeration. Se logg:", "APT index update failed. See log:": "APT-indexuppdatering misslyckades. Se logg:", "APT indexes updated for Trixie": "APT-index uppdaterade för Trixie", @@ -210,6 +214,7 @@ "Activate ProxMenux Monitor": "Aktivera ProxMenux Monitor", "Active": "Aktiv", "Active Connections": "Aktiva anslutningar", + "Active ZRAM algorithm, capacity or swap sources did not match the profile": "Aktiv ZRAM-algoritm, kapacitet eller swapkällor matchade inte profilen", "Active exports:": "Aktiv export:", "Active session:": "Aktiv session:", "Actual device path on the host": "Verklig enhetsväg på värden", @@ -263,6 +268,7 @@ "Add or remove extra paths and devices": "Lägg till eller ta bort extra sökvägar och enheter", "Add physical disk to VM via": "Lägg till fysisk disk till VM via", "Add share block in /etc/samba/smb.conf:": "Lägg till delningsblock i /etc/samba/smb.conf:", + "Add the host firewall rule of this container; one option for each confirmed rule": "Lägg till värdens brandväggsregel för den här behållaren; ett alternativ för varje bekräftad regel", "Add unprivileged flag to container configuration:": "Lägg till oprivilegierad flagga till behållarkonfigurationen:", "Add virtual disk": "Lägg till virtuell disk", "Add: Mount Host Directory into LXC": "Lägg till: Montera värdkatalog i LXC", @@ -337,6 +343,7 @@ "Aliases added to .bashrc": "Alias har lagts till i .bashrc", "Alist Sync web interface": "Alist Sync webbgränssnitt", "All": "Alla", + "All %s update(s) completed successfully.": "Alla %s uppdatering(ar) slutfördes utan fel.", "All Available Scripts": "Alla tillgängliga skript", "All GPUs Already Assigned": "Alla GPU:er redan tilldelade", "All ProxMenux optimizations are up to date.": "Alla ProxMenux-optimeringar är uppdaterade.", @@ -367,6 +374,9 @@ "All {count} containers of the application will be recreated from their saved image digests (main CT: {vmid}). The stack is stopped, every container is backed up and replaced, then checked. If the operation fails after a container was changed, the backups are restored. An operation that stops halfway is recovered from the OCI management menu.": "Alla {count} behållare i applikationen återskapas från sina sparade avbildsdigest (huvud-CT: {vmid}). Stacken stoppas, varje behållare säkerhetskopieras och ersätts och kontrolleras sedan. Om operationen misslyckas efter att en behållare har ändrats, återställs säkerhetskopiorna. En operation som stannar halvvägs återställs från OCI-hanteringsmenyn.", "Allocate CPU Cores": "Tilldela CPU-kärnor", "Allocate RAM in MiB": "Tilldela RAM i MiB", + "Allocated Cores:": "Tilldelade kärnor:", + "Allocated RAM:": "Tilldelat RAM:", + "Allocating virtual disk for %s...": "Allokerar virtuell disk för %s...", "Allow TCP port {port} from {subnet} through the host firewall? Existing firewall rules are not changed.": "Vill du tillåta TCP-port {port} från {subnet} genom värdbrandväggen? Befintliga brandväggsregler ändras inte.", "Allowed hosts (comma separated; * allows access through the assigned IP)": "Tillåtna värdar (komma separerade; * tillåter åtkomst via den tilldelade IP)", "Allowed source subnet:": "Tillåtet källundernät:", @@ -407,6 +417,7 @@ "Analyzing selected disks...": "Analyserar valda diskar...", "Analyzing system for available PCIe storage devices...": "Analyserar system för tillgängliga PCIe-lagringsenheter...", "Another OCI operation is using the instance registry": "En annan OCI operation använder instansregistret", + "Another OCI operation is using the instance registry.": "En annan OCI-åtgärd använder instansregistret.", "Another OCI operation is using the instance registry. Wait for it to finish and open this menu again; no container is modified.": "En annan OCI operation använder instansregistret. Vänta på att den ska slutföra och öppna den här menyn igen; ingen behållare modifieras.", "Another OCI operation is using the instance registry. Wait for it to finish.": "En annan OCI-operation använder instansregistret. Vänta tills det är klart.", "Another OCI operation is using the registry. This operation was not started.": "En annan OCI operation använder registret. Denna operation startades inte.", @@ -421,6 +432,7 @@ "Another registry account operation is running. Try again when it finishes.": "En annan registerkontooperation körs. Försök igen när det är klart.", "Another stack operation is pending": "En annan stack operation väntar", "Application": "Ansökan", + "Application data": "Applikationsdata", "Application registered on this host:": "Applikation registrerad på denna värd:", "Application responding:": "Ansökan svarar:", "Application responding; checking its stability...": "Ansökan svarar; kontrollera dess stabilitet...", @@ -566,6 +578,7 @@ "BIOS from": "BIOS från", "BIOS: OVMF (UEFI)": "BIOS: OVMF (UEFI)", "BOINC is a platform for high-throughput computing on a large scale (thousands or millions of computers). It can be used for volunteer computing (using consumer devices) or grid computing (using organizational resources). It supports virtualized, parallel, and GPU-based applications.": "BOINC är en plattform för hög genomströmning av datorer i stor skala (tusentals eller miljontals datorer). Den kan användas för volontärbehandling (med hjälp av konsumentenheter) eller nätbehandling (med hjälp av organisatoriska resurser). Den stöder virtualiserade, parallella och GPU-baserade applikationer.", + "BRIDGE": "BRYGGA", "BRIDGE CONFIGURATION ANALYSIS": "BROKONFIGURATIONSANALYS", "BTRFS:": "BTRFS:", "Baby Buddy web interface": "Baby Buddy webbgränssnitt", @@ -628,6 +641,7 @@ "Bandwidth limit configured": "Bandbreddsgräns konfigurerad", "Bandwidth test (iperf3)": "Bandbreddstest (iperf3)", "Bandwidth test completed successfully": "Bandbreddstestet slutförts framgångsrikt", + "Banner removal cancelled by user.": "Borttagningen av bannern avbröts av användaren.", "Base VM created with ID": "Bas-VM skapad med ID", "Base VMID": "Base VMID", "Base VMID (empty = next free block)": "Bas VMID (tomt = nästa fri block)", @@ -657,6 +671,7 @@ "Blocked GPU ID for VM Mode": "Blockerat GPU-ID för VM-läge", "Blocked device(s)": "Blockerade enheter", "Blocked device(s):": "Blockerade enheter:", + "Blockers": "Hinder", "BookStack web interface": "BookStack webbgränssnitt", "Bookstack is a free and open source Wiki designed for creating beautiful documentation. Featuring a simple, but powerful WYSIWYG editor it allows for teams to create detailed and useful documentation with ease.": "Bookstack är en gratis och öppen källkod Wiki utformad för att skapa vacker dokumentation. Med en enkel, men kraftfull WYSIWYG-redigerare gör det möjligt för team att skapa detaljerad och användbar dokumentation med lätthet.", "Boot Disk": "Startskiva", @@ -691,6 +706,7 @@ "Build and install the gasket and apex kernel modules (DKMS)": "Bygg och installera kärnmodulerna gasket och apex (DKMS)", "Build dependencies installed.": "Byggberoenden installerade.", "Build your personal knowledge base with TriliumNext Notes": "Bygg din personliga kunskapsbas med TriliumNext Notes", + "Bulk generation requires GITHUB_TOKEN to obtain an immutable revision per application": "Massgenerering kräver GITHUB_TOKEN för att hämta en oföränderlig revision per applikation", "Business & ERP": "Företag och ERP", "CHANGES APPLIED SUCCESSFULLY": "ÄNDRINGAR HAR TILLÄMPATS", "CIFS Client Tools: AVAILABLE": "CIFS-klientverktyg: TILLGÄNGLIGT", @@ -709,6 +725,7 @@ "CLUSTER UPGRADE NOTES:": "ANMÄRKNINGAR FÖR KLUSTERUPPGRADERING:", "CONFIGURED INTERFACES": "KONFIGURERADE GRÄNSSNITT", "CONFIRM FORMAT": "BEKRÄFTA FORMAT", + "CORE COUNT": "ANTAL KÄRNOR", "CPU": "CPU", "CPU Cores": "CPU-kärnor", "CPU MODEL": "CPU MODELL", @@ -720,7 +737,11 @@ "CRITICAL: The selected disk is referenced by a RUNNING VM or CT.": "KRITISKT: Den valda disken refereras av en RUNNING VM eller CT.", "CT": "CT", "CT started successfully.": "CT startade framgångsrikt.", + "CT {vmid} ({name}) could not be kept running; it is left stopped": "CT {vmid} ({name}) kunde inte hållas igång; den lämnas stoppad", + "CT {vmid} ({name}) stopped on its own; starting it again (attempt {attempt})": "CT {vmid} ({name}) stoppades av sig själv; startar den igen (försök {attempt})", "CT {vmid} is a host monitor and had a rule in the host firewall. Allow TCP port {port} from {subnet} through the firewall of this host? Existing firewall rules are not changed.": "CT {vmid} är en värdmonitor och hade en regel i värdbrandväggen. Vill du tillåta TCP-port {port} från {subnet} genom den här värdens brandvägg? Befintliga brandväggsregler ändras inte.", + "CT {vmid} is one of the {count} containers of {application}.": "CT {vmid} är en av de {count} behållarna i {application}.", + "CT {vmid}: DHCP client of {name} (IPv{version}) started again": "CT {vmid}: DHCP-klienten för {name} (IPv{version}) startades igen", "CUDA requires a working NVIDIA driver": "CUDA requires en fungerande NVIDIA-förare", "CUDA requires the NVIDIA Container Toolkit on the host": "CUDA requires NVIDIA Container Toolkit på värden", "Calculate all kinds of statistics from your (local) Emby or Jellyfin server": "Beräkna alla typer av statistik från din (lokal) Emby eller Jellyfin-server", @@ -737,6 +758,7 @@ "Cannot continue": "Kan inte fortsätta", "Cannot create:": "Kan inte skapa:", "Cannot detect filesystem on": "Kan inte identifiera filsystemet på", + "Cannot determine installed systemd-zram-generator version": "Kan inte avgöra vilken version av systemd-zram-generator som är installerad", "Cannot find": "Kan inte hitta", "Cannot identify the vendor of the device:": "Kan inte identifiera leverantören av enheten:", "Cannot inspect current swap configuration": "Kan inte inspektera aktuell växlingskonfiguration", @@ -871,8 +893,11 @@ "Checklist post-upgrade finished. Warnings:": "Checklista efter uppgradering avslutad. Varningar:", "Checklist pre-check finished. Warnings:": "Checklista förhandskontroll avslutad. Varningar:", "Checks for LVM and storage issues": "Kontrollerar LVM och lagringsproblem", + "Choose": "Välj", + "Choose BIOS Type": "Välj BIOS-typ", "Choose BIOS type": "Välj BIOS-typ", "Choose No to abort and roll back to the legacy refuse behaviour.": "Välj Nej för att avbryta och återgå till det gamla avslagsbeteendet.", + "Choose Type": "Välj typ", "Choose ZimaOS image option:": "Välj bildalternativ för ZimaOS:", "Choose a Samba server:": "Välj en Samba-server:", "Choose a Windows ISO to use:": "Välj en Windows ISO att använda:", @@ -972,10 +997,12 @@ "Cluster configuration (advanced)": "Klusterkonfiguration (avancerat)", "Cluster data will be applied automatically at next boot.": "Klusterdata kommer att tillämpas automatiskt vid nästa uppstart.", "Cluster upgrade mode": "Klusteruppgraderingsläge", + "Code": "Kod", "Code-server is VS Code running on a remote server, accessible through the browser.": "Kod-server är VS-kod som körs på en fjärrserver, tillgänglig via webbläsaren.", "CodeProject.AI Server": "CodeProject. AI Server", "Command": "Kommando", "Command failed": "Kommandot misslyckades", + "Command not found.": "Kommandot hittades inte.", "Command override for an unknown service:": "Kommando åsidosätter en okänd tjänst:", "Commenting any residual Bookworm lines in *.list...": "Kommenterar eventuella återstående Bookworm-rader i *.list...", "Commenting legacy PVE 8 repository .list files (if any)...": "Kommenterar äldre PVE 8-arkiv .list-filer (om några)...", @@ -1017,8 +1044,11 @@ "Component:": "Komponent:", "Components to uninstall (manual for now):": "Komponenter att avinstallera (manual för tillfället):", "Compose capabilities validated in the LXC user namespace:": "Komponera funktioner som valideras i LXC användarnamnrymden:", + "Compose environment must be a list or a mapping.": "Compose-miljön måste vara en lista eller en mappning.", "Compose file of the application": "Komponera fil för programmet", "Compose file of this host": "Komponera filen för denna värd", + "Compose ports must be a list.": "Compose-portar måste vara en lista.", + "Compose volumes must be a list.": "Compose-volymer måste vara en lista.", "Compressed size:": "Komprimerad storlek:", "Compressing": "Komprimerar", "Compression": "Kompression", @@ -1057,6 +1087,7 @@ "Configure Proxmox APT repositories": "Konfigurera Proxmox APT-förråd", "Configure Samba Client in LXC (only privileged)": "Konfigurera Samba Client i LXC (endast privilegierad)", "Configure Samba Server in LXC (only privileged)": "Konfigurera Samba Server i LXC (endast privilegierad)", + "Configure and install an application": "Konfigurera och installera en applikation", "Configure as guest (no authentication)": "Konfigurera som gäst (ingen autentisering)", "Configure backup destinations": "Konfigurera destinationer för säkerhetskopiering", "Configure backup destinations (PBS, Borg, local)": "Konfigurera destinationer för säkerhetskopiering (PBS, Borg, lokal)", @@ -1065,7 +1096,12 @@ "Configure the remote in the Rclone Web UI first. Checking its name may start a stopped CT, even in a dry run. Applying the mount restarts the CT and attempts to publish two FUSE views on the host; a dry run does not publish them.": "Konfigurera fjärrkontrollen i Rclone Web UI först. Att kontrollera dess namn kan starta en stoppad CT, även i en torrkörning. Genom att applicera monteringen startas om CT och försöker publicera två FUSE-vyer på värden;en torrkörning publicerar dem inte.", "Configure with username and password": "Konfigurera med användarnamn och lösenord", "Configured Ports": "Konfigurerade portar", + "Configured VM description": "VM-beskrivningen har konfigurerats", "Configured but doesn't exist": "Konfigurerad men existerar inte", + "Configured controller/NVMe as hostpci%s: %s": "Styrenhet/NVMe konfigurerad som hostpci%s: %s", + "Configured import disk %s as %s": "Importdisken %s konfigurerad som %s", + "Configured loader disk as ide0": "Loader-disken konfigurerad som ide0", + "Configured virtual disk as %s, %sGB on %s": "Virtuell disk konfigurerad som %s, %sGB på %s", "Configuring AMD GPU passthrough...": "Konfigurerar AMD GPU-passthrough...", "Configuring AMD softdep...": "Konfigurerar AMD softdep...", "Configuring APT to skip downloading additional languages": "Konfigurerar APT för att hoppa över nedladdning av ytterligare språk", @@ -1086,6 +1122,7 @@ "Configuring Proxmox APT repositories...": "Konfigurerar Proxmox APT-förråd...", "Configuring Proxmox filter...": "Konfigurerar Proxmox-filter...", "Configuring Proxmox jail...": "Konfigurerar Proxmox jail...", + "Configuring Serial Port:": "Konfigurerar seriell port:", "Configuring TCP optimizations...": "Konfigurerar TCP-optimeringar...", "Configuring TPM device": "Konfigurerar TPM-enhet", "Configuring Unpackerr...": "Konfigurera Unpackerr...", @@ -1161,6 +1198,7 @@ "Consider security implications for production environments": "Tänk på säkerhetsimplikationer för produktionsmiljöer", "Consider visiting the repository and supporting the project.": "Överväg att besöka arkivet och stödja projektet.", "Console log:": "Konsollogg:", + "Consume/export": "Consume/export", "Container": "Behållare", "Container — LXC root directories": "Behållare — LXC-rotkataloger", "Container ID": "Behållar-ID", @@ -1247,6 +1285,7 @@ "Controller + NVMe passthrough requires machine type q35. Skipping controller assignment.": "Styrenhets-/NVMe-passthrough kräver maskintypen q35. Hoppar över tilldelning av styrenheten.", "Controller/NVMe Conflict Policy": "Konfliktpolicy för styrenhet/NVMe", "Controller/NVMe already present in VM config": "Styrenhet/NVMe finns redan i VM-konfigurationen", + "Controller/NVMe already present in VM config (%s)": "Styrenhet/NVMe finns redan i VM-konfigurationen (%s)", "Controller/NVMe assigned": "Styrenhet/NVMe tilldelad", "Controller/NVMe is in use by running VM": "Styrenhet/NVMe används av en körande VM", "Controller/NVMe passthrough requires IOMMU enabled in BIOS/UEFI and kernel.": "Styrenhets-/NVMe-passthrough kräver att IOMMU är aktiverat i BIOS/UEFI och kärnan.", @@ -1313,6 +1352,7 @@ "Core packages": "Kärnpaket", "Cores": "Cores", "Corrupted gzip layer": "Korrupt gzip lager", + "Could not activate dev-zram0.swap": "Kunde inte aktivera dev-zram0.swap", "Could not add": "Kunde inte lägga till", "Could not add disk": "Det gick inte att lägga till disk", "Could not add the confirmed host firewall rule": "Det gick inte att lägga till den bekräftade värdbrandväggsregeln", @@ -1329,12 +1369,14 @@ "Could not change VM virtual display to vga: std": "Det gick inte att ändra virtuell skärm till vga: std", "Could not check the NVIDIA GPU": "Kan inte kontrollera NVIDIA GPU", "Could not clone any gasket-driver repository. Check your internet connection and": "Kunde inte klona något gasket-driver-arkiv. Kontrollera internetanslutningen och", + "Could not complete or verify the repository switch; changes may be partial and repository state is unknown. Inspect {ui} before retrying; no automatic rollback was attempted.": "Det gick inte att slutföra eller verifiera bytet av arkiv; ändringarna kan vara ofullständiga och arkivens tillstånd är okänt. Granska {ui} innan du försöker igen; ingen automatisk återställning gjordes.", "Could not complete private network release:": "Kunde inte slutföra det privata nätverket:", "Could not configure IOMMU kernel parameters automatically. Configure manually and reboot.": "Kunde inte konfigurera IOMMU kärnparametrar automatiskt. Konfigurera manuellt och starta om.", "Could not convert the OCI rootfs to privileged": "Kunde inte konvertera OCI rootfs till privilegierad", "Could not copy the PVE keyfile into place. Check permissions on:": "Det gick inte att kopiera PVE-nyckelfilen på plats. Kontrollera behörigheter på:", "Could not copy the keyfile into place.": "Kunde inte kopiera nyckelfilen på plats.", "Could not copy the keyfile into place. Check permissions on:": "Kunde inte kopiera nyckelfilen på plats. Kontrollera behörigheter på:", + "Could not create ZRAM generator directory": "Kunde inte skapa katalogen för ZRAM-generatorn", "Could not create a temporary directory for the NVIDIA Container Toolkit.": "Det gick inte att skapa en tillfällig katalog för NVIDIA Container Toolkit.", "Could not create converter directory:": "Kunde inte skapa omvandlingskatalog:", "Could not create destination directory:": "Kunde inte skapa målkatalog:", @@ -1391,6 +1433,7 @@ "Could not push the key. Check the password and that": "Kunde inte trycka på nyckeln. Kolla lösenordet och så", "Could not query the image registry": "Kunde inte fråga bildregistret", "Could not reach {registry}. Check its address, DNS and network access.": "Kunde inte nå {registry}. Kontrollera dess adress, DNS och nätverksåtkomst.", + "Could not reach {url} after 3 attempts: {reason}": "Kunde inte nå {url} efter 3 försök: {reason}", "Could not read SMART data from": "Det gick inte att läsa SMART-data från", "Could not read VM configuration.": "Det gick inte att läsa VM-konfigurationen.", "Could not read the CUDA compute capability": "Kunde inte läsa CUDA-beräkningsförmågan", @@ -1423,6 +1466,7 @@ "Could not stage pending restore. Nothing new was scheduled.": "Kunde inte scenen väntande återställning. Inget nytt var inplanerat.", "Could not stop LXC": "Kunde inte stoppa LXC", "Could not stop ZRAM swap; profile configuration remains": "Kunde inte stoppa ZRAM-byte; profilkonfigurationen kvarstår", + "Could not stop existing dev-zram0.swap": "Kunde inte stoppa befintlig dev-zram0.swap", "Could not translate the Compose command/entrypoint": "Kunde inte översätta kommandot Compose/entrypoint", "Could not unload nouveau module (may be in use). The blacklist will take effect after reboot. Installation will continue but a reboot will be required.": "Kunde inte ladda ner nouveau-modulen (kan vara i bruk). Svartlistan träder i kraft efter omstart. Installationen kommer att fortsätta men en omstart kommer att krävas.", "Could not unmount": "Det gick inte att avmontera", @@ -1431,6 +1475,8 @@ "Could not unmount — disk may be busy. Removing fstab entry anyway.": "Det gick inte att avmontera — disken kan vara upptagen. Tar bort fstab-posten ändå.", "Could not update config file.": "Kunde inte uppdatera konfigurationsfilen.", "Could not verify removal of the managed host firewall rule.": "Det gick inte att verifiera borttagningen av regeln för hanterad värdbrandvägg.", + "Could not write ZRAM generator configuration": "Kunde inte skriva ZRAM-generatorns konfiguration", + "Could not write ZRAM package ownership state": "Kunde inte skriva ägartillståndet för ZRAM-paketet", "Could not write to:": "Kunde inte skriva till:", "Crafty Controller default login": "Crafty Controller standard inloggning", "Create Directory": "Skapa katalog", @@ -1449,6 +1495,7 @@ "Create VM System Windows": "Skapa VM System Windows", "Create VM System macOS (OSX-PROXMOX)": "Skapa VM-system macOS (OSX-PROXMOX)", "Create VM from template or script": "Skapa virtuell dator från mall eller skript", + "Create a %s": "Skapa en %s", "Create a VM first (machine type q35 + UEFI BIOS), then run this option again.": "Skapa först en virtuell dator (maskintyp q35 + UEFI BIOS), kör sedan det här alternativet igen.", "Create a backup of the container configuration:": "Skapa en säkerhetskopia av behållarkonfigurationen:", "Create a backup of your container before proceeding": "Skapa en säkerhetskopia av din behållare innan du fortsätter", @@ -1473,6 +1520,7 @@ "Created persistent names for": "Skapat beständiga namn för", "Created remapped user": "Skapat ommappad användare", "Created sharedfiles group (GID: 101000)": "Skapade sharedfiles-grupp (GID: 101000)", + "Created with ProxMenuX": "Skapad med ProxMenuX", "Creating APT configuration to force IPv4...": "Skapar APT-konfiguration för att tvinga IPv4...", "Creating Ceph repository for PVE 8 (legacy format)...": "Skapar Ceph arkiv för PVE 8 (legacy format)...", "Creating Ceph repository for PVE 9 (deb822 format)...": "Skapar Ceph-arkiv för PVE 9 (deb822-format)...", @@ -1482,6 +1530,8 @@ "Creating UID remapping for unprivileged container compatibility...": "Skapar UID-ommappning för oprivilegierad containerkompatibilitet...", "Creating VM with the above configuration": "Skapar VM med ovanstående konfiguration", "Creating VM...": "Skapar VM...", + "Creating a %s using the above advanced settings": "Skapar en %s med de avancerade inställningarna ovan", + "Creating a %s using the above default settings": "Skapar en %s med standardinställningarna ovan", "Creating a backup in": "Skapa en säkerhetskopia i", "Creating a backup of": "Skapa en backup av", "Creating a backup of the container...": "Skapa en backup av behållaren...", @@ -1490,6 +1540,7 @@ "Creating backup of network interfaces configuration...": "Skapar säkerhetskopia av nätverksgränssnittskonfiguration...", "Creating compressed archive...": "Skapar komprimerat arkiv...", "Creating export archive...": "Skapar exportarkiv...", + "Creating images directory": "Skapar katalogen för avbilder", "Creating local archive...": "Skapar lokalt arkiv...", "Creating mount point...": "Skapar monteringspunkt...", "Creating partition table and partition...": "Skapar partitionstabell och partition...", @@ -1504,6 +1555,7 @@ "Creating the initial administrator...": "Skapa den första administratören...", "Creating the private network...": "Skapar det privata nätverket...", "Creating the temporary data container": "Skapa den tillfälliga databehållaren", + "Creating virtual disk (format=raw) for %s...": "Skapar virtuell disk (format=raw) för %s...", "Creative & Design": "Kreativitet och design", "Credential helper": "Credential helper", "Credential storage and access": "Autentiseringslagring och åtkomst", @@ -1564,6 +1616,8 @@ "Custom Configuration": "Anpassad konfiguration", "Custom Content": "Anpassat innehåll", "Custom Directory": "Anpassad katalog", + "Custom Image": "Anpassad avbild", + "Custom Loader Image (from %s)": "Anpassad loader-avbild (från %s)", "Custom Logo Instructions": "Anpassade logotyper", "Custom MOTD message is already configured": "Anpassat MOTD-meddelande är redan konfigurerat", "Custom Options": "Anpassade alternativ", @@ -1638,6 +1692,7 @@ "Dedicated container volume (included in backups)": "Dedikerad behållarvolym (ingår i säkerhetskopior)", "Dedicated container volumes (included in backups)": "Dedikerade behållarvolymer (ingår i säkerhetskopior)", "DeepSeek Harness “Everything is a Plugin“.": "DeepSeek Harness ”Allt är en plugin”.", + "Default": "Standard", "Default ACLs applied for group inheritance.": "Standard ACL:er tillämpas för grupparv.", "Default Credentials": "Standardinloggningsuppgifter", "Default Gateway": "Standardgateway", @@ -1880,9 +1935,11 @@ "Do you want to update the existing export?": "Vill du uppdatera den befintliga exporten?", "Do you want to update the existing share?": "Vill du uppdatera den befintliga andelen?", "Do you want to view the selected backup before restoring?": "Vill du se den valda säkerhetskopian innan du återställer?", + "Do-Over": "Gör om", "Docker Mods are only offered for compatible LinuxServer images": "Docker Mods erbjuds endast för kompatibla LinuxServer-bilder", "Docker Volume Backup": "Docker Volume Backup", "Docker/CLI not available yet or no valid answer": "Docker/CLI är inte tillgängligt än eller inget giltigt svar", + "Docs": "Dokumentation", "Documents & Notes": "Dokument och anteckningar", "Documents volume size in GB": "Dokumentvolymstorlek i 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 är en enkel att använda och mycket mångsidig Open Source wiki programvara som inte require en databas. Det är älskat av användare för sin rena och läsbara syntax. Enkelt underhåll, backup och integration gör det till en administratörs favorit. Byggd i åtkomstkontroller och autentiseringskontakter gör DokuWiki särskilt användbart i företagssammanhang och det stora antalet plugins som bidragits av dess livliga samhälle möjliggör ett brett spektrum av användningsfall utöver en traditionell wiki.", @@ -1898,6 +1955,7 @@ "Download its Compose file from an address": "Ladda ner sin Compose-fil från en adress", "Download keyfile": "Ladda ner nyckelfil", "Download latest VirtIO ISO automatically": "Ladda ner senaste VirtIO ISO automatiskt", + "Downloaded %s to %s": "Laddade ned %s till %s", "Downloaded OCI images deleted:": "Nedladdade OCI-bilder raderade:", "Downloaded amdgpu_top": "Laddade ner amdgpu_top", "Downloading": "Laddar ner", @@ -1943,8 +2001,12 @@ "Duration": "Varaktighet", "Duration:": "Varaktighet:", "Dynamic NVIDIA is only validated for unprivileged containers. This profile uses static mounts and must be recreated after the host driver changes.": "Dynamisk NVIDIA valideras endast för oprivilegierade behållare. Denna profil använder statiska fästen och måste återskapas efter att värdföraren ändras.", + "EFI Disk Storage": "Lagring för EFI-disk", + "EFI disk created (raw) and configured on %s": "EFI-disk skapad (raw) och konfigurerad på %s", "EFI disk created and configured on": "EFI-disk skapad och konfigurerad på", + "EFI disk created and configured on %s": "EFI-disk skapad och konfigurerad på %s", "EFI storage selection cancelled.": "Val av EFI-lagring avbröts.", + "EFI storage selection failed or was cancelled.": "Valet av lagring för EFI misslyckades eller avbröts.", "EFI storage selection failed or was cancelled. VM creation aborted.": "Val av EFI-lagring misslyckades eller avbröts. VM-skapandet avbröts.", "EMERGENCY PROXMOX SYSTEM REPAIR": "NÖDREPARATION AV PROXMOX-SYSTEM", "ENABLED for restore": "AKTIVERAD för återställning", @@ -1960,6 +2022,7 @@ "Edit raw CT configuration file": "Redigera rå CT-konfigurationsfil", "Edit raw VM configuration file": "Redigera rå VM-konfigurationsfil", "Edit the VM machine type to q35 and try again.": "Redigera VM-maskintypen till q35 och försök igen.", + "Edition:": "Utgåva:", "Email address for certificate expiry notices (required by ZeroSSL)": "E-postadress för certifikatutgångsmeddelanden (required av ZeroSSL)", "Email address of the LibreDB Studio administrator": "E-postadress till LibreDB Studio-administratören", "Email address of the NetBox admin account": "E-postadress för NetBox administratörskonto", @@ -1969,6 +2032,7 @@ "Emby organizes video, music, live TV, and photos from personal media libraries and streams them to smart TVs, streaming boxes and mobile devices. This container is packaged as a standalone emby Media Server.": "Emby organiserar video, musik, live-TV och bilder från personliga mediebibliotek och strömmar dem till smarta TV-apparater, streamingboxar och mobila enheter. Denna behållare är förpackad som en fristående emby Media Server.", "Emergency Proxmox System Repair": "Akut reparation av Proxmox-system", "Emergency recovery:": "Nödåterställning:", + "Emit numeric progress for the OCI menu": "Skriv ut numeriska förlopp för OCI-menyn", "Empowering the smart home": "Att stärka det smarta hemmet", "Empty": "Tömma", "Empty exec service check": "Tom exec service check", @@ -1991,6 +2055,7 @@ "Enable ZFS autotrim (SSD/NVMe pools)": "Aktivera ZFS autotrim (SSD/NVMe-pooler)", "Enable ZRAM swap profile": "Aktivera ZRAM-bytesprofil", "Enable a mount on an existing Rclone OCI container": "Möjliggöra en montering på en befintlig Rclone OCI behållare", + "Enable a mount on an installed Rclone OCI": "Aktivera en montering i en installerad Rclone OCI", "Enable an optical drive for MakeMKV": "Aktivera en optisk enhet för MakeMKV", "Enable auto-sync if /var/log exceeds 90% of its size?": "Aktivera automatisk synkronisering om /var/log överstiger 90 % av storleken?", "Enable fast reboots": "Aktivera snabba omstarter", @@ -2118,6 +2183,7 @@ "Enter target disk (e.g. /dev/sdX):": "Ange måldisk (t.ex. /dev/sdX):", "Enter target storage name (e.g., local-lvm):": "Ange mållagringsnamn (t.ex. local-lvm):", "Enter target storage:": "Ange mållagring:", + "Enter temporary folder path (default: %s):": "Ange sökväg till temporär mapp (standard: %s):", "Enter the BORG REPOKEY passphrase for target:": "Ange BORG REPOKEY-lösenfrasen för målet:", "Enter the Samba username:": "Ange Samba användarnamn:", "Enter the VMID for the new VM:": "Ange VMID för den nya virtuella datorn:", @@ -2144,6 +2210,7 @@ "Enterprise repository present": "Enterprise arkiv närvarande", "Enterprise repository returned 401 Unauthorized (no valid subscription). Switch to the no-subscription repository and retry?": "Enterprise arkiv returnerade 401 Unauthorized (ingen giltig prenumeration). Byt till arkivet utan prenumeration och försök igen?", "Enterprise repository unauthorized and fallback declined by user": "Enterprise arkiv obehörigt och reserv avvisad av användaren", + "Enterprise shares an APT stanza with other components. Split it in the Proxmox repository UI; no repository changed.": "Enterprise delar en APT-stanza med andra komponenter. Dela upp den i Proxmox-gränssnittet för arkiv; inget arkiv ändrades.", "Entropy generation optimization removed": "Entropigenereringsoptimering har tagits bort", "Environment entry without an explicit value": "Miljöinträde utan uttryckligt värde", "Environment override for an unknown service:": "Miljööverskridande för en okänd tjänst:", @@ -2153,6 +2220,7 @@ "Error": "Fel", "Error applying patch. Backups preserved at": "Fel vid applicering av patch. Säkerhetskopieringar bevarade kl", "Error details:": "Feldetaljer:", + "Error generating UUP download list.": "Fel vid generering av UUP-nedladdningslistan.", "Error installing": "Fel vid installation", "Error installing build dependencies. Check": "Fel vid installation av byggberoenden. Kontrollera", "Error:": "Fel:", @@ -2197,6 +2265,7 @@ "Execution engine for Index-TTS": "Exekveringsmotor för Index-TTS", "Existing Groups": "Befintliga grupper", "Existing TLS certificate reused:": "Befintligt TLS-certifikat återanvänds:", + "Existing ZRAM profile is active but does not match its configuration": "Den befintliga ZRAM-profilen är aktiv men matchar inte sin konfiguration", "Existing file, re-downloading...": "Befintlig fil, laddar ned igen...", "Existing filesystem:": "Befintligt filsystem:", "Existing hostpci entries detected — they will be reused": "Befintliga hostpci-poster har upptäckts – de kommer att återanvändas", @@ -2206,6 +2275,7 @@ "Exit": "Utgång", "Exit and repair manually": "Gå ur och reparera manuellt", "Exit the container terminal:": "Lämna containerterminalen:", + "Exit-Script": "Avsluta skriptet", "Exit: Stop to create backup manually": "Avsluta: Stopp för att skapa säkerhetskopia manuellt", "Exiting for manual repair...": "Avslutar för manuell reparation...", "Expected /tmp/gasket-driver/src not found. The clone seems incomplete or uses an unknown layout.": "Förväntat /tmp/gasket-driver/src hittades inte. Klonen verkar ofullständig eller använder en okänd layout.", @@ -2282,7 +2352,11 @@ "Failed to add bind mount:": "Det gick inte att lägga till bindningsmontering:", "Failed to add iSCSI storage to Proxmox.": "Det gick inte att lägga till iSCSI-lagring till Proxmox.", "Failed to add storage to Proxmox.": "Det gick inte att lägga till lagring till Proxmox.", + "Failed to allocate virtual disk %s": "Det gick inte att allokera virtuell disk %s", "Failed to assign Controller/NVMe": "Det gick inte att tilldela styrenhet/NVMe", + "Failed to assign disk %s (%s) on %s": "Det gick inte att tilldela disk %s (%s) på %s", + "Failed to assign loader disk": "Det gick inte att tilldela loader-disken", + "Failed to assign loader disk to ide0": "Det gick inte att tilldela loader-disken till ide0", "Failed to assign virtual disk": "Det gick inte att tilldela virtuell disk", "Failed to clone Lynis from GitHub": "Det gick inte att klona Lynis från GitHub", "Failed to clone log2ram repository. Check /tmp/log2ram_install.log": "Det gick inte att klona log2ram-förrådet. Kontrollera /tmp/log2ram_install.log", @@ -2291,8 +2365,11 @@ "Failed to configure Proxmox Backup Server repositories": "Det gick inte att konfigurera Proxmox Backup Server-förråd", "Failed to configure Proxmox repositories": "Det gick inte att konfigurera Proxmox-förråd", "Failed to configure TPM device in VM": "Det gick inte att konfigurera TPM-enhet i virtuell dator", + "Failed to configure controller/NVMe: %s": "Det gick inte att konfigurera styrenhet/NVMe: %s", + "Failed to configure import disk %s as %s": "Det gick inte att konfigurera importdisken %s som %s", "Failed to configure repositories.": "Det gick inte att konfigurera förråd.", "Failed to configure repositories. Installation aborted.": "Det gick inte att konfigurera förråd. Installationen avbröts.", + "Failed to configure virtual disk as %s": "Det gick inte att konfigurera virtuell disk som %s", "Failed to connect to": "Det gick inte att ansluta till", "Failed to connect to server.": "Det gick inte att ansluta till servern.", "Failed to copy sources into": "Det gick inte att kopiera källor till", @@ -2366,7 +2443,9 @@ "Failed to install intel-gpu-tools": "Det gick inte att installera intel-gpu-tools", "Failed to install libedgetpu1-std. Check": "Det gick inte att installera libedgetpu1-std. Kontrollera", "Failed to install pigz": "Det gick inte att installera pigz", + "Failed to install unzip": "Det gick inte att installera unzip", "Failed to install zfs-auto-snapshot": "Det gick inte att installera zfs-auto-snapshot", + "Failed to install:": "Det gick inte att installera:", "Failed to migrate the existing ProxMenux Bash configuration.": "Det gick inte att migrera den befintliga ProxMenux Bash-konfigurationen.", "Failed to mount CIFS share on host.": "Det gick inte att montera CIFS-resurs på värden.", "Failed to mount NFS share on host.": "Det gick inte att montera NFS-resurs på värden.", @@ -2550,6 +2629,7 @@ "Full path": "Fullständig sökväg", "Full report — complete SMART data (scrollable)": "Fullständig rapport — komplett SMART-data (rullbar)", "Full system upgrade, including dependencies": "Fullständig systemuppgradering, inklusive beroenden", + "Function '%s' is not defined in the %s flow.": "Funktionen '%s' är inte definierad i flödet %s.", "Function Level Reset (FLR) not available": "Funktionsnivååterställning (FLR) inte tillgänglig", "GID already in use:": "GID som redan används:", "GID in CT": "GID i CT", @@ -2628,6 +2708,7 @@ "Generated Paperless administrator": "Genererad papperslös administratör", "Generated Tandoor administrator": "Genererad Tandoor administratör", "Generated administrator login": "Genererad administratörsinloggning", + "Generated: {generated}; failed: {failed}; family: {provider}": "Genererade: {generated}; misslyckade: {failed}; familj: {provider}", "Generating OVF descriptor...": "Genererar OVF-beskrivning...", "Generating dkms.conf...": "Genererar dkms.conf...", "Generating manifest...": "Genererar manifest...", @@ -2639,6 +2720,9 @@ "Get the container's storage information:": "Hämta behållarens lagringsinformation:", "Get up and running with large language models locally": "Kom igång med stora språkmodeller lokalt", "Git installed": "Git installerat", + "GitHub returned HTTP 403 for {url}. Set GITHUB_TOKEN to raise the API rate limit.": "GitHub returnerade HTTP 403 för {url}. Ange GITHUB_TOKEN för att höja API:ets gräns för antal förfrågningar.", + "GitHub returned HTTP {status} for {url}.": "GitHub returnerade HTTP {status} för {url}.", + "GitHub returned a truncated tree for the CasaOS catalogue": "GitHub returnerade ett trunkerat träd för CasaOS-katalogen", "GitQlient is a multi-platform Git client originally forked from QGit. Nowadays it goes beyond of just a fork and adds a lot of new functionality.": "GitQlient är en multiplattform Git klient ursprungligen forked från QGit. Numera går det bortom bara en fork och lägger till en hel del ny funktionalitet.", "Github Desktop is an open source Electron-based GitHub app. It is written in TypeScript and uses React.": "Github Desktop är en öppen källkod Electron-baserad GitHub app. Den är skriven i TypeScript och använder React.", "Global settings and SSH jail configured": "Globala inställningar och SSH-fängelse konfigurerade", @@ -2691,6 +2775,7 @@ "HAOS One is a community image that runs Docker inside the container. The LXC stays unprivileged, but the inner AppArmor profiles may not be available. The first start downloads Home Assistant Core and its add-ons. If the check fails, the CT and /mnt/data are kept for diagnosis.": "HAOS One är en gemenskapsbild som kör Docker inuti behållaren. LXC är oprivilegierad, men de inre AppArmor-profilerna kanske inte är tillgängliga. Den första starten hämtar Home Assistant Core och dess tillägg. Om kontrollen misslyckas, CT och /mnt / data hålls för diagnos.", "HAOS One profile declined": "HAOS One-profilen minskade", "HAOS One requires an unprivileged unmanaged LXC with nesting and keyctl, 2 cores, 2048 MB RAM, rootfs of at least 12 GB and /mnt/data of at least 16 GB on a container volume included in backups": "HAOS One requires en oprivilegierad ohanterad LXC med häckning och keyctl, 2 kärnor, 2048 MB RAM, rötter på minst 12 GB och /mnt / data på minst 16 GB på en behållarvolym som ingår i backups", + "HOSTNAME": "VÄRDNAMN", "HTML5 Network Speed Test Server.": "HTML5 Network Speed Test Server.", "HTTP service check without a saved URL": "HTTP service check utan sparad URL", "Habridge emulates Philips Hue API to other home automation gateways such as an Amazon Echo/Dot Gen 1 (gen 2 has issues discovering ha-bridge) or other systems that support Philips Hue. The Bridge handles basic commands such as On, Off and brightness commands of the hue protocol. This bridge can control most devices that have a distinct API.": "Habridge emulerar Philips Hue API till andra hemautomatiseringsgateways som Amazon Echo / Dot Gen 1 (gen 2 har problem med att upptäcka ha-bro) eller andra system som stöder Philips Hue. Bron hanterar grundläggande kommandon som On, Off och ljusstyrka kommandon av nyansprotokollet. Denna bro kan styra de flesta enheter som har ett tydligt API.", @@ -2786,6 +2871,7 @@ "Host device node": "Värd enhet nod", "Host directories are not included in the backup and are not reverted by a recovery.": "Värdkataloger ingår inte i backupen och återställs inte av en återhämtning.", "Host directories are not included in the backups and are not reverted by a recovery.": "Värdkataloger ingår inte i säkerhetskopiorna och återställs inte av en återhämtning.", + "Host directories are not reverted by the backup (confirmed beforehand)": "Värdkataloger återställs inte av säkerhetskopian (bekräftat i förväg)", "Host directories cannot be included in vzdump": "Värdkataloger kan inte inkluderas i vzdump", "Host directories cannot be part of the vzdump backup": "Värdkataloger kan inte vara en del av vzdump backup", "Host directories that are kept, with their content:": "Värdkataloger som hålls, med deras innehåll:", @@ -2809,6 +2895,7 @@ "Host fstab NFS mounts (not registered with pvesm):": "Värdens NFS-monteringar i fstab (inte registrerade med pvesm):", "Host fstab NFS mounts:": "Värdens NFS-monteringar i fstab:", "Host fstab mounts (not registered as Proxmox storage):": "Host fstab-fästen (ej registrerad som Proxmox-lagring):", + "Host has an active subscription but no active {short} repository. Configure its Enterprise source in {ui}; no repository changed.": "Värden har en aktiv prenumeration men inget aktivt {short}-arkiv. Konfigurera dess Enterprise-källa i {ui}; inget arkiv ändrades.", "Host identity (hostname, hosts)": "Värdidentitet (värdnamn, värdar)", "Host kernel module loaded:": "Värd kärnmodul laddad:", "Host monitor configured: shared PID and network namespaces, LXCFS disabled in this container": "Värdmonitor konfigurerad: delade PID och nätverksnamn, LXCFS inaktiverad i denna behållare", @@ -2838,6 +2925,7 @@ "Htpcmanager is a front end for many htpc related applications.": "Htpcmanager är en frontend för många htpc-relaterade applikationer.", "I have read this": "Jag har läst detta", "I/O priority configured": "I/O-prioritet konfigurerad", + "ID %s is already in use": "ID %s används redan", "ID already in use. Please choose another.": "ID används redan. Välj en annan.", "IGDB": "IGDB", "IGDB Client ID": "IGDB Client ID", @@ -2891,6 +2979,7 @@ "ISO image — installation images": "ISO-bild — installationsbilder", "ISO image downloaded": "ISO-bild nedladdad", "ISO not found to mount on device": "ISO hittades inte för att montera på enheten", + "Icons resolved: {resolved}; cleared: {cleared}; unchanged: {unchanged}; with a theme variant: {themed}": "Ikoner lösta: {resolved}; rensade: {cleared}; oförändrade: {unchanged}; med temavariant: {themed}", "Identical:": "Identisk:", "Identify candidate disk (never use system disk):": "Identifiera kandidatdisken (använd aldrig systemdisken):", "Identify persistent disk paths": "Identifiera beständiga diskvägar", @@ -2898,6 +2987,7 @@ "If Code 43 error appears, KVM hiding is already configured.": "Om kod 43-fel visas är KVM-döljning redan konfigurerad.", "If GUI does not load:": "Om GUI inte laddas:", "If ZFS errors occur:": "Om ZFS-fel uppstår:", + "If a newer application image is available, the container is stopped and backed up, and the backup integrity is verified. The container is then updated using the new image.\n\nIf the update fails after the container was changed, ProxMenux attempts to restore the previous installation from the backup. If the operation remains incomplete, select the application in OCI management and choose \"Recover the previous installation\".\n\nHost directories mounted in the container are not restored by the container backup.": "Om en nyare avbild av applikationen finns tillgänglig stoppas behållaren, en säkerhetskopia tas och säkerhetskopians integritet verifieras. Därefter uppdateras behållaren med den nya avbilden.\n\nOm uppdateringen misslyckas efter att behållaren har ändrats försöker ProxMenux återställa den tidigare installationen från säkerhetskopian. Om åtgärden förblir ofullständig väljer du applikationen i OCI-hanteringen och väljer \"Återställ den tidigare installationen\".\n\nVärdkataloger som är monterade i behållaren återställs inte av behållarens säkerhetskopia.", "If booting in EFI mode with root on LVM: install GRUB for EFI": "Om du startar i EFI-läge med root på LVM: installera GRUB för EFI", "If config issues occur:": "Om konfigurationsproblem uppstår:", "If container won't start:": "Om behållaren inte startar:", @@ -2955,6 +3045,7 @@ "Image selection was cancelled": "Valet av avbild avbröts", "Image that is not in the catalog": "Bild som inte finns i katalogen", "Image:": "Bild:", + "Images directory created: %s": "Katalogen för avbilder skapad: %s", "Images to import:": "Bilder att importera:", "Immich CUDA requires NVIDIA driver 545 or later": "Immich CUDA requires NVIDIA-förare 545 eller senare", "Immich GPU profile not validated": "Immich GPU-profil som inte valideras", @@ -2986,6 +3077,7 @@ "Imported:": "Importerad:", "Importing": "Importerar", "Importing disk": "Importerar disk", + "Importing loader disk:": "Importerar loader-disk:", "Importing:": "Importerar:", "Improve log rotation and limit log size to save space and extend disk life": "Förbättra loggrotationen och begränsa loggstorleken för att spara utrymme och förlänga diskens livslängd", "In an LXC": "I en LXC", @@ -3040,6 +3132,7 @@ "Independent LXC applications installed": "Oberoende LXC-program installerade", "Independent LXCs: no main container or hookscript. Each one keeps its own Start with Proxmox setting.": "Oberoende LXCs: ingen huvudbehållare eller hookscript. Var och en håller sin egen start med Proxmox inställning.", "Independent applications, without a main container.": "Oberoende applikationer, utan huvudbehållare.", + "Index updated: {count} candidate applications": "Index uppdaterat: {count} kandidatapplikationer", "Indexers and quality profiles still need to be configured.": "Indexers och kvalitetsprofiler behöver fortfarande konfigureras.", "Inherited retention:": "Ärvd retention:", "Inherited schedule:": "Ärvt schema:", @@ -3110,7 +3203,10 @@ "Install with: apt-get install open-iscsi": "Installera med: apt-get install open-iscsi", "Install/Update Coral TPU on Host": "Installera/uppdatera Coral TPU på värd", "Install/Update NVIDIA Drivers (Host + LXC)": "Installera/uppdatera NVIDIA-drivrutiner (värd + LXC)", + "Install? [y/N]:": "Installera? [y/N]:", "Installation Complete": "Installationen är klar", + "Installation blocked:": "Installationen blockerad:", + "Installation cancelled.": "Installationen avbröts.", "Installation completed": "Installation färdig", "Installation completed.": "Installationen är klar.", "Installation completed. Please reboot the server manually as soon as possible.": "Installationen är klar. Vänligen starta om servern manuellt så snart som möjligt.", @@ -3124,6 +3220,7 @@ "Installed": "Installerad", "Installed at:": "Installerad på:", "Installed components:": "Installerade komponenter:", + "Installed unzip successfully.": "unzip installerades.", "Installed:": "Installerat:", "Installer already downloaded and verified.": "Installationsprogrammet har redan laddats ner och verifierats.", "Installer copied to container.": "Installatören kopierad till behållaren.", @@ -3165,6 +3262,7 @@ "Installing and configuring Figurine...": "Installerar och konfigurerar Figurine...", "Installing and configuring ZFS auto-snapshot...": "Installerar och konfigurerar ZFS auto-snapshot...", "Installing build dependencies...": "Installerar byggberoenden...", + "Installing dependencies:": "Installerar beroenden:", "Installing dependency:": "Installationsberoende:", "Installing essential Proxmox packages...": "Installerar viktiga Proxmox-paket...", "Installing gawk (required for OVF parsing)...": "Installerar gawk (krävs för OVF-analys)...", @@ -3187,9 +3285,11 @@ "Installing the new image...": "Installera den nya bilden...", "Installing the new image:": "Installera den nya bilden:", "Installing the stack startup hook...": "Installera stack start hook...", + "Installing unzip...": "Installerar unzip...", "Installing zfs-auto-snapshot package...": "Installerar paketet zfs-auto-snapshot...", "Installs essential packages if missing": "Installerar viktiga paket om de saknas", "Insufficient Disk Space": "Otillräckligt diskutrymme", + "Insufficient disk space. Available:": "Otillräckligt diskutrymme. Tillgängligt:", "Insufficient disk space. Skipping LXC": "Otillräckligt diskutrymme. Hoppa över LXC", "Insufficient memory. NVIDIA install aborted.": "Otillräckligt minne. NVIDIA-installationen avbröts.", "Insufficient memory. Skipping LXC": "Otillräckligt minne. Hoppa över LXC", @@ -3225,12 +3325,15 @@ "Interfaces to Remove": "Gränssnitt att ta bort", "Internal error: NVIDIA installer path is empty or file not found.": "Internt fel: NVIDIAs installationssökväg är tom eller filen hittades inte.", "Internal error: missing arguments in pmx_prepare_host_shared_dir": "Internt fel: saknade argument i pmx_prepare_host_shared_dir", + "Internal installer operation; not legacy adoption": "Intern installationsåtgärd; inte ett övertagande av äldre installation", "Internal subnet of the tunnel (change it only if it clashes)": "Internt undernät av tunneln (ändra det bara om det sammandras)", "Interrupted operation": "Avbruten operation", "Interrupted operation:": "Avbruten operation:", "Interrupted stack operation found": "Avbruten stack operation hittades", "Invalid 'proxmox-ve' candidate (not 9.x or none). Please verify your repository configuration and network, then retry.": "Ogiltig 'proxmox-ve'-kandidat (inte 9.x eller ingen). Verifiera din arkivkonfiguration och ditt nätverk och försök sedan igen.", "Invalid ALLOWED_HOSTS value": "Invalid ALLOWED_HOSTS värde", + "Invalid Compose port:": "Ogiltig Compose-port:", + "Invalid Compose volume path:": "Ogiltig sökväg för Compose-volym:", "Invalid Home Assistant OS check timeout": "Ogiltig Home Assistant OS check timeout", "Invalid ID": "Ogiltigt ID", "Invalid IPv4 address": "Ogiltig IPv4-adress", @@ -3266,6 +3369,7 @@ "Invalid action": "Ogiltig åtgärd", "Invalid administrator email": "Invalid administratör e-post", "Invalid administrator user name": "Invalid administratör användarnamn", + "Invalid application identifier:": "Ogiltig applikationsidentifierare:", "Invalid base VMID": "Ogiltig bas VMID", "Invalid bridge": "Ogiltig brygga", "Invalid check package:": "Ogiltigt checkpaket:", @@ -3397,7 +3501,9 @@ "JSON output for scripts": "JSON-utgång för skript", "Jackett works as a proxy server: it translates queries from apps (Sonarr, SickRage, CouchPotato, Mylar, etc) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software. This allows for getting recent uploads (like RSS) and performing searches. Jackett is a single repository of maintained indexer scraping & translation logic - removing the burden from other apps.": "Jackett fungerar som en proxyserver: det översätter frågor från appar (Sonarr, SickRage, CouchPotato, Mylar, etc) till tracker-site-specifika http-frågor, parses html svar, sedan skickar resultat tillbaka till den begärda programvaran. Detta gör det möjligt att få nya uppladdningar (som RSS) och utföra sökningar. Jackett är en enda förvaring av underhållen indexerskrapning och översättningslogik - ta bort bördan från andra appar.", "Jellyfin WebUI": "Jellyfin WebUI", + "Jellyfin configuration already applied:": "Jellyfin-konfigurationen är redan tillämpad:", "Jellyfin configuration applied:": "Jellyfin-konfiguration tillämpad:", + "Jellyfin configuration updated:": "Jellyfin-konfigurationen uppdaterad:", "Jellyfin did not create encoding.xml before the timeout": "Jellyfin skapade inte encoding.xml före timeout", "Jellyfin has not created encoding.xml in any declared path": "Jellyfin har inte skapat kodning.xml i någon förklarad väg", "Jellyseerr is a free and open source software application for managing requests for your media library.": "Jellyseerr är en fri och öppen källkod program för hantering av förfrågningar för ditt mediebibliotek.", @@ -3440,6 +3546,7 @@ "Keep current version (N)": "Behåll aktuell version (N)", "Keep current version (N) if modified": "Behåll aktuell version (N) om den ändras", "Keep in source VM(s) + disable onboot + add to target VM": "Behåll i käll-VM:er + inaktivera onboot + lägg till mål-VM", + "Keep the backup taken before the update in this Proxmox storage": "Behåll säkerhetskopian som togs före uppdateringen i den här Proxmox-lagringen", "Keeping GPU in source VM config": "Behåller GPU i käll-VM-konfigurationen", "Keeping the settings changed in Proxmox:": "Att hålla inställningarna ändrade i Proxmox:", "Kept sharedfiles group (has regular users assigned).": "Kept sharedfiles group (har tilldelade vanliga användare).", @@ -3506,6 +3613,7 @@ "Language Change": "Språkbyte", "Language changed to": "Språket ändrades till", "Language/locale (e.g. es_ES.UTF-8; translation of every application is not guaranteed)": "Språk/lokal (t.ex. es ES.UTF-8; översättning av varje ansökan garanteras inte)", + "Language:": "Språk:", "Last 50 kernel log lines": "Senaste 50 kärnloggraderna", "Last run:": "Senaste körningen:", "Last system boot time": "Sista systemstarttid", @@ -3525,6 +3633,7 @@ "Let's review your current network configuration.": "Låt oss granska din nuvarande nätverkskonfiguration.", "Liberate your videos and unleash infinite possibilities.": "Befria dina videor och frigöra oändliga möjligheter.", "Libraries: /data/media/movies, /data/media/series and /data/media/music. Select them in the media server.": "Bibliotek: /data/media/filmer,/data/media/serie och/data/media/musik. Välj dem i mediaservern.", + "Library": "Bibliotek", "Library size in GB": "Bibliotekets storlek i GB", "LibreDB Studio": "LibreDB Studio", "LibreOffice is a free and powerful office suite, and a successor to OpenOffice.org (commonly known as OpenOffice). Its clean interface and feature-rich tools help you unleash your creativity and enhance your productivity.": "LibreOffice är en fri och kraftfull kontorssvit och en efterträdare till OpenOffice.org (vanligen känd som OpenOffice). Dess rena gränssnitt och funktionsrika verktyg hjälper dig att frigöra din kreativitet och förbättra din produktivitet.", @@ -3553,6 +3662,7 @@ "List all containers to identify the privileged one:": "Lista alla behållare för att identifiera den privilegierade:", "List all containers to identify the unprivileged one:": "Lista alla behållare för att identifiera den oprivilegierade:", "List all virtual machines": "Lista alla virtuella maskiner", + "List applications": "Lista applikationer", "List backups in a specific storage": "Lista säkerhetskopior i en specifik lagring", "List block devices and partitions": "Lista blockenheter och partitioner", "List configured storages:": "Lista konfigurerade lagringar:", @@ -3568,6 +3678,13 @@ "Listening ports:": "Lyssningsportar:", "Listing relevant CT users and their mapped UID/GID on host...": "Listar relevanta CT-användare och deras mappade UID/GID på värd...", "Load and verify the WireGuard module on the Proxmox host": "Ladda och verifiera WireGuard modulen på Proxmox värd", + "Loader": "Loader", + "Loader configured as boot device.": "Loader konfigurerad som startenhet.", + "Loader import failed. No disk detected in config.": "Import av loader misslyckades. Ingen disk hittades i konfigurationen.", + "Loader import failed. No disk detected.": "Import av loader misslyckades. Ingen disk hittades.", + "Loader imported successfully to %s": "Loader importerad till %s", + "Loader storage selection failed or was cancelled.": "Valet av lagring för loader misslyckades eller avbröts.", + "Loader:": "Loader:", "Loading modules...": "Laddar moduler...", "Loading the Helper-Scripts catalog...": "Läser in Helper-Scripts-katalogen...", "Loading the host kernel module:": "Loading the host kernel modul:", @@ -3631,16 +3748,20 @@ "Lyrion Music Server is a streaming audio server for Squeezebox audio players.": "Lyrion Music Server är en strömmande ljudserver för Squeezebox ljudspelare.", "M.2 / PCIe devices:": "M.2/PCIe-enheter:", "M3U proxy server": "M3U proxy server", + "MAC ADDRESS": "MAC-ADRESS", "MAC Address": "MAC-adress", "MAC address": "MAC-adress", "MACHINE TYPE": "MASKINTYP", "MAME is a free and open-source emulator designed to emulate the hardware of arcade games, video game consoles, old computers and other systems in software on modern personal computers.": "MAME är en fri och öppen källkod emulator utformad för att efterlikna hårdvaran av arkadspel, videospel konsoler, gamla datorer och andra system i programvara på moderna datorer.", "MOTD configuration updated successfully": "MOTD-konfigurationen har uppdaterats", "MOTD configuration was already up to date": "MOTD-konfigurationen var redan uppdaterad", + "MTU SIZE": "MTU-STORLEK", "Machine Type": "Maskintyp", + "Machine i440fx": "Maskin i440fx", "Machine learning": "maskininlärning", "Machine learning container prepared": "Maskininlärningsbehållare förberedd", "Machine learning profile not implemented; it is not replaced by CPU:": "Maskininlärningsprofil som inte genomförs; den ersätts inte av CPU:", + "Machine q35": "Maskin q35", "Machine type: q35": "Maskintyp: q35", "Machine: q35": "Maskin: q35", "Main endpoint not yet defined": "Huvud endpoint ännu inte definierad", @@ -4086,6 +4207,7 @@ "No Changes Needed": "Inga ändringar behövs", "No Cleanup Needed": "Ingen rengöring behövs", "No Compose file was given": "Ingen Compose-fil gavs", + "No Compose files were found in the CasaOS catalogue": "Inga Compose-filer hittades i CasaOS-katalogen", "No Controller/NVMe selected for now.": "Ingen styrenhet/NVMe har valts för tillfället.", "No Coral Detected": "Ingen Coral upptäckt", "No Coral TPU device was found on this host (neither PCIe/M.2 nor USB).": "Ingen Coral TPU-enhet hittades på denna värd (varken PCIe/M.2 eller USB).", @@ -4179,6 +4301,7 @@ "No accessible Samba servers found.": "Inga tillgängliga Samba-servrar hittades.", "No accessible exports found.": "Inga tillgängliga exporter hittades.", "No accessible shares found.": "Inga tillgängliga delningar hittades.", + "No active Debian base repository for this suite; configure it in the Proxmox repository UI before continuing.": "Inget aktivt Debian-basarkiv för den här sviten; konfigurera det i Proxmox-gränssnittet för arkiv innan du fortsätter.", "No active Proxmox storage accepts OCI template archives.": "Ingen aktiv Proxmox-lagring accepterar OCI-mallarkiv.", "No active exports or showmount not available": "Inga aktiva exporter eller showmount är inte tillgängligt", "No active session": "Ingen aktiv session", @@ -4208,12 +4331,14 @@ "No compatible GPUs were detected on this host.": "Inga kompatibla GPU:er upptäcktes på denna värd.", "No compatible PVE jobs": "Inga kompatibla PVE-jobb", "No compatible disk images found in:": "Inga kompatibla diskbilder hittades i:", + "No compatible images found in %s\n\nSupported formats: .img, .iso, .qcow2, .vmdk\n\nPlease add some images and try again.": "Inga kompatibla avbilder hittades i %s\n\nFormat som stöds: .img, .iso, .qcow2, .vmdk\n\nLägg till några avbilder och försök igen.", "No configuration issues found": "Inga konfigurationsproblem hittades", "No container of the stack was modified.": "Ingen behållare av stacken modifierades.", "No container runtime available.": "Ingen containerkörning tillgänglig.", "No container selected. Exiting.": "Ingen behållare har valts. Avslutar.", "No controller/NVMe selected.": "Ingen styrenhet/NVMe har valts.", "No controllers remaining after conflict resolution.": "Inga kontroller kvar efter konfliktlösning.", + "No custom image selected": "Ingen anpassad avbild vald", "No custom key (rely on default SSH config)": "Ingen anpassad nyckel (lita på standard SSH-konfiguration)", "No custom logos were found in /usr/local/share/fastfetch/logos/.\n\nPlease add a logo and try again.": "Inga anpassade logotyper hittades i /usr/local/share/fastfetch/logos/.\n\nLägg till en logotyp och försök igen.", "No desktop UI backup found, will reinstall packages": "Ingen säkerhetskopia på skrivbordet hittades, kommer att installera om paket", @@ -4226,6 +4351,7 @@ "No disks were added.": "Inga diskar har lagts till.", "No disks were configured for processing.": "Inga diskar har konfigurerats för bearbetning.", "No disks were selected.": "Inga diskar har valts.", + "No disks/controllers configured.": "Inga diskar/styrenheter konfigurerade.", "No docker run command was given": "Inget docker run-kommando angavs", "No duplicate IP addresses": "Inga dubbletter av IP-adresser", "No duplicate repositories found": "Inga dubbletter av arkiv hittades", @@ -4331,6 +4457,7 @@ "No supported NVIDIA versions found for this GPU": "Inga NVIDIA-versioner som stöds hittades för denna GPU", "No sysfs ROM entry — trying ACPI VFCT table...": "Ingen sysfs ROM-post — försöker ACPI VFCT-tabell...", "No target configured.": "Inget mål konfigurerat.", + "No template is available for '{app_id}'": "Ingen mall är tillgänglig för '{app_id}'", "No test currently running": "Inget test körs just nu", "No unambiguous loader download found in release metadata.": "Ingen entydig laddarnedladdning hittades i releasemetadata.", "No uninstaller found for:": "Inget avinstallationsprogram hittades för:", @@ -4472,6 +4599,7 @@ "Only one service at a time can be installed this way.": "Bara en tjänst i taget kan installeras på det här sättet.", "Only removes storage definition, not remote data.": "Tar bara bort lagringsdefinition, inte fjärrdata.", "Only run this if you used LVM (step 6b):": "Kör bara detta om du använde LVM (steg 6b):", + "Only the applications that need no question: the ones the cluster keeps a record of": "Endast de applikationer som inte kräver någon fråga: de som klustret har en post för", "Only the host backup hook is removed — PVE vzdump jobs targeting this storage stay intact.": "Endast värdbackuphaken tas bort – PVE vzdump-jobb som riktar sig till denna lagring förblir intakta.", "Only the image reference, with no Compose file": "Endast bildreferensen, utan Compose-fil", "Only the update of the image runs unattended.": "Endast uppdateringen av bilden körs obevakad.", @@ -4485,6 +4613,7 @@ "Open the VM console and wait for the loader to boot": "Öppna VM-konsolen och vänta på att laddaren startar", "Open the dashboard from this host on port 8008 to create a new admin account.": "Öppna instrumentpanelen från denna värd på port 8008 för att skapa ett nytt administratörskonto.", "Open the dashboard to create a new admin account:": "Öppna instrumentpanelen för att skapa ett nytt administratörskonto:", + "Open the page of an application in the menu": "Öppna en applikations sida i menyn", "Open-source AI-powered coding assistant": "Open-source AI-driven kodningsassistent", "Open-source UI for building and debugging multi-agent and RAG applications": "Open-source UI för att bygga och debugga multi-agent- och RAG-applikationer", "Open-source self-hosted SQL IDE.": "Open-source självvärd SQL IDE.", @@ -4803,6 +4932,7 @@ "Press ENTER to continue...": "Tryck på ENTER för att fortsätta...", "Press ENTER to return to the menu...": "Tryck på ENTER för att återgå till menyn...", "Press ENTER to return...": "Tryck på ENTER för att gå tillbaka...", + "Press Enter to close this terminal...": "Tryck på Enter för att stänga den här terminalen...", "Press Enter to close...": "Tryck på Enter för att stänga...", "Press Enter to continue": "Tryck på Enter för att fortsätta", "Press Enter to continue...": "Tryck på Enter för att fortsätta...", @@ -4884,6 +5014,7 @@ "ProxMenux Monitor protection": "ProxMenux Monitor skydd", "ProxMenux Monitor unit repaired and restarted": "ProxMenux Monitor-enhet reparerad och omstartad", "ProxMenux Monitor → Backups tab (live progress card with estimated time, logs, rollback delta)": "ProxMenux Monitor → Fliken Säkerhetskopiering (live-förloppskort med beräknad tid, loggar, rollback-delta)", + "ProxMenux OCI manager Apps (Technology Preview)": "ProxMenux OCI manager Apps (Technology Preview)", "ProxMenux attaches directories, not single files, so this image cannot be installed yet.": "ProxMenux fäster kataloger, inte enstaka filer, så denna bild kan inte installeras ännu.", "ProxMenux can apply open permissions on this NFS directory from the host so the container can read and write:": "ProxMenux kan tillämpa öppna behörigheter på denna NFS-katalog från värden så att behållaren kan läsa och skriva:", "ProxMenux can remount it with open permissions so any LXC can read and write.": "ProxMenux kan montera om den med öppna behörigheter så att alla LXC kan läsa och skriva.", @@ -4903,9 +5034,13 @@ "Proxmology logo applied": "Proxmology-logotyp applicerad", "Proxmox 9 system update allready": "Proxmox 9 systemuppdatering redan", "Proxmox APT repositories configured": "Proxmox APT-förråd konfigurerade", + "Proxmox APT repository inventory is invalid or reports parse errors. Fix sources in {ui}; no repository changed.": "Inventeringen av Proxmox APT-arkiv är ogiltig eller rapporterar tolkningsfel. Åtgärda källorna i {ui}; inget arkiv ändrades.", "Proxmox Backup Server": "Proxmox Backup Server", "Proxmox Backup Server (PBS) destinations": "Destinationer för Proxmox Backup Server (PBS)", "Proxmox Backup Server APT repositories configured": "Proxmox Backup Server APT-förråd konfigurerade", + "Proxmox Backup Server Microcode": "Proxmox Backup Server Microcode", + "Proxmox Backup Server Post Install": "Proxmox Backup Server efterinstallation", + "Proxmox Backup Server Subscription Banner Removal": "Borttagning av prenumerationsbanner för Proxmox Backup Server", "Proxmox Backup Server Update": "Proxmox Backup Server Uppdatering", "Proxmox Backup Server update completed.": "Proxmox Backup Server-uppdatering slutförd.", "Proxmox CIFS Storage Status:": "Proxmox CIFS-lagringsstatus:", @@ -4927,6 +5062,7 @@ "Proxmox iSCSI Storage Status:": "Proxmox iSCSI-lagringsstatus:", "Proxmox jail configured": "Proxmox jail konfigurerad", "Proxmox local storages:": "Proxmox lokala lager:", + "Proxmox no-subscription standard repository handle unavailable; no repository changed.": "Referens till Proxmox standardarkiv utan prenumeration är inte tillgänglig; inget arkiv ändrades.", "Proxmox repository": "Proxmox-arkiv", "Proxmox repository OK (candidate is 9.x)": "Proxmox arkiv OK (kandidat är 9.x)", "Proxmox repository configuration completed": "Konfigurationen av Proxmox-arkivet har slutförts", @@ -4994,6 +5130,7 @@ "Rclone mount needs a privileged LXC with FUSE access. The container is dedicated to Rclone and its web UI must not be exposed to untrusted networks.": "Rclone montering behöver en privilegierad LXC med FUSE tillgång. Behållaren är dedikerad till Rclone och dess webb-UI får inte utsättas för opålitliga nätverk.", "Rclone mount requires a privileged LXC with FUSE access. Use this profile only on a trusted node and network.": "Rclone montering requires en privilegierad LXC med FUSE tillgång. Använd denna profil endast på en betrodd nod och nätverk.", "Rclone mount requires a privileged container": "Rclone montering requires en privilegierad behållare", + "Rclone remote": "Rclone-fjärr", "Re-enter the BORG REPOKEY passphrase to confirm:": "Ange BORG REPOKEY-lösenordsfrasen igen för att bekräfta:", "Re-running pre-check after repairs...": "Kör förkontroll igen efter reparationer...", "Reachable": "Kan nåbar", @@ -5017,6 +5154,7 @@ "Reading SMART self-test log...": "Läser SMART självtestlogg...", "Reading full SMART report...": "Läser hela SMART-rapporten...", "Reading image metadata. Please wait...": "Läser bildmetadata. Vänligen vänta...", + "Ready to create a %s?": "Redo att skapa en %s?", "Real-time Performance Monitoring": "Prestandaövervakning i realtid", "Real-time bandwidth usage (press q to exit)": "Användning av bandbredd i realtid (tryck på q för att avsluta)", "Real-time collaborative document editor": "Realtidssamverkan dokument redaktör", @@ -5099,15 +5237,19 @@ "Recreation prepared": "Rekreation förberedd", "Refresh APT index and verify repositories:": "Uppdatera APT-index och verifiera förråd:", "Refresh the configured APT repositories and review the PBS package upgrade? Repository files will be preserved.": "Uppdatera de konfigurerade APT-paketförråden och granska PBS-paketuppgraderingen? Paketförrådens filer bevaras.", + "Refresh the index from the image sources": "Uppdatera indexet från avbildskällorna", "Refresh token of the connector, from the Twingate admin console": "Uppdateringstoken för kontakten, från Twingate-administratörskonsolen", "Refresh your browser (Ctrl+Shift+R) to see changes": "Uppdatera din webbläsare (Ctrl+Skift+R) för att se ändringar", "Refresh your browser to see changes (server restart may be required)": "Uppdatera din webbläsare för att se ändringar (serverns omstart kan krävas)", "Refreshing apt cache...": "Uppdaterar apt cache...", "Refreshing the NVIDIA runtime...": "Uppfriskande NVIDIA runtime...", "Refusing an unexpected rootfs path:": "Vägrar en oväntad rootfs väg:", + "Regenerate the catalog templates": "Generera om katalogmallarna", + "Regenerate the template of one application": "Generera om mallen för en applikation", "Regenerating PVE package cache...": "Återskapar PVE-paketcache...", "Regenerating boot artifacts for the merged kernel-agnostic changes...": "Regenererar startartefakter för de sammanslagna kärnagnostiska ändringarna...", "Regenerating certificates and restarting services...": "Återskapar certifikat och startar om tjänster...", + "Register again the OCI applications restored from a backup": "Registrera igen de OCI-applikationer som återställts från en säkerhetskopia", "Register mount path in Proxmox:": "Registrera monteringssökväg i Proxmox:", "Registering disk as Proxmox storage...": "Registrerar disk som Proxmox-lagring...", "Registering module with DKMS...": "Registrerar modul med DKMS...", @@ -5294,6 +5436,7 @@ "Resetting time synchronization...": "Återställer tidssynkroniseringen...", "Residual Bookworm entries commented where applicable": "Resterande bokmalsposter kommenterade där tillämpligt", "Resilio-sync (formerly BitTorrent Sync) uses the BitTorrent protocol to sync files and folders between all of your devices. There are both free and paid versions, this container supports both. There is an official sync image but we created this one as it supports user mapping to simplify permissions for volumes.": "Resilio-sync (tidigare BitTorrent Sync) använder BitTorrent-protokollet för att synkronisera filer och mappar mellan alla dina enheter. Det finns både gratis och betalda versioner, denna behållare stöder båda. Det finns en officiell synkroniseringsbild men vi skapade den här eftersom den stöder användarkartläggning för att förenkla behörigheter för volymer.", + "Resolve catalog icons against the jsdelivr icon sets": "Lös katalogikoner mot ikonuppsättningarna på jsdelivr", "Resolve package conflicts": "Lös paketkonflikter", "Resources": "Resurser", "Restart Network": "Starta om nätverket", @@ -5352,6 +5495,7 @@ "Results:": "Resultat:", "Retention": "Retention", "Retention policy (prune-backups syntax).": "Retentionspolicy (syntax för beskärning av säkerhetskopior).", + "Retrieving the URL for the %s loader": "Hämtar URL:en för loadern %s", "RetroArch is a frontend for emulators, game engines and media players. It enables you to run classic games on a wide range of computers and consoles through its slick graphical interface.": "RetroArch är en frontend för emulatorer, spelmotorer och mediaspelare. Det gör att du kan köra klassiska spel på ett brett spektrum av datorer och konsoler genom sitt slicka grafiska gränssnitt.", "Return": "Återvända", "Return to Main Menu": "Återgå till huvudmenyn", @@ -5431,6 +5575,9 @@ "SCSI (recommended for Linux)": "SCSI (rekommenderas för Linux)", "SECURITY CONSIDERATIONS:": "SÄKERHETSÖVERSIKT:", "SECURITY WARNING:": "SÄKERHETSVARNING:", + "SELECT CUSTOM IMAGE": "VÄLJ ANPASSAD AVBILD", + "SELECT LOADER": "VÄLJ LOADER", + "SETTINGS": "INSTÄLLNINGAR", "SMART Action": "SMART-åtgärd", "SMART Disk Health & Test": "SMART-status och disktest", "SMART health status: PASSED": "SMART hälsostatus: Godkänd", @@ -5456,6 +5603,7 @@ "SSH protection (aggressive mode)": "SSH-skydd (aggressivt läge)", "STEP 6: Choose commands based on your storage type": "STEG 6: Välj kommandon baserat på din lagringstyp", "STEP 9: Cleanup (LVM only)": "STEG 9: Rensning (endast LVM)", + "STORAGE PLAN": "LAGRINGSPLAN", "STORAGE TYPE IDENTIFICATION:": "IDENTIFIKATION AV FÖRVARINGSTYP:", "SUGGESTION FOR": "FÖRSLAG PÅ", "SWAG serves HTTPS on port 443. Plain HTTP on port 80 is disabled in /config/nginx/site-confs/default.conf.": "SWAG serverar HTTPS på port 443. Plain HTTP på port 80 är inaktiverad i /config/nginx/site-confs/default.conf.", @@ -5536,6 +5684,7 @@ "Scheduled backup job created": "Schemalagt säkerhetskopieringsjobb skapat", "Scheduled backup jobs": "Schemalagda backupjobb", "Scheduled backups and retention policies": "Schemalagda säkerhetskopieringar och lagringspolicyer", + "Scheduled run: no questions; stops where a person has to decide": "Schemalagd körning: inga frågor; stannar där en person måste besluta", "Scheduled tasks (cron)": "Schemalagda uppgifter (cron)", "Scheduler script not found:": "Schemaläggarens skript hittades inte:", "ScreenScraper": "ScreenScraper", @@ -5545,6 +5694,7 @@ "Script not found:": "Skriptet hittades inte:", "Scripts in": "Skript i", "ScummVM is a program which allows you to run certain classic graphical adventure and role-playing games, provided you already have their data files. The clever part about this: ScummVM just replaces the executables shipped with the games, allowing you to play them on systems for which they were never designed! ScummVM is a complete rewrite of these games' executables and is not an emulator.": "ScummVM är ett program som låter dig köra vissa klassiska grafiska äventyr och rollspel, förutsatt att du redan har sina datafiler. Den smarta delen om detta: ScummVM ersätter just de körbara som levereras med spelen, så att du kan spela dem på system för vilka de aldrig designades! ScummVM är en komplett omskrivning av dessa spel körbara och är inte en emulator.", + "SeaBIOS (Legacy)": "SeaBIOS (Legacy)", "Sealskin is a self-hosted, client-server platform that enables users to run powerful, containerized desktop applications streamed directly to a web browser. It uses a browser extension to intercept user actions—such as clicking a link or downloading a file and redirects them to a secure, isolated application environment running on a remote server.": "Sealskin är en självhäftad, klient-server plattform som gör det möjligt för användare att köra kraftfulla, containeriserade stationära program strömmade direkt till en webbläsare. Den använder en webbläsartillägg för att avlyssna användaråtgärder - till exempel att klicka på en länk eller ladda ner en fil och omdirigerar dem till en säker, isolerad applikationsmiljö som körs på en fjärrserver.", "Search": "Sök", "Search Results for:": "Sökresultat för:", @@ -5730,6 +5880,7 @@ "Selected GPU(s)": "Valda GPU:er", "Selected GPU(s):": "Valda GPU:er:", "Selected LXC action": "Vald LXC-åtgärd", + "Selected Loader:": "Vald loader:", "Selected VM": "Vald VM", "Selected VM action": "Vald VM-åtgärd", "Selected bridge:": "Vald bro:", @@ -5895,6 +6046,7 @@ "Show standard exclude patterns": "Visa standardexkluderingsmönster", "Show status of all storage pools": "Visa status för alla lagringspooler", "Show the QR code of a peer again with: pct exec -- /app/show-peer 1": "Visa QR-koden för en peer igen med: pct exec /app/show-peer 1", + "Show the summary of a template": "Visa sammanfattningen av en mall", "Show traffic statistics per interface": "Visa trafikstatistik per gränssnitt", "Show vzdump backup configuration": "Visa vzdump säkerhetskopia-konfiguration", "Shows status and type (nfs/cifs/dir/iscsi...).": "Visar status och typ (nfs/cifs/dir/iscsi...).", @@ -6001,6 +6153,7 @@ "Start VM": "Starta VM", "Start VM after creation": "Starta VM efter skapandet", "Start VM after creation?": "Starta VM efter skapandet?", + "Start VM when completed:": "Starta VM när det är klart:", "Start a container. Use the correct ": "Starta en container. Använd rätt ", "Start a virtual machine. Use the correct ": "Starta en virtuell maskin. Använd rätt ", "Start each LXC with Proxmox (no coordinated startup)": "Starta varje LXC med Proxmox (ingen samordnad start)", @@ -6030,6 +6183,7 @@ "Starting": "Börja", "Starting Borg backup...": "Startar Borg-säkerhetskopiering...", "Starting CT": "Startar CT", + "Starting ISO conversion...": "Startar ISO-konvertering...", "Starting LXC Privileged to Unprivileged conversion process...": "Startar konverteringsprocessen för LXC Privileged to Unprivileged...", "Starting LXC Unprivileged to Privileged conversion process...": "Startar konverteringsprocessen för LXC Unprivileged to Privileged...", "Starting NVIDIA installer. This may take several minutes...": "Startar NVIDIA-installationsprogrammet. Detta kan ta flera minuter...", @@ -6137,6 +6291,7 @@ "Subscription banner removal failed": "Borttagning av prenumerationsbanner misslyckades", "Subscription banner removed successfully": "Prenumerationsbannern har tagits bort", "Subscription banner restored successfully (desktop and mobile)": "Prenumerationsbannern har återställts (dator och mobil)", + "Subscription status is not unambiguously active, notfound or expired. Check proxmox-backup-manager subscription get locally; no repository changed.": "Prenumerationsstatusen är inte entydigt active, notfound eller expired. Kontrollera proxmox-backup-manager subscription get lokalt; inget arkiv ändrades.", "Success": "Framgång", "Successful": "Framgångsrik", "Supervisor does not confirm healthy and supported yet": "Handledaren bekräftar inte hälsosam och stödd ännu", @@ -6164,6 +6319,7 @@ "Synchronize time automatically": "Synkronisera tiden automatiskt", "Synclounge is a third party tool that allows you to watch Plex in sync with your friends/family, wherever you are.": "Synclounge är ett tredjepartsverktyg som låter dig titta på Plex i synkronisera med dina vänner/familj, var du än är.", "Syncthing replaces proprietary sync and cloud services with something open, trustworthy and decentralized. Your data is your data alone and you deserve to choose where it is stored, if it is shared with some third party and how it's transmitted over the Internet.": "Syncthing ersätter egen synkronisering och molntjänster med något öppet, pålitligt och decentraliserat. Dina uppgifter är dina uppgifter ensam och du förtjänar att välja var de lagras, om de delas med någon tredje part och hur de överförs via Internet.", + "Synology VM Creator": "Synology VM-skapare", "Sysctl not namespaced or not valid:": "Sysctl inte namnspaced eller inte giltig:", "System": "System", "System CLI Tools": "System CLI-verktyg", @@ -6185,6 +6341,7 @@ "System path mounts are not yet supported": "Systemvägfästen stöds ännu inte", "System reboot required": "Systemet måste startas om", "System upgrade completed": "Systemuppgraderingen slutförd", + "System upgrade failed. Check log:": "Systemuppgraderingen misslyckades. Kontrollera loggen:", "System uptime": "Systemuppetid", "Systemd ulimits set": "Systemd-ulimits har ställts in", "TCP BBR configuration created successfully": "TCP BBR-konfigurationen har skapats", @@ -6249,10 +6406,13 @@ "The Bookmark Everything App": "Bokmärket allt App", "The Brave browser is a fast, private and secure web browser for PC, Mac and mobile.": "Brave-webbläsaren är en snabb, privat och säker webbläsare för PC, Mac och mobil.", "The CT already exists:": "CT finns redan:", + "The Compose document must be a mapping.": "Compose-dokumentet måste vara en mappning.", "The Compose file declares no service": "Compose-filen förklarar ingen tjänst", "The Compose file describes several images:": "Compose-filen beskriver flera bilder:", "The Compose file describes several services:": "Compose-filen beskriver flera tjänster:", "The Compose file does not contain a Compose document": "Compose-filen innehåller inte ett komponeringsdokument", + "The Compose file has no services.": "Compose-filen har inga tjänster.", + "The Compose file has no x-casaos metadata.": "Compose-filen saknar x-casaos-metadata.", "The Compose file is not valid YAML:": "Compose-filen är inte giltig 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.": "Komponera erbjuder en valfri AppArmor eller seccomp avslappning; det kommer att vara inaktiverat om inte användaren väljer det. Fortsätt bara om du litar på bilden och accepterar denna risk.", "The Compose value must be text or a list:": "Komponeringsvärdet måste vara text eller en lista:", @@ -6302,9 +6462,11 @@ "The PostgreSQL volume needs at least 4 GB": "PostgreSQL-volymen behöver minst 4 GB", "The PostgreSQL volume needs at least 8 GB": "PostgreSQL-volymen behöver minst 8 GB", "The ProxMenux Monitor update checker is not available. Start or update ProxMenux Monitor and try again.": "Uppdateringskontrollen i ProxMenux Monitor är inte tillgänglig. Starta eller uppdatera ProxMenux Monitor och försök igen.", + "The ProxMenux application catalogue is not a list": "ProxMenux applikationskatalog är inte en lista", "The Proxmox VE 8 update did not finish. The upgrade to Proxmox VE 9 was not started.": "Uppdateringen av Proxmox VE 8 slutfördes inte. Uppgraderingen till Proxmox VE 9 startades inte.", "The Proxmox archive keyring is missing; Ceph installation cannot continue safely": "Proxmox arkivnyckelringen saknas;Ceph-installationen kan inte fortsätta på ett säkert sätt", "The Proxmox inventory and the local configurations differ": "Proxmox-inventeringen och de lokala konfigurationerna skiljer sig åt", + "The README has no recognisable docker-compose section": "README saknar ett igenkännbart docker-compose-avsnitt", "The ROCm image has no support for the AMD GPU of this host:": "ROCm-avbilden har inget stöd för AMD GPU på denna värd:", "The ROCm image of this application has no support for the AMD GPU of this host:": "ROCm-avbilden för denna applikation har inget stöd för AMD GPU på denna värd:", "The Rclone configuration needs at least 1 GB": "Rclone-konfigurationen behöver minst 1 GB", @@ -6341,6 +6503,8 @@ "The administrator email is not valid": "Administratörens e-post är inte giltigt", "The administrator user contains characters that are not allowed": "Administratörsanvändaren innehåller tecken som inte är tillåtna", "The all-in-one AI application.": "All-in-one AI-applikationen.", + "The application '{app_id}' does not come from LinuxServer": "Applikationen '{app_id}' kommer inte från LinuxServer", + "The application '{app_id}' is not in the index": "Applikationen '{app_id}' finns inte i indexet", "The application configuration needs a first start to complete.": "Applikationskonfigurationen behöver en första start för att slutföra.", "The application could not be modified:": "Applikationen kunde inte ändras:", "The application could not be recovered:": "Applikationen kunde inte återställas:", @@ -6370,6 +6534,7 @@ "The backup was taken on a different PVE or kernel major.minor. These paths will be SKIPPED to keep the boot safe:": "Säkerhetskopieringen togs på en annan PVE eller kernel major.minor. Dessa sökvägar HOPPAS över för att hålla uppstarten säker:", "The bind mount target escapes the rootfs:": "Det bindande monteringsmålet flyr rötterna:", "The block device does not exist:": "Blockenheten finns inte:", + "The block found does not look like a Docker Compose file": "Blocket som hittades ser inte ut som en Docker Compose-fil", "The build could not be checked beforehand; continuing without that check.": "Bygget kunde inte kontrolleras i förväg;fortsätter utan den kontrollen.", "The cached image does not match the current digest": "Den cachade bilden matchar inte den nuvarande smältningen", "The cached image is damaged; it will be downloaded again.": "Den cachade bilden är skadad; den kommer att laddas ner igen.", @@ -6454,6 +6619,8 @@ "The disk size cannot be reproduced": "Skivstorleken kan inte reproduceras", "The disk usage of the container could not be read": "Diskens användning av behållaren kunde inte läsas", "The disks of the failed attempt could not be removed and stay in the temporary container:": "Diskarna för det misslyckade försöket kunde inte tas bort och ligger kvar i den tillfälliga behållaren:", + "The docker-compose block is not closed": "docker-compose-blocket är inte stängt", + "The docker-compose section contains no code block": "docker-compose-avsnittet innehåller inget kodblock", "The domain must resolve to the public address of this network before the certificate can be issued.": "Domänen måste lösa den offentliga adressen till detta nätverk innan certifikatet kan utfärdas.", "The download client still needs to be configured.": "Nedladdningskunden behöver fortfarande konfigureras.", "The download stopped progressing; cancelling this attempt.": "Nedladdningen slutade utvecklas; avbryta detta försök.", @@ -6487,6 +6654,7 @@ "The fstab entry will still be removed; reboot or manual umount needed.": "fstab-posten kommer fortfarande att tas bort; omstart eller manuell avmontering behövs.", "The gateway must be another usable address in the same subnet.": "Porten måste vara en annan användbar adress i samma undernät.", "The gateway should appear in your Tailscale admin console shortly.": "Gatewayen bör snart visas i din Tailscale-administratörskonsol.", + "The generated template does not match the schema:": "Den genererade mallen matchar inte schemat:", "The guest access test did not succeed.": "Gäståtkomsttestet lyckades inte.", "The healthcheck cannot run without an IP address": "Hälsokontrollen kan inte köras utan en IP-adress", "The host NVIDIA driver is not responding correctly": "Värd NVIDIA-föraren svarar inte korrekt", @@ -6564,6 +6732,8 @@ "The long test runs directly on the disk hardware.": "Det långa testet körs direkt på hårdvaran på hårddisken.", "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.": "Maskininlärningsbehållaren byggs om med avbilden för det nya valet. Dess modellcache, biblioteket och databasen bevaras. Hela applikationen stoppas och uppdateras, som i en uppdatering. Om operationen misslyckas efter att en behållare har ändrats, återställs de tidigare behållarna och det tidigare valet. En operation som stannar halvvägs återställs från OCI-hanteringsmenyn.", "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.": "Maskininlärningsbehållaren byggs om med avbilden för det nya valet. Dess modellcache, biblioteket och databasen bevaras. Hela applikationen stoppas och uppdateras, som vid en uppdatering; om något misslyckas återställs de tidigare behållarna och det tidigare valet.", + "The main Compose service cannot be identified unambiguously": "Den huvudsakliga Compose-tjänsten kan inte identifieras entydigt", + "The main Compose service has no image.": "Den huvudsakliga Compose-tjänsten har ingen avbild.", "The main container of this application is not on this host. Restore it too.": "Huvudbehållaren för denna applikation finns inte på denna värd. Återställ den också.", "The main member must stop first and start last": "Huvudmedlemmen måste stanna först och börja senast", "The main member of the stack is missing": "Huvudmedlemmen i stacken saknas", @@ -6877,6 +7047,7 @@ "This guarantees that device nodes are available before applying LXC GPU config.": "Detta garanterar att enhetsnoder är tillgängliga innan du använder LXC GPU-konfiguration.", "This host architecture is not supported by the OCI image importer.": "Denna värdarkitektur stöds inte av OCI-bildimportören.", "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.": "Den här värden har ingen aktiv prenumeration, byta till arkivet utan prenumeration? Den otillgängliga Enterprise PVE-källan inaktiveras. Enterprise Ceph-källor, om sådana finns, inaktiveras utan att en ersättande Ceph-kanal väljs; konfigurera Ceph separat om det behövs.", + "This host runs {name} on {suite}, but these {name} repositories are for another suite: {details}. Disable or remove them in {ui} and run the update again; no repository changed.": "Den här värden kör {name} på {suite}, men dessa {name}-arkiv är för en annan svit: {details}. Inaktivera eller ta bort dem i {ui} och kör uppdateringen igen; inget arkiv ändrades.", "This image cannot be installed as it is described:": "Denna bild kan inte installeras eftersom den beskrivs:", "This image has no compatible Linux image for this host ({architecture}).": "Den här bilden har ingen kompatibel Linux-bild för denna värd ({architecture}).", "This image requires the host module": "Denna bild requires värdmodulen", @@ -6947,6 +7118,7 @@ "This will add the mount to /etc/fstab so it persists after reboot.": "Detta kommer att lägga till monteringen till /etc/fstab så att den kvarstår efter omstart.", "This will completely remove Fail2Ban and its configuration. Continue?": "Detta tar bort Fail2Ban och dess konfiguration helt. Fortsätta?", "This will completely remove Lynis from the system. Continue?": "Detta tar bort Lynis helt från systemet. Fortsätta?", + "This will create a New %s. Proceed?": "Detta skapar en ny %s. Fortsätta?", "This will create a new VM": "Detta kommer att skapa en ny virtuell dator", "This will deploy a Tailscale VPN gateway for secure remote access.": "Detta kommer att distribuera en Tailscale VPN-gateway för säker fjärråtkomst.", "This will install and configure Fail2Ban with:": "Detta kommer att installera och konfigurera Fail2Ban med:", @@ -7053,6 +7225,8 @@ "Umbrel OS installer script by Helper Scripts\n\nVisit the GitHub repo to learn more, contribute, or support the project:\n\nhttps://community-scripts.github.io/ProxmoxVE/scripts?id=umbrel-os-vm": "Umbrel OS installationsskript av Helper Scripts\n\nBesök GitHub-repo för att lära dig mer, bidra eller stödja projektet:\n\nhttps://community-scripts.github.io/ProxmoxVE/scripts?id=umbrel-os-vm", "Unable to detect Proxmox version": "Det gick inte att upptäcka Proxmox-versionen", "Unable to detect Proxmox version.": "Det gick inte att upptäcka Proxmox-versionen.", + "Unable to detect a valid storage location for EFI disk.": "Kan inte hitta en giltig lagringsplats för EFI-disken.", + "Unable to detect a valid storage location.": "Kan inte hitta en giltig lagringsplats.", "Unable to determine the installed memory.": "Det går inte att fastställa det installerade minnet.", "Unable to identify the root filesystem. Aborting.": "Det går inte att identifiera rotfilsystemet. Avbryter.", "Unable to resolve system ZFS pool disks. Aborting.": "Det går inte att lösa system ZFS pooldiskar. Avbryter.", @@ -7156,6 +7330,7 @@ "Unsupported OCI digest:": "Osupporterad OCI smält:", "Unsupported OCI-LXC AppArmor profile:": "Ostödd OCI-LXC AppArmor-profil:", "Unsupported OCI-LXC seccomp profile:": "Unsupported OCI-LXC seccomp profil:", + "Unsupported Proxmox suite; no repository changed.": "Proxmox-sviten stöds inte; inget arkiv ändrades.", "Unsupported Terminal": "Terminal som inte stöds", "Unsupported architecture for Figurine:": "Arkitekturen stöds inte av Figurine:", "Unsupported architecture:": "Ostödd arkitektur:", @@ -7167,6 +7342,7 @@ "Unsupported device type:": "Ostödd enhetstyp:", "Unsupported dynamic NVIDIA capabilities:": "Ostödd dynamisk NVIDIA-kapacitet:", "Unsupported format. Only .ova and .ovf files are supported.": "Format som inte stöds. Endast .ova- och .ovf-filer stöds.", + "Unsupported host architecture:": "Värdarkitekturen stöds inte:", "Unsupported kept setting:": "Bevarad inställning stöds inte:", "Unsupported media storage mode:": "Medialagringsläge som inte stöds:", "Unsupported mount options": "Monteringsalternativ som inte stöds", @@ -7214,6 +7390,8 @@ "Update completed. Press Enter to continue...": "Uppdatering slutförd. Tryck på Enter för att fortsätta...", "Update credentials": "Uppdatera användaruppgifter", "Update every container of the application": "Uppdatera varje behållare av programmet", + "Update for %s completed.": "Uppdateringen av %s slutfördes.", + "Update for %s exited with status %s.": "Uppdateringen av %s avslutades med status %s.", "Update kernel to compatible version": "Uppdatera kärnan till kompatibel version", "Update now?": "Uppdatera nu?", "Update package index:": "Uppdatera paketindex:", @@ -7222,6 +7400,7 @@ "Update system to latest PVE 8.4+ (if not done already):": "Uppdatera systemet till senaste PVE 8.4+ (om det inte redan är gjort):", "Update the image with the saved configuration": "Uppdatera bilden med sparad konfiguration", "Update the whole stack?": "Uppdatera hela stacken?", + "Update, modify or recreate one installed OCI instance": "Uppdatera, ändra eller återskapa en installerad OCI-instans", "Updated": "Uppdaterad", "Updated sharedfiles group to GID: 101000": "Uppdaterad sharedfiles-grupp till GID: 101000", "Updated stack checked": "Uppdaterad stack kontrollerad", @@ -7233,6 +7412,7 @@ "Updates available": "Uppdateringar tillgängliga", "Updates file is empty or unreadable.": "Uppdateringsfilen är tom eller oläsbar.", "Updating": "Uppdatering", + "Updating %s (running %s from %s flow)...": "Uppdaterar %s (kör %s från flödet %s)...", "Updating APT package lists...": "Uppdaterar APT-paketlistor...", "Updating Debian Bookworm → Trixie in sources.list...": "Uppdaterar Debian Bookworm → Trixie i sources.list...", "Updating Figurine binary...": "Uppdaterar binär figur...", @@ -7333,7 +7513,20 @@ "Username on the Borg server that runs \"borg serve\" (typically \"borg\"). This is NOT the admin/root user of the server — that one is asked later only if you choose \"Generate a new key and authorize it\".": "Användarnamn på Borg-servern som kör \"borg serve\" (typiskt \"borg\"). Detta är INTE administratören/rootanvändaren av servern — den frågas senare endast om du väljer \"Generera en ny nyckel och auktorisera den\".", "Username:": "Användarnamn:", "Users:": "Användare:", + "Using Advanced Settings": "Använder avancerade inställningar", + "Using BIOS Type:": "Använder BIOS-typ:", + "Using Bridge:": "Använder brygga:", + "Using CPU Model:": "Använder CPU-modell:", + "Using Custom Image:": "Använder anpassad avbild:", + "Using Default Settings": "Använder standardinställningar", + "Using Hostname:": "Använder värdnamn:", + "Using Interface MTU Size:": "Använder MTU-storlek för gränssnittet:", + "Using MAC Address:": "Använder MAC-adress:", + "Using Machine Type:": "Använder maskintyp:", "Using UUID is recommended over /dev/sdX.": "Användning av UUID rekommenderas över /dev/sdX.", + "Using VLAN:": "Använder VLAN:", + "Using Virtual Machine ID:": "Använder ID för virtuell maskin:", + "Using Vlan:": "Använder VLAN:", "Using advanced configuration": "Använder avancerad konfiguration", "Using default Proxmox logo...": "Använder standard Proxmox-logotyp...", "Using existing encryption key:": "Använda befintlig krypteringsnyckel:", @@ -7357,6 +7550,8 @@ "VFIO orphans cleared and initramfs rebuilt — next boot will free the GPU.": "VFIO föräldralösa enheter rensades och initramfs återuppbyggda — nästa uppstart kommer att frigöra GPU:n.", "VFIO orphans cleared but initramfs rebuild failed; check /var/log/proxmenux logs.": "VFIO föräldralösa enheter rensades men återuppbyggnaden av initramfs misslyckades; kontrollera /var/log/proxmenux loggar.", "VFS cache mode": "VFS-cacheläge", + "VIRTUAL DISK": "VIRTUELL DISK", + "VIRTUAL MACHINE ID": "ID FÖR VIRTUELL MASKIN", "VLAN": "VLAN", "VLC Media Player is a free and open source cross-platform multimedia player and framework that delivers dependable performance across multiple devices.": "VLC media Spelare är en fri och öppen källkod multimediaspelare och ram som levererar pålitlig prestanda över flera enheter.", "VM": "VM", @@ -7368,6 +7563,7 @@ "VM Storage (images, backup)": "VM-lagring (bilder, säkerhetskopia)", "VM and CT Management Commands": "VM- och CT-hanteringskommandon", "VM and CT backup jobs (Datacenter > Backup)": "VM och CT säkerhetskopieringsjobb (Datacenter > Säkerhetskopiering)", + "VM created with errors. Check configuration.": "VM skapad med fel. Kontrollera konfigurationen.", "VM creation cancelled before disk planning.": "VM-skapandet avbröts innan diskplaneringen.", "VM creation cancelled by user.": "VM-skapandet avbröts av användaren.", "VM creation completed": "VM-skapandet slutfört", @@ -7461,6 +7657,7 @@ "Virtual Function": "Virtuell funktion", "Virtual Function (parent PF:": "Virtuell funktion (förälder PF:", "Virtual Machine ID": "ID för virtuell maskin", + "Virtual Machine ID:": "ID för virtuell maskin:", "Virtual disk": "Virtuell disk", "Virtual disks": "Virtuella diskar", "Virtual display already set to": "Virtuell visning redan inställd på", @@ -7477,6 +7674,7 @@ "Volume configuration cancelled": "Volymkonfiguration inställd", "Volume options are not yet supported": "Volymalternativ stöds ännu inte", "Volume size in GB": "Volymstorlek i GB", + "Volumes": "Volymer", "Volumes attached": "Volymer fästa", "Volumes prepared for the first start:": "Volymer förberedda för första början:", "Volumes shared between services are not yet supported": "Volymer som delas mellan tjänster stöds ännu inte", @@ -7677,6 +7875,7 @@ "ZRAM profile removed, but package purge failed": "ZRAM-profilen togs bort, men paketrensningen misslyckades", "ZRAM still holds pages; configuration was preserved": "ZRAM håller fortfarande sidor; konfigurationen bevarades", "ZRAM still holds pages; profile remains active": "ZRAM håller fortfarande sidor; profilen förblir aktiv", + "ZRAM swap profile": "ZRAM-swapprofil", "ZRAM swap profile enabled": "ZRAM swap-profil aktiverad", "ZRAM swap profile removed": "ZRAM-bytesprofilen har tagits bort", "ZSTD - fast, good ratio (recommended)": "ZSTD - snabbt, bra förhållande (rekommenderas)", @@ -7743,6 +7942,7 @@ "chmod 1777 + setfacl o::rwx (applied on the NFS share from this host)": "chmod 1777 + setfacl o::rwx (tillämpas på NFS-andelen från denna värd)", "chmod failed — NFS server may be restricting changes from root": "chmod misslyckades — NFS-servern kan begränsa ändringar från root", "chown/chmod failed — likely unprivileged CT against host bind mount. Falling back to ACL.": "chown/chmod misslyckades — sannolikt oprivilegierad CT mot värdbindningsmontering. Faller tillbaka till ACL.", + "clone source mount tree": "klona källans monteringsträd", "containers": "behållare", "containers of": "behållare av", "content:": "innehåll:", @@ -7782,6 +7982,7 @@ "driver:": "drivrutin:", "e.g.": "t.ex.", "empty = generate": "Tom = generera", + "enter container namespace": "gå in i behållarens namnrymd", "exFAT (portable: Windows/Linux/macOS)": "exFAT (bärbar: Windows/Linux/macOS)", "exFAT tools installed successfully.": "exFAT-verktyg installerade framgångsrikt.", "experimental on this GPU": "experimentell på denna GPU", @@ -7814,10 +8015,12 @@ "fstab entry exists": "fstab-posten finns", "fstab line:": "fstab rad:", "fstab references UUIDs/devices not present on this host:": "fstab refererar till UUID/enheter som inte finns på denna värd:", + "function '%s' is not defined in the %s flow.": "funktionen '%s' är inte definierad i flödet %s.", "gasket DKMS entries removed.": "gasket DKMS-poster har tagits bort.", "gasket-dkms has been fully removed from this system.": "gasket-dkms har tagits bort helt från detta system.", "gasket-dkms is still reported by dpkg in state:": "gasket-dkms rapporteras fortfarande av dpkg i tillstånd:", "gawk installed": "gawk installerad", + "genisoimage/mkisofs not found.": "genisoimage/mkisofs hittades inte.", "go2rtc WebUI": "go2rtc WebUI", "google/gasket-driver cloned (fallback — will apply local patches).": "google/gasket-driver cloned (reserv — kommer att tillämpa lokala patchar).", "gpg not found; trying apt-key fallback": "gpg hittades inte; försöker apt-key fallback", @@ -7861,6 +8064,7 @@ "individual template is blocked": "Enskild mall är blockerad", "initramfs updated": "initramfs uppdaterad", "initramfs updated.": "initramfs uppdaterad.", + "installable": "installerbar", "installed": "installerad", "installed but command not immediately available": "installerat men kommandot är inte tillgängligt omedelbart", "installed correctly and available": "installerad korrekt och tillgänglig", @@ -7877,6 +8081,7 @@ "intel_iommu/amd_iommu is set in cmdline but no IOMMU groups exist — IOMMU appears disabled in BIOS. Enable VT-d / AMD-Vi in firmware before continuing.": "intel_iommu/amd_iommu är inställd i cmdline men inga IOMMU-grupper finns — IOMMU verkar inaktiverad i BIOS. Aktivera VT-d / AMD-Vi i firmware innan du fortsätter.", "interfaces": "gränssnitt", "into an LXC.": "till en LXC.", + "invalid source '%s' (must be 'auto', 'custom', or 'detected')": "ogiltig källa '%s' (måste vara 'auto', 'custom' eller 'detected')", "iperf3 - Bandwidth test": "iperf3 - Bandbreddstest", "iperf3 - Bandwidth test (Client mode)": "iperf3 - Bandbreddstest (klientläge)", "iperf3 - Bandwidth test (Server mode)": "iperf3 - Bandbreddstest (serverläge)", @@ -7903,9 +8108,12 @@ "is one of the": "är en av", "is referenced in the following stopped VM(s)/CT(s):": "refereras till i följande stoppade VM(ar)/CT(er):", "it asks for the network of the host; the container gets its own address instead": "ber om nätverket av värden; behållaren får sin egen adress istället", + "it asks for two different memory limits": "den begär två olika minnesgränser", "it could not be started:": "det gick inte att starta:", + "it describes more than one image": "den beskriver mer än en avbild", "it is locked or its disk could not be mounted": "den är låst eller så gick det inte att montera dess disk", "it publishes no other architecture": "publicerar ingen annan arkitektur", + "it uses Compose configs, which have no equivalent here": "den använder Compose configs, som saknar motsvarighet här", "it uses an NVIDIA GPU and this host has no working NVIDIA driver and Container Toolkit. Install them and run the recovery again.": "den använder en NVIDIA GPU och denna värd har ingen fungerande NVIDIA-drivrutin och Container Toolkit. Installera dem och kör återställningen igen.", "it uses the Compose option": "Den använder alternativet Compose", "its NVIDIA runtime could not be rebuilt for the driver of this host; the container will not start until it is installed again:": "dess NVIDIA-körtid kunde inte byggas om för drivrutinen för denna värd; behållaren startar inte förrän den är installerad igen:", @@ -7913,10 +8121,13 @@ "its Rclone mount is published by a host script that a backup does not include. Enable the mount again from the Rclone entry of the catalog before starting it.": "dess Rclone-montering publiceras av ett värdskript som en säkerhetskopia inte inkluderar. Aktivera monteringen igen från Rclone-posten i katalogen innan du startar den.", "its backup was made before ProxMenux kept the record inside the container": "dess säkerhetskopia gjordes innan ProxMenux höll posten i behållaren", "its configuration could not be read": "dess konfiguration kunde inte läsas", + "its health check is not written in a way that can be read": "dess hälsokontroll är inte skriven på ett läsbart sätt", "its hookscript does not exist on this host:": "dess hookscript finns inte på denna värd:", "its host firewall rule was not added:": "dess värdbrandväggsregel lades inte till:", "its include exists with other content:": "dess include finns med annat innehåll:", "its record is missing and it was not found among the restored containers": "dess post saknas och den hittades inte bland de återställda behållarna", + "its shared memory size is not written in a way that can be read": "storleken på dess delade minne är inte skriven på ett läsbart sätt", + "its stop timeout is not written in a way that can be read": "dess tidsgräns för stopp är inte skriven på ett läsbart sätt", "journald MaxLevelStore is adequate for auth logging": "journald MaxLevelStore är tillräcklig för autentiseringsloggning", "journald drop-in created: /etc/systemd/journald.conf.d/proxmenux-loglevel.conf": "journald drop-in skapad: /etc/systemd/journald.conf.d/proxmenux-loglevel.conf", "journald log level restored": "loggad loggnivå återställd", @@ -7932,6 +8143,7 @@ "keep-weekly (0 disables)": "keep-weekly (0 inaktiverar)", "keep-yearly (0 disables)": "hålla årligen (0 inaktiverar)", "keeping current settings": "behålla nuvarande inställningar", + "kernel": "kärna", "kexec configured successfully. Use the command: reboot-quick": "kexec konfigurerades framgångsrikt. Använd kommandot: reboot-quick", "kexec-pve service enabled": "kexec-pve-tjänsten aktiverad", "kexec-pve service file created": "kexec-pve tjänstefil skapad", @@ -7944,12 +8156,15 @@ "layers": "Lager", "legacy .link file(s) to the ProxMenux-managed format": "äldre .link-fil(er) till det ProxMenux-hanterade formatet", "log2ram completely removed from system": "log2ram helt borttagen från systemet", + "main container of the application": "applikationens huvudbehållare", + "make cloned mount tree read-only": "gör det klonade monteringsträdet skrivskyddat", "manually inside the container before starting it.": "manuellt inuti behållaren innan du startar den.", "manually inside the container.": "manuellt inuti behållaren.", "maximum performance": "maximal prestanda", "may be closed — trying discovery anyway...": "kan vara stängd — försöker hitta ändå...", "melonDS aims at providing fast and accurate Nintendo DS emulation.": "melonDS syftar till att ge snabb och accurate Nintendo DS emulering.", "members:": "medlemmar:", + "memory": "minne", "minimum": "minimum minimum", "missing": "saknad", "mkfs.btrfs not found. Install btrfs-progs and retry.": "mkfs.btrfs hittades inte. Installera btrfs-progs och försök igen.", @@ -7964,6 +8179,7 @@ "needs a relaxed AppArmor or seccomp profile": "behöver en avslappnad AppArmor eller seccomp-profil", "needs stack review": "behov stack review", "needs these external services, already running:": "behöver dessa externa tjänster, som redan körs:", + "network": "nätverk", "never": "aldrig", "next free": "Nästa gratis", "next free block": "Nästa fria block", @@ -7974,11 +8190,14 @@ "no declarative value": "Inget deklarativt värde", "no passphrase": "ingen lösenfras", "no password": "inget lösenord", + "no-subscription repository": "arkiv utan prenumeration", "no_root_squash": "no_root_squash", "non-ProxMenux .tar archive(s) in this path": "icke-ProxMenux .tar-arkiv(er) i den här sökvägen", + "none": "ingen", "not available yet": "Inte tillgänglig ännu", "not changed": "inte ändrat", "not found.": "hittades inte.", + "not generated": "inte genererad", "not installed": "inte installerat", "not reliable on this hardware due to the following limitations": "inte tillförlitlig på denna hårdvara på grund av följande begränsningar", "nouveau driver has been blacklisted.": "nouveau drivrutin har blivit svartlistad.", @@ -8018,6 +8237,7 @@ "pct exec authorization failed": "pct exec auktorisering misslyckades", "pct push failed. Check log:": "pct push misslyckades. Kontrollera logg:", "pending (reboot required to enumerate full group)": "väntar (omstart krävs för att räkna upp hela gruppen)", + "pending adaptation": "väntar på anpassning", "phpMyAdmin is installed with arbitrary server connections enabled: the login page has a Server field where the address of the MySQL or MariaDB server is entered, together with its user and password.": "phpMyAdmin installeras med godtyckliga serveranslutningar aktiverade: inloggningssidan har ett serverfält där adressen till MySQL eller MariaDB-servern är inmatad, tillsammans med dess användare och lösenord.", "pigz configuration completed": "pigz-konfigurationen är klar", "pigz enabled in vzdump configuration": "pigz aktiverad i vzdump-konfiguration", @@ -8027,10 +8247,13 @@ "playit.gg has to claim this agent before it forwards anything. The agent prints a one-time claim link on the container console and keeps it there until the link is opened.": "playit.gg måste hävda denna agent innan den vidarebefordrar någonting. Agenten skriver ut en engångsregellänk på containerkonsolen och håller den där tills länken öppnas.", "port": "hamn", "portmapper/rpcbind has been disabled": "portmapper/rpcbind har inaktiverats", + "print the estimated unpacked size in MiB (0 when unknown)": "skriv ut den uppskattade uppackade storleken i MiB (0 om okänd)", "private network assigned automatically": "privat nätverk som tilldelats automatiskt", "privileged LXC": "privilegierad LXC", + "provide either SOURCE_TYPE+FUNCTION_NAME (single mode) or FUNCTIONS_BATCH (batch mode).": "ange antingen SOURCE_TYPE+FUNCTION_NAME (enkelt läge) eller FUNCTIONS_BATCH (batchläge).", "proxmox-backup-client reported:": "proxmox-säkerhetskopia-client rapporterade:", "proxmox-boot-tool refreshed": "proxmox-boot-tool uppdaterad", + "publish mount tree": "publicera monteringsträdet", "pve-enterprise.list update skipped (no change)": "pve-enterprise.list-uppdateringen hoppade över (ingen förändring)", "pve-enterprise.list updated to Trixie": "pve-enterprise.list uppdaterad till Trixie", "pvecm command not found (might not be in a cluster)": "pvecm-kommandot hittades inte (kanske inte finns i ett kluster)", @@ -8043,6 +8266,7 @@ "pvesm status failed": "pvesm status misslyckades", "pyLoad is a Free and Open Source download manager written in Python and designed to be extremely lightweight, easily extensible and fully manageable via web.": "pyLoad är en gratis och öppen källkod nedladdningshanterare skriven i Python och utformad för att vara extremt lätt, lättföränderlig och fullt hanterbar via webben.", "pyLoad web interface": "PyLoad webbgränssnitt", + "python3-jsonschema is required to generate templates": "python3-jsonschema krävs för att generera mallar", "qBittorrent WebUI password (user: admin)": "qBittorrent WebUI lösenord (användare: admin)", "qBittorrent already has a configuration; it is not overwritten": "qBittorrent har redan en konfiguration; den är inte överskriven", "qBittorrent configured": "qBittorrent konfigurerad", @@ -8064,12 +8288,14 @@ "removed from Proxmox": "borttagen från Proxmox", "removed in Proxmox": "borttagen i Proxmox", "removed successfully from Proxmox.": "har tagits bort från Proxmox.", + "removed unused image archive: {path} ({size} bytes)": "tog bort oanvänt avbildsarkiv: {path} ({size} byte)", "requires running the official installer, which restarts the Monitor service.": "kräver att det officiella installationsprogrammet körs, vilket startar om Monitor-tjänsten.", "requires the package": "kräver paketet", "restarted successfully": "startade om", "restoring /etc/network would lose connectivity": "Att återställa /etc/network skulle förlora anslutningen", "restoring on:": "återställer på:", "retries": "försök igen", + "return to host namespace": "återgå till värdens namnrymd", "reverse proxy": "omvänd proxy", "root and real users only": "endast root och riktiga användare", "rpcbind could not be disabled completely": "rpcbind kunde inte inaktiveras helt", @@ -8114,6 +8340,7 @@ "storage yet.": "lagring ännu.", "storage(s) from backup exist on target": "lagring(ar) från säkerhetskopia finns på målet", "storage.": "lagring.", + "subscription banner": "prenumerationsbanner", "successfully formatted with": "framgångsrikt formaterad med", "suggested:": "föreslog:", "switch_gpu_mode.sh was not found.": "switch_gpu_mode.sh hittades inte.", @@ -8122,18 +8349,22 @@ "systemctl restart networking failed:": "systemctl restart networking misslyckades:", "systemd OnCalendar expression": "systemd OnCalendar-uttryck", "the API key was not generated on the first start": "API-nyckeln genererades inte i första början", + "the GPU did not answer in time": "GPU:n svarade inte i tid", "the NVIDIA hook of the container is not available:": "NVIDIA-hooken för behållaren är inte tillgänglig:", "the bridge does not exist on this host:": "bryggan finns inte på denna värd:", "the bridge exists on this host with another network:": "bryggan finns på denna värd med ett annat nätverk:", "the container has its own address, so the port Docker published on the host is not needed": "behållaren har sin egen adress, så porten Docker som publiceras på värden behövs inte", "the containers do not agree on the private network of": "behållarna är inte överens om det privata nätverket för", "the device does not exist on this host:": "enheten finns inte på denna värd:", + "the devices it asks for are not written in a way that can be read": "de enheter den begär är inte skrivna på ett läsbart sätt", "the host directory does not exist:": "värdkatalogen finns inte:", "the host firewall rule of the installation is not added again; allow its port in the firewall of this host if you use it.": "värdbrandväggsregeln för installationen läggs inte till igen; tillåt dess port i den här värdens brandvägg om du använder den.", + "the memory limit it asks for cannot be applied": "den minnesgräns den begär kan inte tillämpas", "the minimum number of characters is": "det minsta antalet tecken är", "the qBittorrent schema is not available": "qBittorrent schemat är inte tillgängligt", "the record it carries does not belong to this container": "posten den bär tillhör inte denna behållare", "the record of the application does not list this container": "programmets post visar inte den här behållaren", + "the resource limits it asks for cannot be applied": "de resursgränser den begär kan inte tillämpas", "the settings of its include are not in the record:": "inställningarna för dess include finns inte i posten:", "the start order of its dependencies is not in the record": "startordningen för dess beroenden finns inte i posten", "this configuration needs the device": "Denna konfiguration behöver enheten", @@ -8158,6 +8389,7 @@ "unsupported dependency condition": "ostödda beroendeförhållanden", "unsupported external credential or boolean": "ostödd extern credential eller boolean", "unsupported variable": "Ostödd variabel", + "update for %s exited with status %s.": "uppdateringen av %s avslutades med status %s.", "updating": "Uppdatering", "updating NVIDIA userspace libs": "uppdaterar NVIDIA userspace libs", "user packages missing — will be installed automatically:": "användarpaket saknas — kommer att installeras automatiskt:", @@ -8186,6 +8418,7 @@ "with Proxmox": "med Proxmox", "with prefix, e.g.": "med prefix, t.ex.", "with the password you provided.": "med lösenordet du angav.", + "x-casaos.main must name an existing service.": "x-casaos.main måste ange en befintlig tjänst.", "xemu is a free and open-source application that emulates the original Microsoft Xbox game console, enabling people to play their original Xbox games on Windows, macOS, and Linux systems.": "xemu är en fri och öppen källkod som emulerar den ursprungliga Microsoft Xbox spelkonsolen, så att människor kan spela sina ursprungliga Xbox-spel på Windows, MacOS och Linux-system.", "xfs — Proxmox dir storage (large files and VMs)": "xfs — Proxmox dir-lagring (stora filer och virtuella datorer)", "xfs — better for large files": "xfs — bättre för stora filer", @@ -8201,6 +8434,7 @@ "zfs-auto-snapshot removed (existing snapshots preserved on the pool)": "zfs-auto-snapshot har tagits bort (befintliga ögonblicksbilder bevarade på poolen)", "zpool command not found. Install zfsutils-linux and retry.": "zpool-kommandot hittades inte. Installera zfsutils-linux och försök igen.", "zpool not found. Install zfsutils-linux and retry.": "zpool hittades inte. Installera zfsutils-linux och försök igen.", + "{application} runs in {count} containers.": "{application} körs i {count} behållare.", "{count} saved account.": "{count} sparat konto.", "{count} saved accounts.": "{count} sparade konton.", "{path} already exists and belongs to another user of the host, so {app} cannot write to it.\n\nProxMenux can add access rules (ACL) to this directory, to everything inside it and to what is created there later, for the users and groups {app} runs as on the host (IDs {ids}). The owner of the files does not change and whatever reads or writes them today keeps doing so; the owner of the directory also gets access to the files {app} creates.\n\nGrant {app} access to this directory?": "{path} finns redan och tillhör en annan användare på värden, så {app} kan inte skriva till den.\n\nProxMenux kan lägga till åtkomstregler (ACL) för den här katalogen, för allt i den och för det som skapas där senare, för de användare och grupper som {app} körs som på värden (ID {ids}). Ägaren till filerna ändras inte och det som läser eller skriver dem i dag fortsätter att göra det; katalogens ägare får också åtkomst till filerna som {app} skapar.\n\nGe {app} åtkomst till den här katalogen?", diff --git a/oci/remote/configure_jellyfin_encoding.py b/oci/remote/configure_jellyfin_encoding.py index a54d6707..a8b3d6e3 100644 --- a/oci/remote/configure_jellyfin_encoding.py +++ b/oci/remote/configure_jellyfin_encoding.py @@ -93,8 +93,8 @@ def main() -> None: rootfs = Path(sys.argv[1]) configuration = json.loads(sys.argv[2]) path, changed = update_encoding(rootfs, configuration) - state = "updated" if changed else "already applied" - print(f"Jellyfin configuration {state}: /{path.relative_to(rootfs.resolve())}") + state = translate("Jellyfin configuration updated:") if changed else translate("Jellyfin configuration already applied:") + print(f"{state} /{path.relative_to(rootfs.resolve())}") if __name__ == "__main__": diff --git a/oci/remote/oci_dhcp_lease.py b/oci/remote/oci_dhcp_lease.py index 92213719..6dd390e0 100644 --- a/oci/remote/oci_dhcp_lease.py +++ b/oci/remote/oci_dhcp_lease.py @@ -20,6 +20,7 @@ import re import subprocess import sys import time +from oci_ui import translate CONFIGS = Path('/etc/pve/lxc') HOOKS = Path('/var/lib/lxc') @@ -121,12 +122,13 @@ def check(vmid, settle=0): except BlockingIOError: return for name, version in repair(vmid, settle): - print(f'CT {vmid}: DHCP client of {name} (IPv{version}) started again', flush=True) + print(translate('CT {vmid}: DHCP client of {name} (IPv{version}) started again').format( + vmid=vmid, name=name, version=version), flush=True) def main(): if len(sys.argv) != 2 or not (sys.argv[1].isdigit() or sys.argv[1] == '--all'): - print('usage: oci_dhcp_lease.py | --all', file=sys.stderr) + print(translate('Usage:') + ' oci_dhcp_lease.py | --all', file=sys.stderr) return 2 LOCKS.mkdir(parents=True, exist_ok=True) if sys.argv[1] == '--all': diff --git a/oci/remote/oci_image_cache.py b/oci/remote/oci_image_cache.py index 34de491d..e8f05490 100644 --- a/oci/remote/oci_image_cache.py +++ b/oci/remote/oci_image_cache.py @@ -10,6 +10,7 @@ import sys import time import oci_instances as instances +from oci_ui import translate # Names given by the OCI installers and by updates; other archives are never touched. NAME = re.compile(r'(?:proxmenux-update-[a-z0-9]+-[0-9a-f]{64}' @@ -82,10 +83,10 @@ def main(arguments): command = arguments[0] if arguments else 'prune' if command == 'prune': for path, size in prune(): - print(f'removed unused image archive: {path} ({size} bytes)') + print(translate('removed unused image archive: {path} ({size} bytes)').format(path=path, size=size)) return 0 if command not in ('list', 'remove') or not all(a.isdigit() for a in arguments[1:]): - print('usage: oci_image_cache.py [prune | list VMID... | remove VMID...]', file=sys.stderr) + print(translate('Usage:') + ' oci_image_cache.py [prune | list VMID... | remove VMID...]', file=sys.stderr) return 2 with instances.locked(instances.ROOT): archives = archives_of([int(a) for a in arguments[1:]]) @@ -103,5 +104,5 @@ if __name__ == '__main__': try: sys.exit(main(sys.argv[1:])) except (OSError, ValueError, BlockingIOError) as error: - print(f'image cache: {error}', file=sys.stderr) + print(f"{translate('Image cache')}: {error}", file=sys.stderr) sys.exit(1) diff --git a/oci/remote/oci_immich_recognition.py b/oci/remote/oci_immich_recognition.py index 721b79ff..6dc5c615 100644 --- a/oci/remote/oci_immich_recognition.py +++ b/oci/remote/oci_immich_recognition.py @@ -284,7 +284,7 @@ def change(root, primary_id, acceleration, render_device=None, gfx_override=None def main(): parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument('vmid', type=int, help='main container of the application') + parser.add_argument('vmid', type=int, help=translate('main container of the application')) parser.add_argument('--acceleration', required=True, choices=PROFILES) parser.add_argument('--render-device') parser.add_argument('--gfx-override') diff --git a/oci/remote/oci_installation_state.py b/oci/remote/oci_installation_state.py index ecc10691..344d88ac 100644 --- a/oci/remote/oci_installation_state.py +++ b/oci/remote/oci_installation_state.py @@ -301,7 +301,7 @@ def main(argv=None): diagnose = sub.add_parser('diagnose') diagnose.add_argument('vmid', type=int) diagnose.add_argument('--check-registry', action='store_true') - record = sub.add_parser('record', help='Internal installer operation; not legacy adoption') + record = sub.add_parser('record', help=translate('Internal installer operation; not legacy adoption')) record.add_argument('vmid', type=int) for flag in ('template', 'deployment', 'archive', 'digest'): record.add_argument('--' + flag, required=True) diff --git a/oci/remote/oci_restore_recovery.py b/oci/remote/oci_restore_recovery.py index ab1827df..ebab98a9 100644 --- a/oci/remote/oci_restore_recovery.py +++ b/oci/remote/oci_restore_recovery.py @@ -1029,9 +1029,9 @@ def main(): parser.add_argument('--root', type=Path, default=instances.ROOT) parser.add_argument('--start', action='store_true') parser.add_argument('--host-firewall', type=int, action='append', default=[], metavar='VMID', - help='Add the host firewall rule of this container; one option for each confirmed rule') + help=translate('Add the host firewall rule of this container; one option for each confirmed rule')) parser.add_argument('--automatic', action='store_true', - help='Only the applications that need no question: the ones the cluster keeps a record of') + help=translate('Only the applications that need no question: the ones the cluster keeps a record of')) args = parser.parse_args() if os.geteuid() != 0: parser.error(translate('Root privileges are required')) diff --git a/oci/remote/oci_rocm_check.py b/oci/remote/oci_rocm_check.py index d4725d9d..711df27a 100644 --- a/oci/remote/oci_rocm_check.py +++ b/oci/remote/oci_rocm_check.py @@ -12,6 +12,7 @@ import argparse import re import subprocess import sys +from oci_ui import translate # A model of five operators (convolution, pooling and a dense layer), enough # to make ROCm compile and run on the GPU without downloading anything. @@ -72,7 +73,8 @@ def main(): try: check(args.vmid) except RuntimeError as error: - print(error, file=sys.stderr) + message = translate('the GPU did not answer in time') if str(error) == 'the GPU did not answer in time' else str(error) + print(message, file=sys.stderr) return 1 return 0 diff --git a/oci/remote/oci_update_check.py b/oci/remote/oci_update_check.py index 3d2faa9b..a1572431 100644 --- a/oci/remote/oci_update_check.py +++ b/oci/remote/oci_update_check.py @@ -18,6 +18,7 @@ import time import oci_instances as instances from oci_installation_state import parse_config +from oci_ui import translate APPS = Path('/etc/proxmenux/apps') SOCKET = Path('/run/proxmenux-monitor/oci-check.sock') @@ -206,7 +207,7 @@ def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('--root', type=Path, default=instances.ROOT) parser.add_argument('--configs', type=Path, default=Path('/etc/pve/lxc')) - parser.add_argument('--progress', action='store_true', help='Emit numeric progress for the OCI menu') + parser.add_argument('--progress', action='store_true', help=translate('Emit numeric progress for the OCI menu')) args = parser.parse_args() try: if args.progress: diff --git a/oci/remote/oci_watchdog.py b/oci/remote/oci_watchdog.py index cb14fdf9..743d7fb1 100644 --- a/oci/remote/oci_watchdog.py +++ b/oci/remote/oci_watchdog.py @@ -19,6 +19,7 @@ import time import oci_instances as instances import oci_operation_notice +from oci_ui import translate UNIT = 'proxmenux-oci-watchdog.service' UNIT_FILE = Path('/etc/systemd/system') / UNIT @@ -191,7 +192,8 @@ def look(states, now): lambda seen: stop_requested(read_tasks(), vmid, seen)) data = {'app_name': name, 'vmid': vmid, 'containers': f'CT {vmid}'} if action == 'start': - print(f'CT {vmid} ({name}) stopped on its own; starting it again (attempt {state["attempts"]})', flush=True) + print(translate('CT {vmid} ({name}) stopped on its own; starting it again (attempt {attempt})').format( + vmid=vmid, name=name, attempt=state['attempts']), flush=True) try: started = start(vmid) except (OSError, subprocess.SubprocessError): @@ -199,7 +201,8 @@ def look(states, now): if started and notice_due(state, now): oci_operation_notice.notify('oci_watchdog_restarted', data) elif action == 'give-up': - print(f'CT {vmid} ({name}) could not be kept running; it is left stopped', flush=True) + print(translate('CT {vmid} ({name}) could not be kept running; it is left stopped').format( + vmid=vmid, name=name), flush=True) oci_operation_notice.notify('oci_watchdog_failed', data) @@ -290,7 +293,7 @@ def main(): try: vmids = set_watchdog(instances.ROOT, args.vmid, args.state == 'on') except BlockingIOError: - print('Another OCI operation is using the instance registry.', file=sys.stderr) + print(translate('Another OCI operation is using the instance registry.'), file=sys.stderr) return 3 except (OSError, ValueError, KeyError) as error: print(str(error) or type(error).__name__, file=sys.stderr) diff --git a/oci/remote/rclone_mount_publish.py b/oci/remote/rclone_mount_publish.py index df79c67f..950241f1 100644 --- a/oci/remote/rclone_mount_publish.py +++ b/oci/remote/rclone_mount_publish.py @@ -4,9 +4,32 @@ from __future__ import annotations import ctypes +import json import os import platform import sys +from pathlib import Path +from functools import lru_cache + + +@lru_cache(maxsize=1) +def _messages() -> dict: + # This helper is also installed alone in libexec: importing oci_ui would + # break that existing caller. Read the same catalog using stdlib only. + base = Path(os.environ.get('PMX_BASE_DIR', '/usr/local/share/proxmenux')) + try: + language = json.loads((base / 'config.json').read_text(encoding='utf-8')).get('language', 'en') + if language == 'en' or not isinstance(language, str) or not language: + return {} + data = json.loads((base / 'lang' / (language + '.json')).read_text(encoding='utf-8')) + return data if isinstance(data, dict) else {} + except (OSError, ValueError, AttributeError): + return {} + + +def translate(text: str) -> str: + value = _messages().get(text) + return value if isinstance(value, str) and value else text AT_FDCWD = -100 @@ -41,14 +64,16 @@ def fail(step: str) -> None: def main() -> int: if len(sys.argv) != 5 or sys.argv[4] not in {"rw", "ro"}: - print(f"usage: {sys.argv[0]} PID SOURCE TARGET rw|ro", file=sys.stderr) + print(f"{translate('Usage:')} {sys.argv[0]} PID SOURCE TARGET rw|ro", file=sys.stderr) return 2 machine = platform.machine().lower() if machine not in SYSCALLS: - print(f"unsupported host architecture: {machine}", file=sys.stderr) + print(f"{translate('Unsupported host architecture:')} {machine}", file=sys.stderr) return 2 open_tree_nr, move_mount_nr, mount_setattr_nr = SYSCALLS[machine] pid, source, target, mode = sys.argv[1:] + # The host catalog is no longer reachable after chroot into the container. + _messages() libc = ctypes.CDLL(None, use_errno=True) libc.syscall.restype = ctypes.c_long libc.setns.argtypes = (ctypes.c_int, ctypes.c_int) @@ -60,7 +85,7 @@ def main() -> int: ct_root = os.open(f"/proc/{pid}/root", os.O_PATH | os.O_DIRECTORY | os.O_CLOEXEC) try: if libc.setns(ct_ns, CLONE_NEWNS) != 0: - fail("enter container namespace") + fail(translate("enter container namespace")) os.fchdir(ct_root) os.chroot(".") os.chdir("/") @@ -71,7 +96,7 @@ def main() -> int: OPEN_TREE_CLONE | os.O_CLOEXEC, ) if tree < 0: - fail("clone source mount tree") + fail(translate("clone source mount tree")) try: if mode == "ro": attributes = MountAttr(attr_set=MOUNT_ATTR_RDONLY) @@ -84,9 +109,9 @@ def main() -> int: ctypes.sizeof(attributes), ) if result != 0: - fail("make cloned mount tree read-only") + fail(translate("make cloned mount tree read-only")) if libc.setns(host_ns, CLONE_NEWNS) != 0: - fail("return to host namespace") + fail(translate("return to host namespace")) os.fchdir(host_root) os.chroot(".") os.chdir("/") @@ -99,7 +124,7 @@ def main() -> int: MOVE_MOUNT_F_EMPTY_PATH, ) if result != 0: - fail("publish mount tree") + fail(translate("publish mount tree")) finally: os.close(tree) finally: diff --git a/oci/remote/verify_oci_archive.py b/oci/remote/verify_oci_archive.py index 29cedede..782a8dc0 100755 --- a/oci/remote/verify_oci_archive.py +++ b/oci/remote/verify_oci_archive.py @@ -164,7 +164,7 @@ def main() -> int: parser = argparse.ArgumentParser() parser.add_argument("archive", type=Path) parser.add_argument("--extracted-mib", action="store_true", - help="print the estimated unpacked size in MiB (0 when unknown)") + help=translate("print the estimated unpacked size in MiB (0 when unknown)")) args = parser.parse_args() if args.extracted_mib: try: diff --git a/oci/src/proxmenux_oci/cli.py b/oci/src/proxmenux_oci/cli.py index 3b611be9..d2d2c25f 100644 --- a/oci/src/proxmenux_oci/cli.py +++ b/oci/src/proxmenux_oci/cli.py @@ -15,7 +15,7 @@ from . import console, images from .catalog import Catalog from .converter import ConversionError from .github_source import SourceError -from .i18n import N_, source_text, translate +from .i18n import N_, diagnostic, source_text, translate from .installer import ( ADDRESS_SHOWN, ADVANCED_MODE, @@ -38,7 +38,7 @@ PUBLISHERS = {"linuxserver.io": "LinuxServer", "official": N_("Official image")} STACK_LABELS = { "server": N_("Server"), "application": N_("Application"), - "machine_learning": "Machine learning", + "machine_learning": N_("Machine learning"), "database": "PostgreSQL", "valkey": "Valkey", "cache": "Redis", @@ -133,7 +133,7 @@ def _service_kind(service: dict[str, Any]) -> str: if service.get("is_main"): return translate("Application") if "machine-learning" in name or "machine-learning" in image: - return "Machine learning" + return translate("Machine learning") for key, label in SERVICE_KINDS: if key in image: return label @@ -267,7 +267,7 @@ def _deployment_summary_text(template: dict[str, Any], deployment: dict[str, Any target = (f"{mount['size_gb']} GB {on} {mount['source']}" if mount["type"] == "managed-volume" else mount["source"]) lines.append(f" {mount['container_path']} → {target}") - for key, label in (("media", "Library"), ("application", "Application data"), ("transfer", "Consume/export")): + for key, label in (("media", N_("Library")), ("application", N_("Application data")), ("transfer", N_("Consume/export"))): storage = plan.get(key) if isinstance(storage, dict) and "mode" in storage: if storage["mode"] == "host-bind": @@ -472,7 +472,7 @@ def _rclone_mount(catalog: Catalog, ui) -> None: if result: from .management import carry_records carry_records(PROJECT_ROOT, shown=True) - console.msg_ok(f"Remote: {result['remote']}:") + console.msg_ok(f"{translate('Rclone remote')}: {result['remote']}:") console.msg_ok(f"{translate('Read/write')}: {result['read_write_path']}") console.msg_ok(f"{translate('Read-only')}: {result['read_only_path']}") console.wait_for_enter(translate("Press Enter to return to the menu...")) @@ -614,7 +614,7 @@ def interactive(catalog: Catalog) -> int: continue except (ConversionError, InstallError, OSError, ValueError) as exc: console.stop_spinner() - ui.message(f"{translate('The operation could not be completed')}:\n\n{exc}") + ui.message(f"{translate('The operation could not be completed')}:\n\n{diagnostic(exc)}") # ---------------------------------------------------------------- maintenance CLI @@ -623,52 +623,52 @@ def _template_summary_text(template: dict[str, Any]) -> str: contract = template["container_contract"] lines = [ source_text(template["catalog_ui"]["title"]), - f"Image: {contract['image']['reference']}", - f"Status: {template['status']}", - "Ports: " + (", ".join(f"{p['container_port']}/{p['protocol']}" for p in contract["ports"]) or "none"), - "Volumes: " + (", ".join(v["container_path"] for v in contract["volumes"]) or "none"), + f"{translate('Image')}: {contract['image']['reference']}", + f"{translate('Status')}: {template['status']}", + translate("Ports") + ": " + (", ".join(f"{p['container_port']}/{p['protocol']}" for p in contract["ports"]) or translate("none")), + translate("Volumes") + ": " + (", ".join(v["container_path"] for v in contract["volumes"]) or translate("none")), ] blockers = template["compatibility"]["untranslated_blockers"] if blockers: - lines.append(f"Blockers: {', '.join(blockers)}") + lines.append(f"{translate('Blockers')}: {', '.join(blockers)}") return "\n".join(lines) def build_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser(prog="oci_manager_apps.sh", - description="ProxMenux OCI manager Apps (Technology Preview)") + description=translate("ProxMenux OCI manager Apps (Technology Preview)")) subparsers = parser.add_subparsers(dest="command") - subparsers.add_parser("sync", help="Refresh the index from the image sources") - list_parser = subparsers.add_parser("list", help="List applications") + subparsers.add_parser("sync", help=translate("Refresh the index from the image sources")) + list_parser = subparsers.add_parser("list", help=translate("List applications")) list_parser.add_argument("--filter", default="") - generate_parser = subparsers.add_parser("generate", help="Regenerate the template of one application") + generate_parser = subparsers.add_parser("generate", help=translate("Regenerate the template of one application")) generate_parser.add_argument("app") - generate_all_parser = subparsers.add_parser("generate-all", help="Regenerate the catalog templates") + generate_all_parser = subparsers.add_parser("generate-all", help=translate("Regenerate the catalog templates")) generate_all_parser.add_argument("--provider", choices=["all", "linuxserver.io", "imported", "curated"], default="all") - subparsers.add_parser("apply-icons", help="Resolve catalog icons against the jsdelivr icon sets") - show_parser = subparsers.add_parser("show", help="Show the summary of a template") + subparsers.add_parser("apply-icons", help=translate("Resolve catalog icons against the jsdelivr icon sets")) + show_parser = subparsers.add_parser("show", help=translate("Show the summary of a template")) show_parser.add_argument("app") - open_parser = subparsers.add_parser("open", help="Open the page of an application in the menu") + open_parser = subparsers.add_parser("open", help=translate("Open the page of an application in the menu")) open_parser.add_argument("app") - install_parser = subparsers.add_parser("install", help="Configure and install an application") + install_parser = subparsers.add_parser("install", help=translate("Configure and install an application")) install_parser.add_argument("app") - install_parser.add_argument("--host", default="auto", help="'auto'/'local', or root@IP for development") + install_parser.add_argument("--host", default="auto", help=translate("'auto'/'local', or root@IP for development")) install_parser.add_argument("--advanced", action="store_true") install_parser.add_argument("--dry-run", action="store_true") - rclone_parser = subparsers.add_parser("rclone-mount", help="Enable a mount on an installed Rclone OCI") + rclone_parser = subparsers.add_parser("rclone-mount", help=translate("Enable a mount on an installed Rclone OCI")) rclone_parser.add_argument("--host", default="auto") rclone_parser.add_argument("--dry-run", action="store_true") - subparsers.add_parser("recover", help="Register again the OCI applications restored from a backup") - manage_parser = subparsers.add_parser("manage", help="Update, modify or recreate one installed OCI instance") + subparsers.add_parser("recover", help=translate("Register again the OCI applications restored from a backup")) + manage_parser = subparsers.add_parser("manage", help=translate("Update, modify or recreate one installed OCI instance")) manage_parser.add_argument("vmid", type=int) manage_parser.add_argument("--action", choices=("update", "modify", "recreate"), required=True) manage_parser.add_argument("--keep-backup", metavar="STORAGE", - help="Keep the backup taken before the update in this Proxmox storage") + help=translate("Keep the backup taken before the update in this Proxmox storage")) manage_parser.add_argument("--unattended", action="store_true", - help="Scheduled run: no questions; stops where a person has to decide") + help=translate("Scheduled run: no questions; stops where a person has to decide")) manage_parser.add_argument("--acknowledge-external-data", action="store_true", - help="Host directories are not reverted by the backup (confirmed beforehand)") + help=translate("Host directories are not reverted by the backup (confirmed beforehand)")) manage_parser.add_argument("--min-image-age-days", type=int, default=0) return parser @@ -681,15 +681,15 @@ def main(argv: list[str] | None = None) -> int: return interactive(catalog) if args.command == "sync": payload = catalog.sync_index() - print(f"Index updated: {len(payload['applications'])} candidate applications") + print(translate('Index updated: {count} candidate applications').format(count=len(payload['applications']))) return 0 if args.command == "list": query = args.filter.casefold() for item in catalog.load_index()["applications"]: if not item.get("hidden", False) and query in item["id"].casefold(): candidate = item.get("automatic_install_candidate") - status = ("installable" if candidate else "pending adaptation" if candidate is False - else item.get("template_status") or "not generated") + status = (translate("installable") if candidate else translate("pending adaptation") if candidate is False + else item.get("template_status") or translate("not generated")) print(f"{item['id']:<30} {_display_architectures(item):<12} {publisher(item):<14} {status}") return 0 if args.command == "generate": @@ -702,13 +702,12 @@ def main(argv: list[str] | None = None) -> int: print(f"\r[{current:3}/{total}] {marker:<5} {app_id:<32}", end="", flush=True) report = catalog.generate_all(progress=progress, provider=args.provider) - print(f"\nGenerated: {report['generated_count']}; failed: {report['failed_count']}; " - f"family: {args.provider}") + print('\n' + translate('Generated: {generated}; failed: {failed}; family: {provider}').format( + generated=report['generated_count'], failed=report['failed_count'], provider=args.provider)) return 0 if not report["failed"] else 2 if args.command == "apply-icons": report = catalog.apply_icons() - print(f"Icons resolved: {report['resolved']}; cleared: {report['cleared']}; " - f"unchanged: {report['unchanged']}; with a theme variant: {report['themed']}") + print(translate('Icons resolved: {resolved}; cleared: {cleared}; unchanged: {unchanged}; with a theme variant: {themed}').format(**report)) return 0 if args.command == "show": print(_template_summary_text(catalog.compose(args.app))) @@ -728,14 +727,14 @@ def main(argv: list[str] | None = None) -> int: if args.command == "install": template = catalog.compose(args.app) if not template["compatibility"]["automatic_install_candidate"]: - raise InstallError("Installation blocked: " + ", ".join(template["compatibility"]["untranslated_blockers"])) + raise InstallError(translate("Installation blocked:") + " " + ", ".join(template["compatibility"]["untranslated_blockers"])) notice = external_services_notice(template) if notice: print(notice + "\n") deployment = build_deployment(template, None, ADVANCED_MODE if args.advanced else DEFAULT_MODE) print(_deployment_summary_text(template, deployment)) - if not args.dry_run and input("\nInstall? [y/N]: ").strip().casefold() not in {"y", "yes"}: - print("Installation cancelled.") + if not args.dry_run and input('\n' + translate('Install? [y/N]:') + ' ').strip().casefold() not in {"y", "yes"}: + print(translate("Installation cancelled.")) return 0 result = run_remote_install(PROJECT_ROOT, template, deployment, args.host, args.dry_run) if result: @@ -764,7 +763,7 @@ def main(argv: list[str] | None = None) -> int: print(json.dumps(deployment, ensure_ascii=False, indent=2)) result = run_remote_rclone_mount(PROJECT_ROOT, template, deployment, args.host, args.dry_run) if result: - print(f"Read/write: {result['read_write_path']}\nRead-only: {result['read_only_path']}") + print(f"{translate('Read/write')}: {result['read_write_path']}\n{translate('Read-only')}: {result['read_only_path']}") return 0 return 1 except (KeyboardInterrupt, UserCancelled): @@ -773,7 +772,7 @@ def main(argv: list[str] | None = None) -> int: return 130 except (ConversionError, SourceError, InstallError, OSError, ValueError) as exc: console.stop_spinner() - print(f"ERROR: {exc}", file=sys.stderr) + print(f"ERROR: {diagnostic(exc)}", file=sys.stderr) return 1 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 diff --git a/oci/src/proxmenux_oci/i18n.py b/oci/src/proxmenux_oci/i18n.py index 2d39be2e..737ffb69 100644 --- a/oci/src/proxmenux_oci/i18n.py +++ b/oci/src/proxmenux_oci/i18n.py @@ -7,6 +7,7 @@ is the source language: a missing translation returns the English text. from __future__ import annotations import json +import re from pathlib import Path from typing import Any @@ -46,6 +47,68 @@ def translate(text: str) -> str: return _cache.get(text) or text +def diagnostic(error: Any) -> str: + """Translate legacy diagnostics only when presenting them to a person. + + The catalog's exception types and original messages remain stable for + internal callers; identifiers are inserted after the translation lookup. + """ + text = str(error) + for pattern, source in ( + (r"No template is available for '(.*)'", N_("No template is available for '{app_id}'")), + (r"The application '(.*)' is not in the index", N_("The application '{app_id}' is not in the index")), + (r"The application '(.*)' does not come from LinuxServer", N_("The application '{app_id}' does not come from LinuxServer")), + ): + match = re.fullmatch(pattern, text) + if match: + return translate(source).format(app_id=match[1]) + exact = { + 'The CasaOS Compose file has no services': N_('The Compose file has no services.'), + 'The Compose file has no services': N_('The Compose file has no services.'), + '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.'), + 'El servicio principal no declara una imagen': N_('The main Compose service has no image.'), + 'El servicio no declara una imagen': N_('The service declares no image:'), + '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.'), + '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 README has no recognisable docker-compose section': N_('The README has no recognisable docker-compose section'), + 'La seccion docker-compose no contiene un bloque de codigo': N_('The docker-compose section contains no code block'), + 'The docker-compose block is not closed': N_('The docker-compose block is not closed'), + 'The block found does not look like a Docker Compose file': N_('The block found does not look like a Docker Compose file'), + 'No se puede identificar la imagen principal del Compose': N_('The main Compose service cannot be identified unambiguously'), + 'No se puede identificar de forma univoca el servicio principal del Compose': N_('The main Compose service cannot be identified unambiguously'), + 'python3-jsonschema is required to generate templates': N_('python3-jsonschema is required to generate templates'), + 'Bulk generation requires GITHUB_TOKEN to obtain an immutable revision per application': N_('Bulk generation requires GITHUB_TOKEN to obtain an immutable revision per application'), + 'The ProxMenux application catalogue is not a list': N_('The ProxMenux application catalogue is not a list'), + 'GitHub returned a truncated tree for the CasaOS catalogue': N_('GitHub returned a truncated tree for the CasaOS catalogue'), + 'No Compose files were found in the CasaOS catalogue': N_('No Compose files were found in the CasaOS catalogue'), + } + if text in exact: + return translate(exact[text]) + for prefix, source in ( + ('Cannot normalise the CasaOS identifier:', N_('Invalid application identifier:')), + ('Cannot normalise the identifier:', N_('Invalid application identifier:')), + ('Docker Compose CasaOS no valido:', N_('The Compose file is not valid YAML:')), + ('Docker Compose no valido:', N_('The Compose file is not valid YAML:')), + ('La plantilla generada no cumple el esquema:', N_('The generated template does not match the schema:')), + ): + if text.startswith(prefix): + return translate(source) + text[len(prefix):] + match = re.fullmatch(r'GitHub returned HTTP 403 for (.+)\. Set GITHUB_TOKEN to raise the API rate limit\.', text) + if match: + return translate('GitHub returned HTTP 403 for {url}. Set GITHUB_TOKEN to raise the API rate limit.').format(url=match[1]) + match = re.fullmatch(r'GitHub returned HTTP ([0-9]{3}) (?:for|para) (.+)\.', text) + if match: + return translate('GitHub returned HTTP {status} for {url}.').format(status=match[1], url=match[2]) + match = re.fullmatch(r'No se pudo acceder a (.+) despues de 3 intentos: (.*)', text, re.S) + if match: + return translate('Could not reach {url} after 3 attempts: {reason}').format(url=match[1], reason=match[2]) + return text + + def source_text(value: Any) -> str: """The English a catalog field was written in. diff --git a/oci/src/proxmenux_oci/management.py b/oci/src/proxmenux_oci/management.py index 6ac0315d..12b609b3 100644 --- a/oci/src/proxmenux_oci/management.py +++ b/oci/src/proxmenux_oci/management.py @@ -19,6 +19,16 @@ STATUS_LABELS = {'installed': N_('installed'), 'failed': N_('failed'), 'updating 'assembling': N_('assembling')} +class CancelledOperation: + """An explicit user decline; remains false for menu and batch callers.""" + + def __bool__(self): + return False + + +CANCELLED = CancelledOperation() + + def public_row(record, decision): return {'vmid': record['vmid'], 'hostname': record.get('deployment', {}).get('hostname', f'OCI {record["vmid"]}'), @@ -219,7 +229,7 @@ def offer_recovery(project, ui): f"{translate('Until they are registered again they cannot be updated or managed from here. The recovery checks first what prevents their registration; an application with such a problem is not registered. A Rclone mount that has to be enabled again does not prevent it, but then the applications are not started automatically.')}" f"\n\n{translate('Recover them now?')}") if not ui.confirm(text, default=True): - return + return CANCELLED command = [sys.executable, str(project / 'remote/oci_restore_recovery.py'), 'recover'] for rule in _restored_firewall_rules(project): if ui.confirm(translate('CT {vmid} is a host monitor and had a rule in the host firewall. Allow TCP port {port} from {subnet} through the firewall of this host? Existing firewall rules are not changed.').format( @@ -242,7 +252,9 @@ def direct_recovery(project): if not restored_applications(project): ui.message(translate('No restored OCI application is waiting to be recovered.'), translate('Restored OCI applications')) return EXIT_DONE - offer_recovery(project, ui) + completed = offer_recovery(project, ui) + if completed is CANCELLED: + return EXIT_CANCELLED return EXIT_DONE if not restored_applications(project) else EXIT_FAILED @@ -458,12 +470,14 @@ def manage_instance(project, ui, row, action=None, lifecycle_args=(), heading=No proposal = None if action == 'modify': from .recreation import edit_recreation - proposal = edit_recreation(record, ui) + proposal = edit_recreation(record, ui, cancelled_result=CANCELLED) + if proposal is CANCELLED: + return CANCELLED if proposal is None: return False - elif not ui.review(translate('If the image channel has a new version, the CT is stopped, backed up and verified, and replaced with the new image to update the container. If the update fails after the container was changed, the backup is restored. An update that stops halfway is recovered from the OCI management menu.'), + elif not ui.review(translate('If a newer application image is available, the container is stopped and backed up, and the backup integrity is verified. The container is then updated using the new image.\n\nIf the update fails after the container was changed, ProxMenux attempts to restore the previous installation from the backup. If the operation remains incomplete, select the application in OCI management and choose "Recover the previous installation".\n\nHost directories mounted in the container are not restored by the container backup.'), translate('Update OCI'), question=translate('Update now?'), default=True): - return False + return CANCELLED # Opening/cancelling a confirmation needs no disk or storage probes. # Both accepted operations retain this check before the backend starts. if not _work_backup_ready(project, ui, row['vmid']): @@ -498,11 +512,11 @@ def manage_instance(project, ui, row, action=None, lifecycle_args=(), heading=No action = ui.choose(translate('Interrupted operation'), [('status', translate('View status')), ('recover', translate('Recover the previous installation'))], 'status') if action is None: - return False + return CANCELLED if action == 'recover' and not ui.review( translate('If the container had already been changed, its previous native backup is restored. Shared host directories are not reverted. The disks of the failed attempt are removed when the cleanup succeeds.'), translate('Recover OCI'), question=translate('Recover now?'), default=True): - return False + return CANCELLED return _run_lifecycle([sys.executable, str(project / 'remote/oci_instance_transaction.py'), action, str(row['vmid'])], translate('Recover OCI') if action == 'recover' else translate('OCI management')) @@ -552,13 +566,15 @@ def _removal_summary(project, vmid): bridge = oci_remove.private_bridge(primary) text = [] if len(members) > 1 and vmid == primary_id: - text += [f"{application} {translate('runs in')} {len(members)} {translate('containers')}. " - f"{translate('All of them are targeted for removal.')}", ''] + sentence = translate('{application} runs in {count} containers.').format( + application=application, count=len(members)) + text += [f"{sentence} {translate('All of them are targeted for removal.')}", ''] elif len(members) > 1: alone = translate('It cannot be removed on its own, because the application would stop ' 'working: continuing targets the whole application for removal.') - text += [f"CT {vmid} {translate('is one of the')} {len(members)} " - f"{translate('containers of')} {application}. {alone}", ''] + sentence = translate('CT {vmid} is one of the {count} containers of {application}.').format( + vmid=vmid, count=len(members), application=application) + text += [f"{sentence} {alone}", ''] text += [translate('Containers targeted for removal:'), *lines, '', translate('Container data targeted for deletion:'), *volumes] if bridge and not oci_remove.bridge_in_use(bridge, set(members)): @@ -642,7 +658,7 @@ def _manage_stack(project, ui, row, action=None, lifecycle_args=()): 'the OCI management menu.') .format(count=len(members), vmid=primary_id), translate('Recreate OCI stack'), question=translate('Recreate the whole stack?'), default=False): - return False + return CANCELLED else: if not ui.review(translate('All {count} containers of the application are updated together (main CT: {vmid}). ' 'If there are new versions, all images are downloaded and verified, the application ' @@ -650,11 +666,11 @@ def _manage_stack(project, ui, row, action=None, lifecycle_args=()): 'fails after a container was changed, the backups are restored. An operation that stops ' 'halfway is recovered from the OCI management menu.').format(count=len(members), vmid=primary_id), translate('Update OCI stack'), question=translate('Update the whole stack?'), default=True): - return False + return CANCELLED else: if not ui.review(translate('A coordinated operation has a saved journal. Continuing attempts to recover the previous stack where needed, or finish cleanup for a completed operation. Recovery or cleanup can fail.'), translate('Recover OCI stack'), question=translate('Recover or complete the operation?'), default=True): - return False + return CANCELLED import json members = json.loads(Path(pending).read_text())['plan']['members'] if not pending and not _work_backup_ready(project, ui, primary_id): @@ -707,6 +723,7 @@ class UnattendedUI: # Exit codes of `manage`, read by ProxMenux Monitor. EXIT_DONE, EXIT_FAILED, EXIT_NOT_OCI, EXIT_BUSY, EXIT_NEEDS_REVIEW, EXIT_TOO_RECENT = 0, 1, 2, 3, 4, 5 +EXIT_CANCELLED = 6 # Explicit interactive cancellation; never a successful update. def _image_too_recent(project, vmid, min_age_days): @@ -765,4 +782,6 @@ def direct_management(project, vmid, action, lifecycle_args=(), unattended=False return EXIT_BUSY if unattended and ui.declined: return EXIT_NEEDS_REVIEW + if completed is CANCELLED and not unattended: + return EXIT_CANCELLED return EXIT_DONE if completed else EXIT_FAILED diff --git a/oci/src/proxmenux_oci/recreation.py b/oci/src/proxmenux_oci/recreation.py index e1f3d897..676c5911 100644 --- a/oci/src/proxmenux_oci/recreation.py +++ b/oci/src/proxmenux_oci/recreation.py @@ -3,7 +3,7 @@ import copy import re from pathlib import Path, PurePosixPath -from .i18n import translate +from .i18n import N_, translate from .ui import BacktrackUI, RestartWizard, UserCancelled @@ -212,8 +212,8 @@ def edit_section(candidate, ui, setting): wizard.close() -def edit_recreation(record, ui): - """Keep a draft across independently editable settings; apply it once.""" +def edit_recreation(record, ui, *, cancelled_result=None): + """Keep a draft; optionally distinguish cancellation from an unchanged review.""" from .cli import _deployment_summary_text candidate = copy.deepcopy(record) selected = 'cores' @@ -227,7 +227,7 @@ def edit_recreation(record, ui): title=translate('Modify OCI'), show_tags=False) if selected is None or selected == 'discard': if not pending or ui.confirm(translate('Discard unapplied changes?'), False): - return None + return cancelled_result selected = 'apply' elif selected == 'apply': if not pending: @@ -243,8 +243,29 @@ def edit_recreation(record, ui): candidate = edit_section(candidate, ui, selected) +def _catalog_message(error): + """Localize legacy catalog errors here, preserving the catalog API.""" + text = str(error) + patterns = ( + (r"No template is available for '(.*)'", N_("No template is available for '{app_id}'")), + (r"The application '(.*)' is not in the index", N_("The application '{app_id}' is not in the index")), + ) + for pattern, source in patterns: + match = re.fullmatch(pattern, text) + if match: + translated = translate(source) + return text if translated == source else translated.format(app_id=match[1]) + prefix = 'La plantilla generada no cumple el esquema:' + if text.startswith(prefix): + source = N_('The generated template does not match the schema:') + translated = translate(source) + return text if translated == source else translated + text[len(prefix):] + return text + + def refresh_template(candidate, ui): from .catalog import Catalog + from .converter import ConversionError old = candidate.get('template', {}) template_id = old.get('id', '') if not re.fullmatch(r'[a-z0-9][a-z0-9-]+', template_id): @@ -258,7 +279,10 @@ def refresh_template(candidate, ui): if len(matching) != 1: return name = matching[0]['id'] - latest = catalog.compose(name) + try: + latest = catalog.compose(name) + except ConversionError as error: + raise ConversionError(_catalog_message(error)) from error if latest == old: return if not ui.confirm(translate('Apply options from the current catalog template? New required paths and settings may be requested. Review the resulting configuration before recreating the CT.'), True): diff --git a/oci/src/proxmenux_oci/stack.py b/oci/src/proxmenux_oci/stack.py index 442c1744..3b878d3f 100644 --- a/oci/src/proxmenux_oci/stack.py +++ b/oci/src/proxmenux_oci/stack.py @@ -365,13 +365,13 @@ def build_stack(template, ui, mode='advanced'): service_name = group['service'] if service_name not in envs: raise StackError(f"{translate('Unknown credential service:')} {service_name}") - if not quiet.confirm(f"{translate('Configure')} {group['label']} ({translate('optional')})", False): + if not quiet.confirm(f"{translate('Configure')} {translate(group['label'])} ({translate('optional')})", False): continue for field in group['fields']: if field['name'] not in envs[service_name] or envs[service_name][field['name']] != '': raise StackError(f"{translate('External field not reserved:')} {field['name']}") - value = (ui.password(field['label'], required=True) if field.get('sensitive',True) - else ui.ask(field['label'], required=True)) + value = (ui.password(translate(field['label']), required=True) if field.get('sensitive',True) + else ui.ask(translate(field['label']), required=True)) if not value or any(c in value for c in '\r\n'): raise StackError(translate('External credential is empty or spans multiple lines')) envs[service_name][field['name']] = value diff --git a/oci/tests/test_immich_acceleration.py b/oci/tests/test_immich_acceleration.py index 7a8448a2..4a52f6e9 100644 --- a/oci/tests/test_immich_acceleration.py +++ b/oci/tests/test_immich_acceleration.py @@ -3,6 +3,7 @@ transcoding and its recognition: the CPU, or each usable GPU of the host for both or for only one of them.""" from pathlib import Path +import json import sys import unittest from unittest.mock import patch @@ -165,7 +166,18 @@ class ImmichAccelerationTests(unittest.TestCase): def test_the_name_of_the_machine_learning_container_is_not_translated(self, *_): script = (ROOT / "remote/install_immich_stack.sh").read_text() self.assertNotIn('translate "Machine learning"', script) - self.assertNotIn('translate("Machine learning")', (ROOT / "src/proxmenux_oci/cli.py").read_text()) + from proxmenux_oci.cli import _service_kind + from proxmenux_oci import i18n + service = {'name': 'immich-machine-learning', 'image': 'ghcr.io/immich-app/immich-machine-learning:release'} + original = dict(service) + with patch.object(i18n, 'language', return_value='sk'), patch.object(i18n, '_cache', json.loads((ROOT.parent / 'lang/sk.json').read_text())): + self.assertEqual(_service_kind(service), 'Strojové učenie') + _, _, plan = self.plan(NOTHING, DEFAULT_MODE) + # Spanish keeps the English name of the service. + with patch.object(i18n, 'language', return_value='es'), patch.object(i18n, '_cache', json.loads((ROOT.parent / 'lang/es.json').read_text())): + self.assertEqual(_service_kind(service), 'Machine learning') + self.assertIn('machine_learning', plan) + self.assertEqual(service, original) if __name__ == "__main__": diff --git a/oci/tests/test_modify_menu.py b/oci/tests/test_modify_menu.py index 0f80a0a7..31a04163 100644 --- a/oci/tests/test_modify_menu.py +++ b/oci/tests/test_modify_menu.py @@ -185,7 +185,7 @@ class ModifyDispatchTests(unittest.TestCase): patch.object(management, '_run_lifecycle', side_effect=lifecycle): return management.manage_instance(ROOT, ui or Mock(), row, action='modify') - def test_cancel_does_not_start_a_lifecycle_transaction(self): + def test_legacy_none_result_does_not_start_a_lifecycle_transaction(self): lifecycle = Mock() self.assertFalse(self.call_manager(None, lifecycle)) lifecycle.assert_not_called() diff --git a/oci/tests/test_recreation_i18n.py b/oci/tests/test_recreation_i18n.py new file mode 100644 index 00000000..b1413857 --- /dev/null +++ b/oci/tests/test_recreation_i18n.py @@ -0,0 +1,216 @@ +"""Single-container editor wording, real helper paths and no-apply boundaries.""" +import copy +import json +from pathlib import Path +import subprocess +import unittest +from unittest.mock import patch + +from test_modify_menu import MenuUI, record +from proxmenux_oci import i18n, installer, management, recreation +from proxmenux_oci.catalog import Catalog +from proxmenux_oci.cli import _deployment_summary_text +from proxmenux_oci.converter import ConversionError +from proxmenux_oci.ui import UserCancelled + +ROOT = Path(__file__).resolve().parents[2] + + +class EditorUI(MenuUI): + def info(self, text): + self.events.append(('info', text)) + + def password(self, text, **kwargs): + self.events.append(('password', text)) + return next(self.answers) + + +class SlovakEditorTests(unittest.TestCase): + def setUp(self): + translations = json.loads((ROOT / 'lang/sk.json').read_text()) + for mock in (patch.object(i18n, '_language', 'sk'), + patch.object(i18n, '_cache', translations)): + mock.start() + self.addCleanup(mock.stop) + self.forbidden = [] + # The actual editor/helpers run, but any external action fails the test. + for target, name in ((management, '_run_lifecycle'), (subprocess, 'run'), + (subprocess, 'Popen'), (subprocess, 'check_output'), + (Path, 'write_text'), (Path, 'write_bytes')): + mock = patch.object(target, name, side_effect=AssertionError('editor performed an external action')) + self.forbidden.append(mock.start()) + self.addCleanup(mock.stop) + self.original = record() + self.saved = copy.deepcopy(self.original) + + def tearDown(self): + self.assertEqual(self.original, self.saved) + for mock in self.forbidden: + mock.assert_not_called() + + def text(self, ui): + return '\n'.join(str(e[1:]) for e in ui.events) + + def test_cpu_minimum_then_invalid_number_can_be_corrected_and_discarded(self): + ui = EditorUI(['cores', 'discard'], ['0', 'two', '3'], confirms=[True]) + self.assertIsNone(recreation.edit_recreation(self.original, ui)) + text = self.text(ui) + self.assertIn('Počet jadier CPU', text) + self.assertIn('Počet jadier: minimum 1', text) + self.assertIn('Hodnota musí byť číslo:', text) + self.assertIn('Zadajte hodnotu znova.', text) + self.assertIn('Zahodiť nepoužité zmeny?', text) + self.assertNotIn('private-test-secret', text) + + def test_ram_boundary_and_declined_review_do_not_apply_a_proposal(self): + ui = EditorUI(['memory', 'apply', 'discard'], ['127', '128'], + reviews=[False], confirms=[True]) + self.assertIsNone(recreation.edit_recreation(self.original, ui)) + self.assertIn('RAM v MiB: minimum 128', self.text(ui)) + summary = next(e[1] for e in ui.events if e[0] == 'review') + self.assertIn('128 MB RAM', summary) + self.assertIn('rootfs 8 GB na local-zfs', summary) + self.assertIn('vyrovnávacia pamäť obrazov na', summary) + self.assertIn('neprivilegovaný LXC', summary) + self.assertNotIn('private-test-secret', summary) + + def test_no_change_and_cancelled_section_keep_the_existing_record(self): + for choices, answers in ((['apply'], []), (['cores', 'discard'], [UserCancelled()])): + with self.subTest(choices=choices): + ui = EditorUI(choices, answers) + self.assertIsNone(recreation.edit_recreation(self.original, ui)) + self.assertFalse(any(e[0] == 'review' for e in ui.events)) + + def test_environment_duplicate_is_an_error_not_an_instruction_to_duplicate(self): + self.original['deployment']['environment'] *= 2 + self.saved = copy.deepcopy(self.original) + ui = EditorUI([], ['PASSWORD', UserCancelled()], confirms=[True]) + result = recreation.edit_section(self.original, ui, 'environment') + self.assertIs(result, self.original) + self.assertIn('Premenná je v definícii kontajnera uvedená viackrát; pred úpravou ju skontrolujte', self.text(ui)) + + def test_invalid_variable_name_and_value_are_rejected_before_draft_is_returned(self): + for name, value, expected in (('INVALID NAME', None, 'Neplatný názov premennej'), + ('VISIBLE', 'bad\x00value', 'Hodnota obsahuje nepodporovaný znak')): + with self.subTest(name=name): + answers = [name] + ([value] if value is not None else []) + [UserCancelled()] + ui = EditorUI([], answers, confirms=[True, False]) + self.assertIs(recreation.edit_section(self.original, ui, 'environment'), self.original) + self.assertIn(expected, self.text(ui)) + + def test_new_secret_prompt_and_summary_do_not_expose_the_value(self): + candidate = copy.deepcopy(self.original) + ui = EditorUI([], ['NEW_SECRET', 'fixture-new-secret'], confirms=[True, True, False]) + recreation.edit_setting(candidate, ui, 'environment') + self.assertIn(('password', 'Nová hodnota pre NEW_SECRET'), ui.events) + self.assertNotIn('fixture-new-secret', self.text(ui)) + self.assertNotIn('fixture-new-secret', _deployment_summary_text(candidate['template'], candidate['deployment'])) + + def test_storage_picker_reports_free_space_not_customs_duty(self): + ui = EditorUI(['local-zfs']) + rows = [{'storage': name, 'type': 'zfspool', 'avail': 8 * 1024**3} + for name in ('local-zfs', 'other')] + with patch.object(installer.host, 'storages', return_value=rows): + self.assertEqual(installer.ask_storage(ui, 'Úložisko', 'rootdir', 'local-zfs'), 'local-zfs') + self.assertIn('8 GB voľné', self.text(ui)) + + def test_shared_host_path_prompt_changes_only_the_draft(self): + candidate = copy.deepcopy(self.original) + candidate['template']['proxmox']['installer_profile']['shared_directories'] = { + 'container_root': '/shares'} + ui = EditorUI(['host-bind'], ['media', '/fixture/nonexistent'], confirms=[True, False]) + with patch.object(installer.os.path, 'isdir', return_value=False): + recreation.edit_setting(candidate, ui, 'shares') + self.assertIn('Cesta na hostiteľovi pre /shares/media', self.text(ui)) + self.assertEqual(candidate['deployment']['mounts'][-1]['source'], '/fixture/nonexistent') + + def test_extra_path_cannot_cover_system_directories(self): + ui = EditorUI(['host-bind'], ['/etc', '/fixture/host', UserCancelled()], + confirms=[True, False]) + self.assertIs(recreation.edit_section(self.original, ui, 'paths'), self.original) + self.assertIn('Vlastná cesta nemôže skryť systémové adresáre', self.text(ui)) + + def test_network_gateway_explains_outbound_route(self): + ui = EditorUI(['static'], ['vmbr0', '192.0.2.42/24', ''], confirms=[]) + with patch.object(installer.host, 'bridges', return_value=[]), \ + patch.object(installer.host, 'address_answers', return_value=False): + recreation.edit_setting(copy.deepcopy(self.original), ui, 'network') + self.assertIn('Brána IPv4 (prázdne = bez odchádzajúcej trasy)', self.text(ui)) + + def test_incompatible_docker_mods_are_localized_without_gpu_or_image_probe(self): + self.original['template']['proxmox']['installer_profile']['hardware_acceleration'] = { + 'profiles': [{'id': 'gpu', 'environment': [{'name': 'DOCKER_MODS', 'value': 'mod'}]}]} + self.saved = copy.deepcopy(self.original) + ui = EditorUI([]) + self.assertIs(recreation.edit_section(self.original, ui, 'acceleration'), self.original) + self.assertIn('Docker Mods sú dostupné iba pre kompatibilné obrazy LinuxServer', self.text(ui)) + + def test_duplicate_usb_device_is_rejected_without_attaching_it(self): + self.original['deployment']['devices'] = [{'host_path': '/dev/ttyACM0'}] + self.saved = copy.deepcopy(self.original) + ui = EditorUI(['usb'], ['/dev/ttyACM0', UserCancelled()], confirms=[True]) + with patch.object(installer.host, 'usb_devices', return_value=[]): + self.assertIs(recreation.edit_section(self.original, ui, 'devices'), self.original) + self.assertIn('Toto zariadenie je už pripojené', self.text(ui)) + + def catalog_refresh(self, error=None, latest=None): + candidate = copy.deepcopy(self.original) + candidate['template']['container_contract']['image']['repository'] = 'example/app' + ui = EditorUI(['managed-volume'], ['local-zfs', '4'], confirms=[True]) + index = {'applications': [{'id': 'example', 'template_id': 'example-app'}]} + with patch.object(Catalog, 'load_index', return_value=index), \ + patch.object(Catalog, 'compose', side_effect=error, return_value=latest): + recreation.refresh_template(candidate, ui) + return candidate, ui + + def test_required_catalog_path_has_a_clear_persistence_prompt(self): + latest = copy.deepcopy(self.original['template']) + latest['container_contract']['image']['repository'] = 'example/app' + latest['container_contract']['volumes'] = [{'id': 'new', 'container_path': '/new-data'}] + candidate, ui = self.catalog_refresh(latest=latest) + self.assertIn('Aktuálna šablóna vyžaduje nové trvalé úložisko pre cestu: /new-data', self.text(ui)) + self.assertIn('Nové úložisko bude prázdne; existujúce údaje sa doň automaticky neprenesú.', self.text(ui)) + self.assertIn('Trvalé úložisko pre /new-data', self.text(ui)) + self.assertEqual(candidate['deployment']['mounts'][-1]['container_path'], '/new-data') + + def test_template_identity_change_is_a_localized_migration_error(self): + latest = copy.deepcopy(self.original['template']) + latest['container_contract']['image']['repository'] = 'different/app' + with self.assertRaisesRegex(ValueError, 'Aktuálna šablóna mení identitu šablóny alebo repozitár obrazu; je potrebná výslovná migrácia'): + self.catalog_refresh(latest=latest) + + def test_real_catalog_missing_file_error_is_localized_only_in_editor(self): + index = {'applications': [{'id': 'example', 'template_id': 'example-app'}]} + item = dict(index['applications'][0], template_family='curated-profile', curated_path='absent-template.json') + with patch.object(Catalog, 'load_index', return_value=index), patch.object(Catalog, 'find_item', return_value=item): + with self.assertRaisesRegex(ConversionError, "No template is available for 'example'"): + Catalog(ROOT / 'oci').compose('example') + with self.assertRaisesRegex(ConversionError, "Pre aplikáciu 'example' nie je dostupná šablóna"): + recreation.refresh_template(copy.deepcopy(self.original), EditorUI([])) + + def test_real_schema_diagnostic_preserves_field_paths_and_exception_type(self): + with self.assertRaises(ConversionError) as raw: + Catalog(ROOT / 'oci').validate({}) + self.assertTrue(str(raw.exception).startswith('La plantilla generada no cumple el esquema:')) + details = str(raw.exception).split(':', 1)[1] + with self.assertRaises(ConversionError) as localized: + self.catalog_refresh(error=raw.exception) + self.assertEqual(str(localized.exception), 'Vygenerovaná šablóna nezodpovedá schéme:' + details) + + def test_missing_index_entry_preserves_the_application_identifier(self): + with self.assertRaisesRegex(ConversionError, "Aplikácia 'example' nie je v indexe"): + self.catalog_refresh(error=ConversionError("The application 'example' is not in the index")) + + def test_english_missing_translation_and_unknown_diagnostics_are_preserved(self): + for message in ("No template is available for 'example'", "The application 'example' is not in the index", + 'La plantilla generada no cumple el esquema: field: required', 'unknown technical failure'): + for language, cache in (('en', {}), ('sk', {})): + with self.subTest(message=message, language=language), \ + patch.object(i18n, '_language', language), patch.object(i18n, '_cache', cache): + with self.assertRaises(ConversionError) as error: + self.catalog_refresh(error=ConversionError(message)) + self.assertEqual(str(error.exception), message) + + +if __name__ == '__main__': + unittest.main() diff --git a/scripts/global/remove-banner-pve-v3.sh b/scripts/global/remove-banner-pve-v3.sh index 92df1028..76df07b5 100644 --- a/scripts/global/remove-banner-pve-v3.sh +++ b/scripts/global/remove-banner-pve-v3.sh @@ -312,7 +312,7 @@ EOFAPT # Verify APT hook syntax apt-config dump >/dev/null 2>&1 || { - msg_warn "APT hook syntax issue, removing..." + msg_warn "$(translate "APT hook syntax issue, removing...")" rm -f "$APT_HOOK" } } diff --git a/scripts/global/repository_policy.py b/scripts/global/repository_policy.py index 95f40d68..00829730 100644 --- a/scripts/global/repository_policy.py +++ b/scripts/global/repository_policy.py @@ -7,8 +7,10 @@ repository API responses: they can contain subscription keys or credentials. """ import copy import json +from pathlib import Path import re import subprocess +import string import sys ENDPOINT = '/nodes/localhost/apt/repositories' @@ -26,6 +28,41 @@ PRODUCTS = { 'test': {'pbs-no-subscription', 'pbs-test', 'pbstest'}, 'ui': 'Administration > Repositories', 'ceph': False}, } +BASE = Path(__file__).resolve().parents[2] + + +def N_(text): + """Mark a CLI message without changing the policy's English exception.""" + return text + + +class PolicyError(ValueError): + def __init__(self, template, **params): + self.template = template + self.params = params + super().__init__(template.format(**params)) + + +def cli_error(error, product): + """Localize only PBS CLI diagnostics; policy callers retain English errors.""" + if product != 'pbs' or not isinstance(error, PolicyError): + return str(error) + try: + language = json.loads((BASE / 'config.json').read_text()).get('language', 'en') + if language not in ('sk', 'de', 'es', 'fr', 'it', 'pt', 'sv'): + return str(error) + catalog = json.loads((BASE / 'lang' / f'{language}.json').read_text()) + message = catalog.get(error.template) + if isinstance(message, str) and message.strip(): + fields = lambda text: {name for _, name, _, _ in string.Formatter().parse(text) if name is not None} + if fields(message) != fields(error.template) or any( + spec or conversion for _, _, spec, conversion in string.Formatter().parse(message) + ): + return str(error) + return message.format(**error.params) + except (OSError, ValueError, KeyError, IndexError, TypeError, AttributeError): + pass + return str(error) def run(args): @@ -43,7 +80,7 @@ def subscription_status(product='pve'): except (ValueError, AttributeError): status = None if status not in ('active', 'notfound', 'expired'): - raise ValueError('Subscription status is not unambiguously active, notfound or expired. Check proxmox-backup-manager subscription get locally; no repository changed.') + raise PolicyError(N_('Subscription status is not unambiguously active, notfound or expired. Check proxmox-backup-manager subscription get locally; no repository changed.')) return status # pvesubscription's CLI get printer emits sorted "key: value" lines, # including a secret key and server ID. Only parse the exact status line. @@ -110,12 +147,12 @@ def repository_state(suite, product='pve'): entries.append((file['path'], index, row)) return data, entries except (KeyError, TypeError, ValueError, IndexError) as exc: - raise ValueError(f"Proxmox APT repository inventory is invalid or reports parse errors. Fix sources in {p['ui']}; no repository changed.") from exc + raise PolicyError(N_('Proxmox APT repository inventory is invalid or reports parse errors. Fix sources in {ui}; no repository changed.'), ui=p['ui']) from exc def evaluate(suite, apply=False, product='pve'): if suite not in ('bookworm', 'trixie'): - raise ValueError('Unsupported Proxmox suite; no repository changed.') + raise PolicyError(N_('Unsupported Proxmox suite; no repository changed.')) p = PRODUCTS[product] data, entries = repository_state(suite, product) pve = [] @@ -139,8 +176,8 @@ def evaluate(suite, apply=False, product='pve'): ceph.append((path, index, row)) # Name the stale sources, never their URIs: those can carry credentials. if wrong_pve: - raise ValueError(f"This host runs {p['name']} on {suite}, but these {p['name']} repositories are for another suite: " - f"{'; '.join(wrong_pve)}. Disable or remove them in {p['ui']} and run the update again; no repository changed.") + raise PolicyError(N_('This host runs {name} on {suite}, but these {name} repositories are for another suite: {details}. Disable or remove them in {ui} and run the update again; no repository changed.'), + name=p['name'], suite=suite, details='; '.join(wrong_pve), ui=p['ui']) if wrong_ceph: raise ValueError(f"This host runs Proxmox VE on {suite}, but these Enterprise Ceph repositories are for another suite: " f"{'; '.join(wrong_ceph)}. Correct them in Node > Updates > Repositories before switching; no repository changed.") @@ -152,20 +189,20 @@ def evaluate(suite, apply=False, product='pve'): status = subscription_status(product) # fail closed before any write if status == 'active': if not pve: - raise ValueError(f"Host has an active subscription but no active {p['short']} repository. Configure its Enterprise source in {p['ui']}; no repository changed.") + raise PolicyError(N_('Host has an active subscription but no active {short} repository. Configure its Enterprise source in {ui}; no repository changed.'), short=p['short'], ui=p['ui']) return 'preserve' if not debian: - raise ValueError('No active Debian base repository for this suite; configure it in the Proxmox repository UI before continuing.') + raise PolicyError(N_('No active Debian base repository for this suite; configure it in the Proxmox repository UI before continuing.')) # No active product source or only inaccessible Enterprise. A mixed stanza # cannot be disabled without also disabling an unrelated component. disable = [item for item in pve if p['enterprise'] in item[2]['Components']] + ceph for _, _, row in disable: expected = {p['enterprise']} if p['enterprise'] in row['Components'] else {'enterprise'} if set(row['Components']) != expected: - raise ValueError('Enterprise shares an APT stanza with other components. Split it in the Proxmox repository UI; no repository changed.') + raise PolicyError(N_('Enterprise shares an APT stanza with other components. Split it in the Proxmox repository UI; no repository changed.')) handles = [r.get('handle') for r in data['standard-repos'] if r.get('handle') == 'no-subscription'] if len(handles) != 1: - raise ValueError('Proxmox no-subscription standard repository handle unavailable; no repository changed.') + raise PolicyError(N_('Proxmox no-subscription standard repository handle unavailable; no repository changed.')) if not apply: return 'offer' # Adopt a refreshed digest only after checking the complete expected @@ -192,11 +229,12 @@ def evaluate(suite, apply=False, product='pve'): for path, index, _ in disable for p, i, row in current): raise ValueError('Could not verify the switched repositories; inspect the Proxmox repository UI before retrying.') except ValueError as exc: - raise ValueError(f"Could not complete or verify the repository switch; changes may be partial and repository state is unknown. Inspect {p['ui']} before retrying; no automatic rollback was attempted.") from exc + raise PolicyError(N_('Could not complete or verify the repository switch; changes may be partial and repository state is unknown. Inspect {ui} before retrying; no automatic rollback was attempted.'), ui=p['ui']) from exc return 'changed' def main(): + product = 'pve' try: if len(sys.argv) not in (3, 4) or sys.argv[1] not in ('plan', 'apply') \ or (len(sys.argv) == 4 and sys.argv[3] not in PRODUCTS): @@ -204,7 +242,7 @@ def main(): product = sys.argv[3] if len(sys.argv) == 4 else 'pve' print(evaluate(sys.argv[2], apply=sys.argv[1] == 'apply', product=product)) except ValueError as exc: - print(str(exc), file=sys.stderr) + print(cli_error(exc, product), file=sys.stderr) return 1 return 0 diff --git a/scripts/global/update-pbs.sh b/scripts/global/update-pbs.sh index 54574676..80200ba7 100644 --- a/scripts/global/update-pbs.sh +++ b/scripts/global/update-pbs.sh @@ -52,7 +52,7 @@ update_pbs() { local available_space available_space=$(df /var/cache/apt/archives | awk 'NR==2 {print int($4/1024)}') if [ "$available_space" -lt 1024 ]; then - msg_error "$(translate "Insufficient disk space. Available: ${available_space}MB")" + msg_error "$(translate "Insufficient disk space. Available:") ${available_space}MB" return 1 fi @@ -149,7 +149,7 @@ update_pbs() { rm -f "$screen_capture" if [ $upgrade_exit_code -ne 0 ]; then - msg_error "$(translate "System upgrade failed. Check log: $log_file")" + msg_error "$(translate "System upgrade failed. Check log:") $log_file" echo "Finished: $(date -Iseconds) — upgrade failed (exit $upgrade_exit_code)" >> "$log_file" return 1 fi diff --git a/scripts/menus/menu_post_install.sh b/scripts/menus/menu_post_install.sh index d4e63cda..2f9696e6 100644 --- a/scripts/menus/menu_post_install.sh +++ b/scripts/menus/menu_post_install.sh @@ -63,13 +63,13 @@ confirm_automated_script() { if [[ "$PMX_ON_PBS" == true ]]; then script_info+="$(translate "This script will apply the following optimizations and advanced adjustments to your Proxmox Backup Server"):\n\n" - script_info+="• $(translate "Upgrade the system, offering the") \Z4no-subscription repository\Z0 $(translate "when the server has no subscription (you will be asked)")\n" + script_info+="• $(translate "Upgrade the system, offering the") \Z4$(translate "no-subscription repository")\Z0 $(translate "when the server has no subscription (you will be asked)")\n" else script_info+="$(translate "This script will apply the following optimizations and advanced adjustments to your Proxmox VE server"):\n\n" script_info+="• $(translate "Configure") \Z4free repositories\Z0 $(translate "and upgrade the system (disables the enterprise repo)")\n" fi - script_info+="• $(translate "Optionally remove") \Z4subscription banner\Z0 $(translate "from Proxmox web interface (you will be asked)")\n" - script_info+="• $(translate "Optimize") \Z4memory\Z0, \Z4kernel\Z0, $(translate "and") \Z4network\Z0 $(translate "for better performance and stability")\n" + script_info+="• $(translate "Optionally remove") \Z4$(translate "subscription banner")\Z0 $(translate "from Proxmox web interface (you will be asked)")\n" + script_info+="• $(translate "Optimize") \Z4$(translate "memory")\Z0, \Z4$(translate "kernel")\Z0, $(translate "and") \Z4$(translate "network")\Z0 $(translate "for better performance and stability")\n" script_info+="• $(translate "Install and configure") \Z4Log2RAM\Z0 $(translate "(only on SSD/NVMe) to protect your disk")\n" script_info+="• $(translate "Enable") \Z4ZFS autotrim\Z0 $(translate "on SSD/NVMe pools that support discard")\n" script_info+="• $(translate "Improve log rotation and limit log size to save space and extend disk life")\n" @@ -289,10 +289,10 @@ post_install_label() { echo "Proxmox VE Microcode" ;; "Proxmox Backup Server Post Install") - echo "Proxmox Backup Server Post Install" + translate "Proxmox Backup Server Post Install" ;; "Proxmox Backup Server Microcode") - echo "Proxmox Backup Server Microcode" + translate "Proxmox Backup Server Microcode" ;; "Community Scripts") translate "Community Scripts" diff --git a/scripts/post_install/auto_post_install.sh b/scripts/post_install/auto_post_install.sh index e11f131f..1602ad39 100644 --- a/scripts/post_install/auto_post_install.sh +++ b/scripts/post_install/auto_post_install.sh @@ -182,9 +182,9 @@ remove_subscription_banner() { # description: Patch the Proxmox web UI to suppress the subscription dialog and register a successful patch. if [[ "$PMX_ON_PBS" == true ]]; then stop_spinner - if ! whiptail --title "Proxmox Backup Server Subscription Banner Removal" \ + if ! whiptail --title "$(translate "Proxmox Backup Server Subscription Banner Removal")" \ --yesno "$(translate "Do you want to remove the Proxmox subscription banner from the Proxmox Backup Server web interface?")\n\n$(translate "Attention: Removing the subscription banner may cause issues in the web interface after a future update.")\n\n$(translate "If this happens, you can restore the backup from the 'Subscription Banner Removal' option in 'Uninstall optimizations'.")\n\n$(translate "Are you sure you want to continue?")" 14 75; then - msg_warn "Banner removal cancelled by user." + msg_warn "$(translate "Banner removal cancelled by user.")" return 1 fi if ! bash "$LOCAL_SCRIPTS/global/remove-banner-pve-v3.sh"; then diff --git a/scripts/post_install/customizable_post_install.sh b/scripts/post_install/customizable_post_install.sh index 72e1b86d..2ce24dc3 100644 --- a/scripts/post_install/customizable_post_install.sh +++ b/scripts/post_install/customizable_post_install.sh @@ -2574,7 +2574,7 @@ configure_zram_swap() { fi version="$(dpkg-query -W -f='${Version}' systemd-zram-generator 2>/dev/null)" if [[ -z "$version" ]]; then - failure="Cannot determine installed systemd-zram-generator version" + failure="$(translate "Cannot determine installed systemd-zram-generator version")" else if dpkg --compare-versions "$version" ge '1.2.0'; then supports_params=true @@ -2588,7 +2588,7 @@ configure_zram_swap() { msg_success "$(translate "ZRAM profile is already active")" return 0 fi - failure="Existing ZRAM profile is active but does not match its configuration" + failure="$(translate "Existing ZRAM profile is active but does not match its configuration")" fi if [[ -z "$failure" && "$previous_active" == true ]]; then if ! swapoff /dev/zram0; then @@ -2597,31 +2597,31 @@ configure_zram_swap() { fi state_mutated=true if ! systemctl stop dev-zram0.swap >/dev/null 2>&1; then - failure="Could not stop existing dev-zram0.swap" + failure="$(translate "Could not stop existing dev-zram0.swap")" fi fi if [[ -z "$failure" ]]; then state_mutated=true if ! install -d -m 755 "$(dirname "$config")"; then - failure="Could not create ZRAM generator directory" + failure="$(translate "Could not create ZRAM generator directory")" elif ! printf '%s\n' "$desired" | pmx_write_file "$config"; then - failure="Could not write ZRAM generator configuration" + failure="$(translate "Could not write ZRAM generator configuration")" fi fi if [[ -z "$failure" ]]; then old_umask="$(umask)" umask 077 if ! printf 'installed_by_proxmenux=%s\n' "$package_owned" | pmx_write_file "$marker"; then - failure="Could not write ZRAM package ownership state" + failure="$(translate "Could not write ZRAM package ownership state")" fi umask "$old_umask" [[ -f "$marker" ]] && chmod 600 "$marker" fi if [[ -z "$failure" ]]; then if ! systemctl daemon-reload || ! systemctl start dev-zram0.swap; then - failure="Could not activate dev-zram0.swap" + failure="$(translate "Could not activate dev-zram0.swap")" elif ! zram_profile_verify_active "$algorithm"; then - failure="Active ZRAM algorithm, capacity or swap sources did not match the profile" + failure="$(translate "Active ZRAM algorithm, capacity or swap sources did not match the profile")" fi fi if [[ -z "$failure" ]]; then diff --git a/scripts/post_install/uninstall-tools.sh b/scripts/post_install/uninstall-tools.sh index 91f90867..570a8bf3 100644 --- a/scripts/post_install/uninstall-tools.sh +++ b/scripts/post_install/uninstall-tools.sh @@ -1356,7 +1356,7 @@ show_uninstall_menu() { system_limits) desc="System Limits Increase";; entropy) desc="Entropy Generation (haveged)";; memory_settings) desc="Memory Settings Optimization";; - zram_swap) desc="ZRAM swap profile";; + zram_swap) desc="$(translate "ZRAM swap profile")";; kernel_panic) desc="Kernel Panic Configuration";; apt_ipv4) desc="APT IPv4 Force";; kexec) desc="kexec for quick reboots";; diff --git a/tests/lxc_updates/test_app_editor_errors.cjs b/tests/lxc_updates/test_app_editor_errors.cjs new file mode 100644 index 00000000..4484bb2d --- /dev/null +++ b/tests/lxc_updates/test_app_editor_errors.cjs @@ -0,0 +1,132 @@ +// Real transport templates and actual fetchApi, with no network/guest access. +const assert = require('node:assert/strict') +const fs = require('node:fs') +const path = require('node:path') +const vm = require('node:vm') +const {execFileSync} = require('node:child_process') +const root = path.resolve(__dirname, '../..') +const app = path.join(root, 'AppImage') +const ts = require(path.join(app, 'node_modules/typescript')) +function load(relative, extra = {}) { + const compiled = ts.transpileModule(fs.readFileSync(path.join(app, relative), 'utf8'), { + compilerOptions: {module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020}, reportDiagnostics: true, + }) + assert.deepEqual(compiled.diagnostics, []) + const context = {exports: {}, process: {env: {}}, console: {error() {}}, ...extra} + vm.runInNewContext(compiled.outputText, context) + return context.exports +} +const {localizeAppEditorError: localize} = load('lib/lxc-app-editor-errors.ts') +const catalogs = Object.fromEntries(['en', 'sk', 'de'].map(locale => [locale, + JSON.parse(fs.readFileSync(path.join(app, `messages/${locale}/common.json`)))])) +const translate = locale => (key, params = {}) => { + const lookup = data => key.split('.').reduce((item, segment) => item?.[segment], data) + const template = lookup(catalogs[locale]) ?? lookup(catalogs.en) + assert.equal(typeof template, 'string', 'Missing translation ' + key) + return template.replace(/\{(\w+)\}/g, (all, key) => params[key] ?? all) +} +// A locale without these keys must show the English backend text. +catalogs.missing = {} +const en = translate('en'), sk = translate('sk') +// Enumerate only pure validator ASTs; importing lxc_apps would access host state. +const contract = JSON.parse(execFileSync('python3', ['-c', String.raw` +import ast,json,re,typing,sys +tree=ast.parse(open(sys.argv[1]).read()) +names={'_err','_validate_command_argv','_validate_binary_args','_validate_ports','validate_config'} +ns={'re':re,'Any':typing.Any,'Optional':typing.Optional} +for node in tree.body: + if isinstance(node,ast.Assign) and len(node.targets)==1 and isinstance(node.targets[0],ast.Name) and node.targets[0].id.startswith('_'): + try: value=ast.literal_eval(node.value) + except (ValueError,TypeError): + if not (isinstance(node.value,ast.Call) and isinstance(node.value.func,ast.Attribute) and isinstance(node.value.func.value,ast.Name) and node.value.func.value.id=='re' and node.value.func.attr=='compile'): continue + args=[getattr(re,a.attr) if isinstance(a,ast.Attribute) and isinstance(a.value,ast.Name) and a.value.id=='re' else ast.literal_eval(a) for a in node.value.args] + value=re.compile(*args) + ns[node.targets[0].id]=value +functions=[n for n in tree.body if isinstance(n,ast.FunctionDef) and n.name in names] +exec(compile(ast.Module(body=functions,type_ignores=[]),'','exec'),ns) +messages=set() +context={**ns,'i':3,'p':8080,'field':'repo','e':'missing ], position 4\npattern: v?(test'} +for function in functions: + for n in ast.walk(function): + if isinstance(n,ast.Call) and isinstance(n.func,ast.Name) and n.func.id=='_err' and n.args and isinstance(n.args[0],(ast.Constant,ast.JoinedStr)): + messages.add(eval(compile(ast.Expression(n.args[0]),'','eval'),context)) +cases=[[],{}, {'name':'Test','installed_via':'file','file_path':'relative'}, + {'name':'Test','installed_via':'file','file_path':'/fiction/version','file_regex':'['}, + {'name':'Test','installed_via':'command','command_argv':['test','bad\narg']}, + {'name':'Test','ports':[{'port':8080},{'port':8080}]}, + {'name':'Test','installed_via':'manual'}] +errors=[] +for case in cases: + ok,error=ns['validate_config'](case) + assert not ok + errors.append(error) +print(json.dumps({'templates':sorted(messages),'actual':errors})) +`, path.join(app, 'scripts/lxc_apps.py')], {encoding: 'utf8'})) +assert.equal(contract.templates.length, 69, 'Update the contract inventory when validation changes') +for (const message of [...contract.templates, ...contract.actual]) { + assert.equal(localize(message, en), message, 'EN must preserve the exact backend message') + assert.notEqual(localize(message, sk), message, 'Untranslated backend validation: ' + message) + assert.equal(localize(message, translate('missing')), message, 'Missing locale falls back to EN') +} +// Every supported message, including detector errors, preserves interpolated data. +const enErrors = catalogs.en.vmLxc.appEditor.errors, skErrors = catalogs.sk.vmLxc.appEditor.errors +assert.deepEqual(Object.keys(enErrors).sort(), Object.keys(skErrors).sort()) +for (const [key, template] of Object.entries(enErrors)) { + const params = Object.fromEntries([...template.matchAll(/\{(\w+)\}/g)].map(([, name]) => [name, + ['index','port','max','code'].includes(name) ? '17' : name === 'repo' ? 'owner/project' : "detail /opt/app --version {literal} \nnext line"])) + const message = en(`vmLxc.appEditor.errors.${key}`, params) + assert.equal(localize(message, en), message) + assert.equal(localize(message, sk), sk(`vmLxc.appEditor.errors.${key}`, params), key) +} +assert.equal(localize('binary_args[4] exceeds 256 chars', sk), 'Argument binary_args[4] môže mať najviac 256 znakov.') +assert.equal(localize('tag_regex is not a valid regex: [bad]\nposition 4', sk), 'Regulárny výraz pre tagy (tag_regex) je neplatný: [bad]\nposition 4') +for (const message of ['unknown /opt/app --version', 'myapp: not found', 'sh: myapp: not found', '', 'file_regex is required extra', 'prefix file_regex is required', 'binary_args[-1] exceeds 4 chars']) { + assert.equal(localize(message, sk), message, 'Unknown detail must remain intact') +} +for (const empty of [null, undefined, '']) assert.equal(localize(empty, sk), '') +assert.equal(catalogs.sk.vmLxc.appEditor.commandPlaceholder, catalogs.en.vmLxc.appEditor.commandPlaceholder) +assert.equal(catalogs.sk.vmLxc.appEditor.regexPlaceholderVersion, catalogs.en.vmLxc.appEditor.regexPlaceholderVersion) +async function main() { + const {fixture, flatten, text} = require('./test_native_app_discovery_ui.cjs') + const recorded = {id: 'fiction', name: 'Fixture', installed_via: 'file', file_path: 'relative', ports: [], state: {}} + for (const locale of ['en', 'sk']) { + const t = translate(locale) + const f = fixture({apps: [recorded], translate: t, apiError: 'file_path is required and must be an absolute path'}) + f.render(); await f.settle() + const mode = flatten(f.tree()).find(n => n.type === 'button' && text(n).trim() === t('vmLxc.appEditor.editButton')) + assert.ok(mode); mode.props.onClick(); f.render() + const action = key => flatten(f.tree()).find(n => n.type === 'button' && text(n).trim() === t('vmLxc.appEditor.' + key)) + await action('removeButton').props.onClick(); f.render() + assert.deepEqual(f.confirmPrompts, [t('vmLxc.appEditor.confirmRemove')]) + assert.equal(f.calls.filter(c => c.method === 'DELETE').length, 0) + assert.equal(f.cachedWrites.length, 0, 'decline leaves cache untouched') + await action('editFieldsButton').props.onClick(); f.render() + await f.button('saveButton').props.onClick(); f.render() + assert.ok(text(f.tree()).includes(t('vmLxc.appEditor.errors.filePath'))) + assert.equal(flatten(f.tree()).find(n => n.props?.id === 'app-file-path').props.value, 'relative') + assert.equal(f.calls.filter(c => c.method === 'PUT').length, 1) + assert.equal(f.cachedWrites.length, 0, 'failed save preserves cached record') + await f.button('testDetectorButton').props.onClick(); f.render() + assert.ok(text(f.tree()).includes(t('vmLxc.appEditor.errors.filePath'))) + const before = f.calls.filter(c => c.method && c.method !== 'GET').length + f.button('cancelButton').props.onClick(); f.render() + assert.equal(f.calls.filter(c => c.method && c.method !== 'GET').length, before) + assert.ok(text(f.tree()).includes('Fixture')) + } + let requests = 0 + const backend = 'file_path is required and must be an absolute path' + const {fetchApi} = load('lib/api-config.ts', {fetch: async () => { + requests++ + return {ok: false, status: 400, statusText: 'BAD REQUEST', headers: {get: () => 'application/json'}, json: async () => ({error: backend})} + }}) + for (const [method, route] of [['POST','/api/vms/999999/apps'], ['PUT','/api/vms/999999/apps/fake'], ['POST','/api/vms/999999/apps/test']]) { + try {await fetchApi(route, {method, body: '{}'}); assert.fail('Expected validation failure')} + catch (error) { + assert.equal(error.message, backend) + assert.equal(localize(error.message, sk), 'Zadaj úplnú cestu k súboru (file_path), začínajúcu lomkou /.') + } + } + assert.equal(requests, 3) + console.log(`PASS app editor: ${contract.templates.length} backend validation templates, ${Object.keys(enErrors).length} EN/SK rules, real fetchApi POST/PUT/test fixtures; external calls 0`) +} +main().catch(error => {console.error(error); process.exitCode = 1}) diff --git a/tests/lxc_updates/test_native_app_discovery_ui.cjs b/tests/lxc_updates/test_native_app_discovery_ui.cjs index 5f705d3f..4baffcc2 100644 --- a/tests/lxc_updates/test_native_app_discovery_ui.cjs +++ b/tests/lxc_updates/test_native_app_discovery_ui.cjs @@ -23,9 +23,10 @@ const candidate = { evidence: [{kind: 'installation_file', value: '/opt/handmade/server'}], default_ports: [], } -function fixture({nativeCandidate = candidate, dockerCandidate = null, apps = []} = {}) { +function fixture({nativeCandidate = candidate, dockerCandidate = null, apps = [], translate, + confirmAccepted = false, apiError = null, detectorResult = null} = {}) { let cursor = 0, tree, props, effects = [], states = [], refs = [], effectStates = [], memoStates = [] - const calls = [], cachedWrites = [] + const calls = [], cachedWrites = [], confirmPrompts = [] let native = {vmid: 101, status: 'not_scanned', candidates: [], stale: false} let holdScan, scanGate, holdSave, saveGate, scanStatus = 'complete', scanIssues let dockerStatus = "complete", dockerCached = {vmid:101,status:"not_scanned",candidates:[],stale:false} @@ -56,6 +57,8 @@ function fixture({nativeCandidate = candidate, dockerCandidate = null, apps = [] } const api = async (url, options = {}) => { calls.push({url, ...options}) + if (apiError && options.method && options.method !== 'GET') throw new Error(apiError) + if (detectorResult && url.endsWith('/apps/test')) return detectorResult if (url.endsWith('/logo-discovery')) { if (iconGate) await iconGate if (iconError) throw iconError @@ -96,12 +99,20 @@ function fixture({nativeCandidate = candidate, dockerCandidate = null, apps = [] } const exports = {} vm.runInNewContext(compiled.outputText, {exports, console, setTimeout, clearTimeout, AbortController, + confirm: prompt => {confirmPrompts.push(prompt); return confirmAccepted}, require: name => { if (name === 'react') return react if (name === 'react/jsx-runtime') return {jsx: (type, props) => ({type, props}), jsxs: (type, props) => ({type, props})} if (name.includes('api-config')) return {fetchApi: api} + if (name.includes('lxc-app-editor-errors')) { + const context = {exports: {}} + vm.runInNewContext(ts.transpileModule(fs.readFileSync(path.join(root, 'lib/lxc-app-editor-errors.ts'), 'utf8'), { + compilerOptions: {module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020}, + }).outputText, context) + return context.exports + } if (name.includes('lxc-apps-cache')) return cache - if (name.includes('i18n/provider')) return {useT: () => (key, values) => key + (values ? JSON.stringify(values) : '')} + if (name.includes('i18n/provider')) return {useT: () => translate || ((key, values) => key + (values ? JSON.stringify(values) : ''))} if (name.includes('category-color')) return {useIsLightTheme: () => false, categoryChipStyle: () => ({})} if (name.includes('category-label')) return {getCategoryLabel: value => value} return new Proxy({}, {get: (_, key) => key}) @@ -136,11 +147,12 @@ function fixture({nativeCandidate = candidate, dockerCandidate = null, apps = [] } const settle = async () => {for (let i = 0; i < 6; i++) await Promise.resolve(); render()} const button = key => { - const match = flatten(tree).find(n => n.type === 'Button' && text(n).includes('vmLxc.appEditor.' + key)) + const label = translate ? translate('vmLxc.appEditor.' + key) : 'vmLxc.appEditor.' + key + const match = flatten(tree).find(n => n.type === 'Button' && text(n).includes(label)) assert.ok(match, 'Missing button ' + key) return match } - return {render, renderParent, settle, calls, cachedWrites, button, tree: () => tree, bundleReads: () => bundleReads, + return {render, renderParent, settle, calls, cachedWrites, confirmPrompts, button, tree: () => tree, bundleReads: () => bundleReads, holdIcon: () => {iconGate = new Promise(resolve => {resolveIcon = resolve})}, resolveIcon: () => resolveIcon(), setIconResult: value => {iconResult = value}, setIconError: value => {iconError = value}, diff --git a/tests/test_host_backup_messages.cjs b/tests/test_host_backup_messages.cjs new file mode 100644 index 00000000..852979e0 --- /dev/null +++ b/tests/test_host_backup_messages.cjs @@ -0,0 +1,103 @@ +// Exercise the shipped error adapter and actual HostBackup handlers with a fake transport. +const assert = require('node:assert/strict'), fs = require('node:fs'), vm = require('node:vm'); +const { ts, read, compile, translator } = require('./backup_i18n_seam.cjs'); +const library = { exports: {} }; +vm.runInNewContext(compile(read('lib/host-backup-messages.ts')), library); +const { hostBackupErrorText } = library.exports; +// Independently read the real API's literal/f-string contracts without importing +// Flask or running any route, host probe, script or persistence operation. +const contracts = JSON.parse(require('node:child_process').execFileSync('python3', ['-I', '-B', '-c', ` +import ast,json,sys +tree=ast.parse(open(sys.argv[1]).read()) +def messages(node): + if isinstance(node,ast.Constant) and isinstance(node.value,str): return [node.value] + if isinstance(node,ast.JoinedStr): return [''.join(part.value if isinstance(part,ast.Constant) else 'PARAMETER' for part in node.values)] + if isinstance(node,ast.BoolOp): return [text for child in node.values for text in messages(child)] + return [] +result=set() +for function in tree.body: + if isinstance(function,ast.FunctionDef) and function.name.startswith(('api_host_backups_','api_host_restore')): + for node in ast.walk(function): + if isinstance(node,ast.Dict): + for key,value in zip(node.keys,node.values): + if isinstance(key,ast.Constant) and key.value=='error': result.update(messages(value)) +print(json.dumps(sorted(result))) +`, 'AppImage/scripts/flask_server.py'], { encoding: 'utf8' })); +const flatten = n => !n || typeof n === 'boolean' ? [] : Array.isArray(n) ? n.flatMap(flatten) + : typeof n === 'object' ? [n, ...flatten(n.props?.children)] : [n]; +const text = n => flatten(n).filter(n => typeof n === 'string' || typeof n === 'number').join(''); + +function fixture(locale) { + let cursor = 0, slots = [], tree, failure = 'path must be absolute', mutations = 0; + const calls = [], t = translator(locale); + const jsx = (type, props) => typeof type === 'function' ? type(props) : { type, props }; + const hooks = { useState(initial) { const i = cursor++; if (!(i in slots)) slots[i] = initial; return [slots[i], value => { slots[i] = value; }]; } }; + const requireModule = name => { + if (name === 'react') return hooks; + if (name === 'react/jsx-runtime') return { jsx, jsxs: jsx }; + if (name === 'swr') return { default: () => ({ data: { paths: [{ path: '/kept' }] }, mutate: () => { mutations++; } }) }; + if (name.includes('i18n/provider')) return { useT: () => t }; + if (name.endsWith('host-backup-messages')) return library.exports; + if (name.endsWith('api-config')) return { fetchApi: async (url, options) => { calls.push({ url, ...options }); if (failure) throw new Error(failure); return { status: 'ok' }; } }; + return new Proxy({}, { get: (_, key) => key }); + }; + const source = read('components/host-backup.tsx') + '\nexports.ExtraPathsSection = ExtraPathsSection;'; + const module = { exports: {} }; + vm.runInNewContext(ts.transpileModule(source, { compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020, jsx: ts.JsxEmit.ReactJSX } }).outputText, + { exports: module.exports, require: requireModule, Error, console }); + return { calls, t, render() { cursor = 0; tree = module.exports.ExtraPathsSection(); return tree; }, text: () => text(tree), + input: () => flatten(tree).find(n => n.type === 'Input'), + add: () => flatten(tree).find(n => n.type === 'Button' && text(n).includes(t('backup.actions.addPath'))), + fail: message => { failure = message; }, mutations: () => mutations }; +} + +(async () => { + assert.ok(contracts.length > 100, 'real HostBackup error contracts discovered'); + for (const message of contracts) { + const translated = hostBackupErrorText(message, translator('sk')); + assert.notEqual(translated, message, 'application-owned message must be localized: ' + message); + assert.ok(!translated.includes('backup.apiErrors.'), 'every mapped key has a real Slovak value'); + assert.equal(hostBackupErrorText(message, translator('missing')), hostBackupErrorText(message, translator('en')), 'missing locale uses English'); + } + for (const locale of ['en', 'sk', 'missing']) { + const t = translator(locale); + assert.equal(hostBackupErrorText(new Error('path must be absolute'), t), t('backup.apiErrors.absolutePath')); + assert.equal(hostBackupErrorText({ message: 'this path is already configured' }, t), t('backup.apiErrors.pathConfigured')); + assert.equal(hostBackupErrorText('job already exists: test_1', t), t('backup.apiErrors.jobExists', { value: 'test_1' })); + const raw = 'tool failed: path must be absolute'; + assert.equal(hostBackupErrorText(raw, t), raw, 'external diagnostics must not be partially matched or discarded'); + const long = 'path does not exist on this host: ' + 'x'.repeat(20000); + assert.equal(hostBackupErrorText(long, t), long, 'large diagnostics preserved without pattern matching'); + for (const unknown of ['constructor', '__proto__', 'toString', 'future backend message']) assert.equal(hostBackupErrorText(unknown, t), unknown); + for (const invalid of [null, undefined, {}, 23]) assert.equal(hostBackupErrorText(invalid, t), t('backup.apiErrors.requestFailed')); + const unsafe = '{backup.actions.run}'; + assert.equal(hostBackupErrorText('path does not exist on this host: ' + unsafe, t), t('backup.apiErrors.pathMissing', { value: unsafe }), 'captured paths remain literal data'); + const f = fixture(locale); f.render(); + assert.equal(f.add().props.disabled, true); + await f.add().props.onClick(); assert.equal(f.calls.length, 0, 'blank path causes no request'); + f.input().props.onChange({ target: { value: 'relative-path' } }); f.render(); await f.add().props.onClick(); f.render(); + assert.equal(f.calls.length, 1); assert.equal(f.calls[0].url, '/api/host-backups/extra-paths'); + assert.equal(f.calls[0].method, 'POST'); assert.deepEqual(JSON.parse(f.calls[0].body), { path: 'relative-path' }); + assert.equal(f.input().props.value, 'relative-path'); assert.equal(f.mutations(), 0, 'rejected input preserves state and does not refresh as success'); + assert.ok(f.text().includes(t('backup.apiErrors.absolutePath'))); assert.ok(f.text().includes('/kept')); + f.fail('future backend message'); await f.add().props.onClick(); f.render(); assert.ok(f.text().includes('future backend message')); + f.fail(null); await f.add().props.onClick(); f.render(); assert.equal(f.input().props.value, ''); assert.equal(f.mutations(), 1); + } + // Adapter has no effect on the server's CLI/API/persistence contracts. + const host = read('components/host-backup.tsx'); + const ast = ts.createSourceFile('host-backup.tsx', host, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX), encryptionCatches = []; + function visit(node) { if (ts.isCatchClause(node) && node.block.getText(ast).includes('err.body?.tool_output')) encryptionCatches.push(node.block); ts.forEachChild(node, visit); } + visit(ast); assert.equal(encryptionCatches.length, 2, 'scheduled and manual backup encryption paths both checked'); + for (const locale of ['en', 'sk', 'missing']) for (const block of encryptionCatches) { + let displayed, effects = 0; + const code = ts.transpileModule('function run(e) '+block.getText(ast)+'; run(error);', { compilerOptions: { target: ts.ScriptTarget.ES2020 } }).outputText; + const t = translator(locale), error = Object.assign(new Error('failed to create PBS encryption keyfile'), { body: { tool_output: 'EXTERNAL TOOL DIAGNOSTIC' } }); + vm.runInNewContext(code, { error, t, hostBackupErrorText, setError: value => { displayed = value; }, setPbsImportBusy: () => {}, setSubmitting: () => {}, onCreated: () => effects++ }); + assert.ok(displayed.includes(hostBackupErrorText(error, t)) && displayed.includes('EXTERNAL TOOL DIAGNOSTIC')); + assert.ok(!displayed.includes('{error}') && !displayed.includes('{detail}'), 'error interpolation must not leave an unresolved placeholder'); + assert.equal(effects, 0); + } + assert.ok(!host.includes('e instanceof Error ? e.message : String(e)'), 'all HostBackup catch consumers use the adapter'); + assert.ok(!host.includes('{e.error}') && !host.includes('{calendarPreview.error}'), 'structured error consumers use the adapter too'); + console.log('PASS: '+contracts.length+' real API contracts, HostBackup actual extra-path handlers, EN/SK/fallback, 0 calls for blank, rejected input/state, success, literal parameters and unknown diagnostics'); +})().catch(error => { console.error(error); process.exitCode = 1; }); diff --git a/tests/test_monitor_links_i18n.cjs b/tests/test_monitor_links_i18n.cjs new file mode 100644 index 00000000..46c566f4 --- /dev/null +++ b/tests/test_monitor_links_i18n.cjs @@ -0,0 +1,133 @@ +// Run the shipped translation adapter, transport and both dialog components. +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const vm = require('node:vm'); +const ts = require('typescript'); +const compile = source => ts.transpileModule(source, {compilerOptions: { + module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020, jsx: ts.JsxEmit.ReactJSX, +}}).outputText; +const translations = Object.fromEntries(['en', 'sk'].map(locale => [locale, JSON.parse(fs.readFileSync(`AppImage/messages/${locale}/common.json`))])); +const translate = locale => (key, params = {}) => { + const value = key.split('.').reduce((tree, part) => tree?.[part], translations[locale]); + assert.equal(typeof value, 'string', key); + return value.replace(/\{(\w+)\}/g, (match, key) => params[key] ?? match); +}; +const adapter = {exports: {}}; +vm.runInNewContext(compile(fs.readFileSync('AppImage/lib/monitor-link-errors.ts', 'utf8')), adapter); +const {monitorLinkError} = adapter.exports; +const codes = { + monitor_link_address_required: 'addressRequired', monitor_link_invalid_address: 'invalidAddress', + monitor_link_address_credentials: 'addressCredentials', monitor_link_invalid_port: 'invalidPort', + monitor_link_invalid_request: 'invalidRequest', monitor_link_duplicate: 'duplicate', + monitor_link_not_found: 'notFound', monitor_link_detected_remove: 'detectedRemove', +}; +const failure = (code, params) => Object.assign(new Error('RAW ENGLISH SECRET DETAILS'), {body: {error: 'RAW ENGLISH SECRET DETAILS', code, params}}); + +const flatten = tree => !tree || typeof tree === 'boolean' ? [] : Array.isArray(tree) ? tree.flatMap(flatten) + : typeof tree === 'object' ? [tree, ...flatten(tree.props?.children)] : [tree]; +const text = tree => flatten(tree).filter(n => typeof n === 'string' || typeof n === 'number').join(''); +const jsx = (type, props) => ({type, props}); +const source = compile(fs.readFileSync('AppImage/components/monitor-switcher.tsx', 'utf8') + '\nexport {ManageLinksDialog};'); + +function fixture({locale = 'sk', links = [], origin = false, loadError = false, loading = false} = {}) { + let slots = [], cursor = 0, effects = [], tree, responseError, refreshFailure = false; + const calls = [], refreshes = [], storage = new Map(); + const candidates = [{u: 'https://other.test', n: 'Other', p: 'pve'}]; + const carried = Buffer.from(JSON.stringify(candidates)).toString('base64url'); + const location = {origin: 'https://current.test', hostname: 'current.test', pathname: '/', hash: '', + search: origin ? `?pmx_from=https%3A%2F%2Fsource.test&pmx_name=Source&pmx_links=${carried}` : ''}; + const react = { + useState(initial) {const slot = cursor++; if (!(slot in slots)) slots[slot] = typeof initial === 'function' ? initial() : initial; + return [slots[slot], value => {slots[slot] = typeof value === 'function' ? value(slots[slot]) : value;}];}, + useEffect(fn, deps) {const slot = cursor++; const old = slots[slot]; + if (!old || deps.some((dep, i) => dep !== old[i])) effects.push(fn); + slots[slot] = deps; + }, + }; + const exported = {}; + vm.runInNewContext(source, {exports: exported, URL, URLSearchParams, escape, unescape, + atob: value => Buffer.from(value, 'base64').toString('binary'), btoa: value => Buffer.from(value, 'binary').toString('base64'), + window: {location, history: {replaceState() {location.search = ''}}}, + sessionStorage: {getItem: key => storage.get(key) || null, setItem: (key, value) => storage.set(key, value)}, + require(name) { + if (name === 'react') return react; + if (name === 'react/jsx-runtime') return {jsx, jsxs: jsx, Fragment: 'Fragment'}; + if (name === 'swr') return {default: () => ({data: {self: {name: 'Current', product: 'pve'}, links}, error: loadError, isLoading: loading, + mutate: async () => refreshes.push('all')}), mutate: async key => {refreshes.push(key); if (refreshFailure) throw new Error('RAW REFRESH ERROR');}}; + if (name.includes('i18n/provider')) return {useT: () => translate(locale)}; + if (name.includes('monitor-link-errors')) return {monitorLinkError}; + if (name.includes('api-config')) return {fetchApi: async (path, options) => {calls.push({path, ...options}); if (responseError) throw responseError; return {success: true};}}; + return new Proxy({}, {get: (_, key) => key}); + }, + }); + return { + render(component = 'ManageLinksDialog') {cursor = 0; effects = []; tree = exported[component]({open: true, onOpenChange() {}, nodeName: 'Current'}); effects.forEach(fn => fn()); return tree;}, + button(label) {const node = flatten(tree).find(n => n.type === 'Button' && (text(n) === label || n.props['aria-label'] === label)); assert.ok(node, label); return node;}, + input(id) {const node = flatten(tree).find(n => n.type === 'Input' && (n.props.id === id || n.props['aria-label'] === id)); assert.ok(node, id); return node;}, + nodes: () => flatten(tree), text: () => text(tree), fail: error => {responseError = error;}, failRefresh: () => {refreshFailure = true;}, calls, refreshes, storage, + }; +} + +async function main() { + for (const locale of ['en', 'sk']) { + const t = translate(locale); + for (const [code, key] of Object.entries(codes)) assert.equal(monitorLinkError(failure(code), t), t(`monitorLinks.errors.${key}`)); + assert.equal(monitorLinkError(failure('monitor_link_limit', {count: 64}), t), t('monitorLinks.errors.limit', {count: 64})); + for (const error of [null, undefined, 'raw', new Error('raw'), {body: null}, {body: {}}, + ...['constructor', '__proto__', 'toString', 'unknown', 'monitor_links_save_failed'].map(code => failure(code)), + ...[undefined, null, '64', 0, -1, 1.5, NaN, Infinity, 2 ** 54].map(count => failure('monitor_link_limit', {count}))]) { + assert.equal(monitorLinkError(error, t), t('monitorLinks.saveFailed')); + } + const f = fixture({locale, links: [{key: 'manual:saved', name: 'Saved', url: 'https://saved.test', manual: true}]}); + f.render(); f.button(t('monitorLinks.changeAddress')).props.onClick(); f.render(); + f.input(t('monitorLinks.address')).props.onChange({target: {value: 'https://unsaved.test'}}); f.render(); + f.button(t('monitorLinks.cancel')).props.onClick(); f.render(); + assert.equal(f.calls.length, 0, 'Cancel must not write'); + f.button(t('monitorLinks.changeAddress')).props.onClick(); f.render(); + assert.equal(f.input(t('monitorLinks.address')).props.value, 'https://saved.test', 'Cancel discards address draft'); + f.input(t('monitorLinks.address')).props.onChange({target: {value: 'https://changed.test'}}); f.render(); + await f.button(t('monitorLinks.save')).props.onClick(); f.render(); + assert.equal(f.calls[0].method, 'PATCH'); assert.deepEqual(JSON.parse(f.calls[0].body), {url: 'https://changed.test'}); + assert.equal(f.button(t('monitorLinks.add')).props.disabled, true, 'Blank address cannot be submitted'); + f.input('monitor-link-url').props.onChange({target: {value: 'ftp://bad.test'}}); f.render(); + f.fail(failure('monitor_link_invalid_address')); await f.button(t('monitorLinks.add')).props.onClick(); f.render(); + assert.ok(f.text().includes(t('monitorLinks.errors.invalidAddress'))); + assert.equal(f.input('monitor-link-url').props.value, 'ftp://bad.test', 'Failure retains draft'); + assert.ok(!f.text().includes('RAW ENGLISH')); + f.fail(new Error('raw network details')); await f.button(t('monitorLinks.remove')).props.onClick(); f.render(); + assert.ok(f.text().includes(t('monitorLinks.saveFailed'))); + const failedRead = fixture({locale, loadError: new Error('raw')}); failedRead.render(); + assert.ok(failedRead.text().includes(t('monitorLinks.loadFailed'))); + const pendingRead = fixture({locale, loading: true}); pendingRead.render(); + assert.ok(pendingRead.text().includes(t('monitorLinks.checking'))); + + const declined = fixture({locale, origin: true}); + for (let n = 0; n < 3; n++) declined.render('MonitorSwitcher'); + declined.button(t('monitorLinks.notNow')).props.onClick(); declined.render('MonitorSwitcher'); + assert.equal(declined.calls.length, 0, 'Not now must not write'); + const carried = fixture({locale, origin: true}); + for (let n = 0; n < 3; n++) carried.render('MonitorSwitcher'); + const boxes = carried.nodes().filter(n => n.type === 'Checkbox'); assert.equal(boxes.length, 2); + boxes[1].props.onCheckedChange(false); carried.render('MonitorSwitcher'); + carried.fail(failure('monitor_link_duplicate')); + carried.failRefresh(); + await carried.button(t('monitorLinks.addSelected')).props.onClick(); carried.render('MonitorSwitcher'); + assert.equal(carried.calls.length, 1, 'Only selected origin is attempted'); + assert.equal(JSON.parse(carried.calls[0].body).url, 'https://source.test'); + assert.ok(carried.text().includes(t('monitorLinks.errors.duplicate'))); + assert.equal(carried.refreshes.length, 1, 'Failed/partially successful batch refreshes the visible list'); + } + // Real authenticated transport preserves additive fields for the adapter. + const api = {exports: {}, process: {env: {}}, fetch: async () => new Response(JSON.stringify({error: 'Original English error', code: 'monitor_link_duplicate'}), {status: 400, headers: {'Content-Type': 'application/json'}})}; + vm.runInNewContext(compile(fs.readFileSync('AppImage/lib/api-config.ts', 'utf8')), api); + try {await api.exports.fetchApi('/api/monitor-links', {method: 'POST'}); assert.fail('expected rejection');} + catch (error) {assert.equal(error.status, 400); assert.equal(error.message, 'Original English error'); assert.equal(monitorLinkError(error, translate('sk')), translations.sk.monitorLinks.errors.duplicate);} + const en = translations.en.monitorLinks, sk = translations.sk.monitorLinks; + assert.deepEqual(Object.keys(en.errors).sort(), Object.keys(sk.errors).sort()); + for (const key of Object.keys(en.errors)) { + assert.ok(sk.errors[key]); + assert.deepEqual(en.errors[key].match(/\{\w+\}/g), sk.errors[key].match(/\{\w+\}/g), key); + } + console.log('PASS: EN/SK known/unknown errors, real transport, both dialogs, Cancel/Not now zero writes, draft persistence, selected-only batch, localized loading/failure'); +} +main().catch(error => {console.error(error); process.exitCode = 1;}); diff --git a/tests/test_oci_update_cancellation.cjs b/tests/test_oci_update_cancellation.cjs new file mode 100644 index 00000000..b91e77e2 --- /dev/null +++ b/tests/test_oci_update_cancellation.cjs @@ -0,0 +1,157 @@ +// Execute the real WebSocket handlers and the OCI caller's actual close callback. +const assert = require('node:assert/strict'), vm = require('node:vm'); +const {ts,read,compile,translator,catalogs} = require('./backup_i18n_seam.cjs'); +const moduleScope = {exports:{}}; +vm.runInNewContext(compile(read('lib/script-completion.ts')), moduleScope); +const completion = moduleScope.exports; +const source = ts.createSourceFile('modal.tsx', read('components/script-terminal-modal.tsx'), ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX); +const handlers = []; let messageCallback,reconnectCallback; +function walk(node) { + if (ts.isBinaryExpression(node) && node.left.getText(source) === 'ws.onmessage') handlers.push(node.right); + if (ts.isVariableDeclaration(node) && node.name.getText(source) === 'getCompletionMessage') messageCallback = node.initializer.arguments[0]; + if (ts.isVariableDeclaration(node) && node.name.getText(source) === 'attemptReconnect') reconnectCallback = node.initializer.arguments[0]; + ts.forEachChild(node, walk); +} +walk(source); +assert.equal(handlers.length,2,'initial and reconnect handlers'); +assert.ok(messageCallback); +function executable(node, file, scope) { + const local = {...scope,exports:{}}; + vm.runInNewContext(compile('exports.fn = '+node.getText(file)+';'),local); + return local.exports.fn; +} +function fixture(handler, locale, optedIn=true) { + const writes=[], callbacks=[], state={closed:0}; + const t=translator(locale), terminal={write:s=>writes.push(s),writeln:s=>writes.push(s)}; + const shared={...completion, cancelledExitCode:optedIn?6:undefined,t, + completedSuccessfullyMessage:undefined,completedWithErrorMessage:undefined}; + const getCompletionMessage=executable(messageCallback,source,shared); + const scope={...shared,getCompletionMessage,term:terminal,termRef:{current:terminal}, + completionReceivedRef:{current:false},onCompleteRef:{current:code=>callbacks.push(code)}, + setIsComplete:v=>state.complete=v,ws:{readyState:1,close:()=>state.closed++},WebSocket:{OPEN:1}, + setIsWaitingNextInteraction:()=>{},waitingTimeoutRef:{current:null},clearTimeout:()=>{}, + setCurrentInteraction:()=>{}}; + return {receive:executable(handler,source,scope),writes,callbacks,state,t,scope}; +} +let scenarios=0; +for (const handler of handlers) for (const locale of ['en','sk']) for (const frame of ['raw','json']) { + for (const [code,optedIn,kind] of [[6,true,'cancelled'],[6,false,'error'],[1,true,'error'],[0,true,'success'],[-1,true,'error']]) { + const f=fixture(handler,locale,optedIn); + const data=frame==='raw'?`\r\n[Script exited with code ${code}]\r\n`:JSON.stringify({type:'script_complete',exit_code:code}); + f.receive({data}); + assert.deepEqual(f.callbacks,[code]); assert.equal(f.state.closed,1); + const rendered=f.writes.join(''); + if(kind==='cancelled') { + assert.ok(rendered.includes(f.t('scriptTerminal.cancelled'))); + assert.ok(rendered.includes('\x1b[36m')); + assert.ok(rendered.startsWith('\x1bc'),'cancel resets the obsolete dialog in the queued output'); + assert.ok(!rendered.includes('Script exited with code')); + assert.ok(!rendered.includes('\x1b[31m')); + assert.ok(!rendered.includes(f.t('scriptTerminal.completedSuccessfully'))); + } else { + assert.ok(!rendered.includes('\x1bc'),'success/errors and non-opted-in scripts keep their logs'); + assert.ok(rendered.includes(kind==='success'?f.t('scriptTerminal.completedSuccessfully'):f.t('scriptTerminal.completedWithError',{code}))); + } + // Worker sends both forms; neither a second frame nor a heartbeat may complete twice. + f.receive({data:JSON.stringify({type:'script_complete',exit_code:code})}); + f.receive({data:'{"type":"pong"}'}); + assert.deepEqual(f.callbacks,[code]);assert.equal(f.state.closed,1);scenarios++; + } + for(const payload of [{type:'script_complete'},{type:'script_complete',exit_code:'invalid'}]) { + const f=fixture(handler,locale);f.receive({data:JSON.stringify(payload)}); + assert.ok(f.writes.join('').includes('\x1b[31m')); + assert.ok(!f.writes.join('').includes(f.t('scriptTerminal.cancelled')));scenarios++; + } +} +for(const locale of Object.keys(catalogs)) assert.ok(translator(locale)('scriptTerminal.cancelled')!=='scriptTerminal.cancelled'); +// The native CLI and the explicitly opted-in caller share the documented code6 contract. +const fs=require('node:fs'); +assert.match(fs.readFileSync('oci/src/proxmenux_oci/management.py','utf8'),/^EXIT_CANCELLED = 6 /m); +assert.equal(completion.OCI_CANCELLED_EXIT_CODE,6); +const parent=ts.createSourceFile('vms.tsx',read('components/virtual-machines.tsx'),ts.ScriptTarget.Latest,true,ts.ScriptKind.TSX); +let ociElement,reset,pendingRecoveryClick,registrationClick,registrationLabel; +function find(node) { + if(ts.isJsxSelfClosingElement(node) && node.tagName.getText(parent)==='ScriptTerminalModal' && + node.attributes.properties.some(p=>p.name?.getText(parent)==='scriptPath' && p.initializer?.text?.endsWith('/oci/manage_instance.sh'))) ociElement=node; + if(ts.isCallExpression(node) && node.expression.getText(parent)==='useEffect' && node.arguments[0]?.getText(parent).includes('ociCompletionCodeRef.current = undefined')) reset=node.arguments[0]; + if(ts.isJsxElement(node) && node.openingElement.tagName.getText(parent)==='Button') { + const click=node.openingElement.attributes.properties.find(p=>p.name?.getText(parent)==='onClick')?.initializer?.expression; + if(click?.getText(parent).includes('setOciAction(') && click.getText(parent).includes('action: "update"')) pendingRecoveryClick=click; + if(click?.getText(parent).includes('setOciAction(') && click.getText(parent).includes('action: "recover"')) { + registrationClick=click; + registrationLabel=node.children.find(child=>ts.isJsxExpression(child)&&child.expression)?.expression; + } + } + ts.forEachChild(node,find); +} +find(parent);assert.ok(ociElement);assert.ok(reset);assert.ok(pendingRecoveryClick);assert.ok(registrationClick);assert.ok(registrationLabel); +const attribute=name=>ociElement.attributes.properties.find(p=>p.name?.getText(parent)===name)?.initializer?.expression; +assert.equal(attribute('cancelledExitCode').getText(parent),'OCI_CANCELLED_EXIT_CODE'); +(async()=>{ + for(const locale of ['en','sk']) { + const scope={t:translator(locale),selectedVM:{vmid:110},applyBackup:false,applyBackupStorage:'',selectedBackupStorage:''}; + scope.setOciAction=value=>scope.ociAction=value; + executable(registrationClick,parent,scope)(); + assert.equal(scope.ociAction.action,'recover');assert.equal(scope.ociAction.vmid,110); + assert.equal(executable(registrationLabel,parent,scope),locale==='sk'?'Znova zaregistrovať':'Register again'); + assert.equal(executable(attribute('title'),parent,scope),locale==='sk'? + 'Zaregistrovať OCI aplikácie obnovené zo zálohy':'Register restored OCI applications'); + scope.selectedVM={vmid:111}; + assert.equal(executable(attribute('params'),parent,scope).VMID,'110','registration preserves the clicked target context'); + assert.equal(executable(attribute('params'),parent,scope).ACTION,'recover','registration retains its existing global CLI action'); + assert.equal(scope.t('vmLxc.ociUpdates.recover'),locale==='sk'?'Obnoviť':'Recover'); + } + for(const locale of ['en','sk']) for(const pending of [false,true]) { + const scope={t:translator(locale), selectedVM:{vmid:110}, ociInstance:{pending}, + applyBackup:false,applyBackupStorage:'',selectedBackupStorage:''}; + scope.setOciAction=value=>scope.ociAction=value; + executable(pendingRecoveryClick,parent,scope)(); + assert.equal(scope.ociAction.vmid,110); + assert.equal(scope.ociAction.action,'update','pending recovery retains the existing manage contract'); + // Background refresh or another selected guest must not rename this open operation. + scope.ociInstance={pending:!pending};scope.selectedVM={vmid:999}; + const title=executable(attribute('title'),parent,scope); + assert.equal(title,scope.t(pending?'vmLxc.ociUpdates.terminalTitleRecoverPrevious':'vmLxc.ociUpdates.terminalTitleUpdate')); + assert.equal(title,pending?(locale==='sk'?'Obnoviť predchádzajúcu OCI inštaláciu':'Recover the previous OCI installation'): + (locale==='sk'?'Aktualizovať OCI aplikáciu':'Update OCI application')); + const params=executable(attribute('params'),parent,scope); + assert.equal(params.ACTION,'update');assert.equal(params.VMID,'110'); + assert.equal(params.KEEP_BACKUP,''); + } + for(const action of ['modify','recover']) { + const scope={t:translator('sk'),ociAction:{vmid:110,action,recoverPrevious:true}}; + assert.equal(executable(attribute('title'),parent,scope),scope.t(action==='recover'? + 'vmLxc.ociUpdates.terminalTitleRecover':'vmLxc.ociUpdates.terminalTitleModify'), + 'registration and editing retain their own titles'); + } + for(const frame of ['raw','json']) { + const f=fixture(handlers[0],'sk'),timers=[]; + const old={readyState:3,onclose:()=>f.callbacks.push(-1),onerror:()=>{},onmessage:()=>{},close(){this.onclose?.({})}}; + const ref={current:old}; + class Socket{static OPEN=1;constructor(){this.readyState=1}close(){this.onclose?.({})}} + const scope={...f.scope,isOpen:true,isComplete:false,reconnectAttemptsRef:{current:0},reconnectTimeoutRef:{current:null}, + wsRef:ref,WebSocket:Socket,sessionIdRef:{current:'fixture'},paramsRef:{current:{}},keepAliveIntervalRef:{current:null}, + scriptPath:'/fixture/oci',setConnectionStatus:()=>{},getScriptWebSocketUrl:()=> 'ws://fixture',getTicketedWsUrl:async url=>url, + setTimeout:fn=>{timers.push(fn);return 1},clearTimeout:()=>{}}; + executable(reconnectCallback,source,scope)();await timers[0](); + assert.equal(old.onclose,null,'replaced connection cannot emit an unknown result'); + assert.equal(old.onmessage,null,'late result from replaced connection cannot win'); + ref.current.onmessage({data:frame==='raw'?'\r\n[Script exited with code 6]\r\n':JSON.stringify({type:'script_complete',exit_code:6})}); + assert.deepEqual(f.callbacks,[6]); + } + for(const action of ['update','modify']) for(const code of [6,0,1,undefined]) { + const calls=[],row={vmid:110,action},saved=JSON.stringify(row),ref={current:undefined}; + const scope={...completion,ociAction:row,ociCompletionCodeRef:ref, + setOciAction:value=>calls.push(['close',value]),fetchApi:(url,options)=>{calls.push(['fetch',url,options]);return Promise.resolve({});}, + invalidateLxcApps:vmid=>calls.push(['invalidate',vmid]),vmModalCacheRef:{current:{mountPoints:new Map()}}, + fetchOciInstance:vmid=>calls.push(['instance',vmid]),fetchMountPoints:vmid=>calls.push(['mounts',vmid]),mutate:()=>calls.push(['mutate'])}; + executable(attribute('onComplete'),parent,scope)(code); + executable(attribute('onClose'),parent,scope)(); + await new Promise(resolve=>setImmediate(resolve)); + assert.equal(JSON.stringify(row),saved); + if(code===6) assert.deepEqual(calls,[['close',null]],'cancel has zero registry/API/cache calls'); + else assert.equal(calls.filter(c=>c[0]==='fetch'&&c[2].method==='POST').length,1,'preserve refresh after non-cancel'); + executable(reset,parent,scope)();assert.equal(ref.current,undefined,'next modal cannot inherit cancellation'); + } + console.log(`PASS: ${scenarios} real terminal frame scenarios; actual OCI close callbacks, code6 scoping, reset and zero cancel probes`); +})().catch(error=>{console.error(error);process.exitCode=1}); diff --git a/tests/test_optimization_source.cjs b/tests/test_optimization_source.cjs new file mode 100644 index 00000000..236d95b4 --- /dev/null +++ b/tests/test_optimization_source.cjs @@ -0,0 +1,114 @@ +// Actual Settings handlers and real fetchApi; all responses are inert fixtures. +const assert=require('node:assert/strict'),fs=require('node:fs'),path=require('node:path'),vm=require('node:vm') +const {execFileSync}=require('node:child_process') +const root=path.resolve(__dirname,'..'),app=path.join(root,'AppImage') +const ts=require(path.join(app,'node_modules/typescript')) +const catalogs=Object.fromEntries(['en','sk','de'].map(locale=>[locale,JSON.parse(fs.readFileSync(path.join(app,`messages/${locale}/common.json`)))])) +// A locale without these keys must show the English name. +catalogs.missing={} +const translate=locale=>(key,params={})=>{ + const find=data=>key.split('.').reduce((item,name)=>item?.[name],data) + return (find(catalogs[locale])??find(catalogs.en)??key).replace(/\{(\w+)\}/g,(all,key)=>params[key]??all) +} +const flatten=node=>!node||typeof node!=='object'?[]:[node,...[node.props?.children].flat(Infinity).flatMap(flatten)] +const text=node=>node==null||node===false?'':typeof node!=='object'?String(node):[node.props?.children].flat(Infinity).map(text).join(' ') +const compile=source=>ts.transpileModule(source,{compilerOptions:{module:ts.ModuleKind.CommonJS,target:ts.ScriptTarget.ES2020,jsx:ts.JsxEmit.ReactJSX}}).outputText +const source=process.argv.includes('--baseline')?execFileSync('git',['show','e826680c:AppImage/components/settings.tsx'],{cwd:root,encoding:'utf8'}):fs.readFileSync(path.join(app,'components/settings.tsx'),'utf8') +const formatter={exports:{}};vm.runInNewContext(compile(fs.readFileSync(path.join(app,'lib/optimization-source-errors.ts'),'utf8')),formatter) +const descriptionsPath=path.join(app,'lib/optimization-descriptions.ts') +const descriptions={exports:{},require:name=>({default:require(path.resolve(app,'lib',name))})};if(fs.existsSync(descriptionsPath))vm.runInNewContext(compile(fs.readFileSync(descriptionsPath,'utf8')),descriptions) +const tools=['one','two'].map(key=>({key,name:'Demo '+key,enabled:true,has_source:true,version:'1.0',available_version:'1.1'})) +const sourceBody={success:true,function:'demo',script:'demo.sh',source:'demo() {\n echo "& $HOME"\n}\n',deprecated:false} +function fixture(locale='sk',catalog=tools){ + let cursor=0,states=[],refs=[],effects=[],memo=[],tree,language=locale,reply=()=>sourceBody + const calls=[],events={},timers=[],copies=[];let fallbackCopies=0 + const t=(key,params)=>translate(language)(key,params) + const react={ + useState(value){const i=cursor++;if(!(i in states))states[i]=typeof value==='function'?value():value;return[states[i],v=>{states[i]=typeof v==='function'?v(states[i]):v}]}, + useRef(value){const i=cursor++;return refs[i]??=( {current:value})}, + useEffect(fn,deps){const i=cursor++,old=memo[i];if(!old||deps?.some((v,n)=>v!==old.deps?.[n]))effects.push(()=>{old?.cleanup?.();memo[i]={deps,cleanup:fn()}})}, + } + const response=(body,status=200)=>({ok:status<400,status,statusText:'fixture',headers:{get:()=> 'application/json'},json:async()=>body}) + const fetch=async(url,options={})=>{ + const endpoint=String(url).replace(/^https?:\/\/[^/]+/,'');calls.push({endpoint,method:options.method||'GET'}) + assert.equal(options.method||'GET','GET','Source viewer may never mutate') + if(endpoint.includes('/tool-source/')){const result=await reply(endpoint);if(result instanceof Error)throw result;return result?.http?response(result.body,result.http):response(result)} + if(endpoint.endsWith('/installed-tools'))return response({success:true,installed_tools:catalog,updates_available_count:0}) + return response({categories:[],storages:[],interfaces:[],dismissed:[],success:true,candidates:[],configured:false}) + } + const api={exports:{},fetch,process:{env:{}},console:{error(){}}};vm.runInNewContext(compile(fs.readFileSync(path.join(app,'lib/api-config.ts'),'utf8')),api) + const add=(name,handler)=>{(events[name]??=new Set()).add(handler)},remove=(name,handler)=>events[name]?.delete(handler) + const win={addEventListener:add,removeEventListener:remove,setTimeout:fn=>{timers.push(fn);return timers.length},isSecureContext:true} + const doc={addEventListener:add,removeEventListener:remove,body:{appendChild(){},removeChild(){}},createElement:()=>({style:{},focus(){},select(){}}),execCommand:()=>{fallbackCopies++;return true}} + const clipboard={writeText:async value=>copies.push(value)} + const context={exports:{},window:win,document:doc,navigator:{clipboard},console:{error(){}},setTimeout:win.setTimeout, + require:name=>{ + if(name==='react')return react + if(name==='react/jsx-runtime')return{jsx:(type,props)=>({type,props}),jsxs:(type,props)=>({type,props})} + if(name.includes('optimization-source-errors'))return formatter.exports + if(name.includes('optimization-descriptions'))return descriptions.exports + if(name.includes('api-config'))return api.exports + if(name.includes('i18n/provider'))return{SUPPORTED_LANGUAGES:[],useI18n:()=>({t,language,setLanguage:value=>language=value})} + if(name.includes('use-platform'))return{useIsPbs:()=>false} + if(name.includes('format-network'))return{getNetworkUnit:()=> 'Bytes'} + return new Proxy({},{get:(_,key)=>key}) + }} + vm.runInNewContext(compile(source),context) + const render=()=>{cursor=0;effects=[];tree=context.exports.Settings();for(const effect of effects)effect();return tree} + const settle=async()=>{for(let i=0;i<24;i++)await Promise.resolve();render()} + // Rows show the localized tool name when the catalog has one. + const label=name=>{const fallback=catalog.find(tool=>tool.key===name)?.name||'Demo '+name;return descriptions.exports.optimizationToolName?descriptions.exports.optimizationToolName(name,fallback,t):fallback} + const tool=name=>flatten(tree).find(node=>node.props?.title===t('settings.optimizations.sourceTitle')&&text(node).includes(label(name))) + const dialog=()=>flatten(tree).find(node=>node.props?.role==='dialog') + const close=()=>flatten(tree).find(node=>node.props?.['aria-label']===t('actions.close')).props.onClick() + return{render,settle,tool,dialog,close,calls,copies,timers,tree:()=>tree,setReply:value=>reply=value,t, + language:value=>{language=value;render()},escape:()=>events.keydown?.forEach(fn=>fn({key:'Escape'})), + unmount:()=>memo.forEach(effect=>effect?.cleanup?.()),clipboard,win,fallbackCopies:()=>fallbackCopies} +} +async function main(){ + if(process.argv.includes('--baseline')){ + const f=fixture();f.render();await f.settle();f.setReply(()=>({http:404,body:{success:false,error:'Function not found in available scripts'}}));await f.tool('one').props.onClick();f.render(); + assert.ok(text(f.tree()).includes('Failed to load source code'));assert.ok(!text(f.tree()).includes(f.t('settings.optimizations.sourceFunctionMissing'))) + console.log('REPRODUCED baseline: real Settings + fetchApi 404 displays English Failed to load source code');return + } + for(const locale of ['en','sk','de']){ + const f=fixture(locale);f.render();await f.settle() + for(const [reply,key,param]of [ + [{success:false},'sourceUnavailable'],[null,'sourceUnavailable'],[{success:'yes',source:'invalid'},'sourceUnavailable'],[{success:true,source:''},'sourceUnavailable'],[{success:true,source:' '},'sourceUnavailable'],[{success:true,source:17},'sourceUnavailable'], + [{http:404,body:{success:false,error:'Function not found in available scripts'}},'sourceFunctionMissing'], + [{http:404,body:{success:false,error:'Unknown tool: demo'}},'sourceUnknownTool',{tool:'demo'}], + [{http:404,body:{success:false,error:'No function mapping for demo'}},'sourceNoMapping',{tool:'demo'}], + [{success:false,error:'Source code not available'},'sourceUnavailable'],[new Error('network unreachable'),'sourceLoadFailed']]){ + f.setReply(()=>reply);await f.tool('one').props.onClick();f.render();assert.ok(text(f.dialog()).includes(f.t('settings.optimizations.'+key,param)),key) + } + f.setReply(()=>({http:500,body:{success:false,error:'PermissionError /opt/demo &'}}));await f.tool('one').props.onClick();f.render();assert.ok(text(f.dialog()).includes('PermissionError /opt/demo &')) + f.language('sk');assert.ok(text(f.dialog()).includes(translate('sk')('settings.optimizations.sourceLoadFailed'))) + f.setReply(()=>sourceBody);await f.tool('one').props.onClick();f.render(); + const backdrop=flatten(f.tree()).find(node=>node.props?.className?.startsWith('fixed inset-0')&&flatten(node).some(child=>child.props?.role==='dialog')) + assert.equal(backdrop.props.style.margin,0,'parent space-y must not offset the fixed backdrop') + const pre=flatten(f.dialog()).find(node=>node.type==='pre');assert.ok(pre.props.dangerouslySetInnerHTML.__html.includes('<'));assert.ok(!pre.props.dangerouslySetInnerHTML.__html.includes('')) + const copy=flatten(f.dialog()).find(node=>node.props?.title===f.t('actions.copyToClipboard'));await copy.props.onClick();f.render();assert.equal(f.copies.at(-1),sourceBody.source) + f.win.isSecureContext=false;await copy.props.onClick();assert.equal(f.fallbackCopies(),1) + const before=f.calls.length;f.close();f.render();assert.equal(f.dialog(),undefined);assert.equal(f.calls.length,before) + } + const names=catalogs.en.settings.optimizations.sourceToolNames + const metadata=JSON.parse(execFileSync('python3',['-c',"import ast,json,sys;t=ast.parse(open(sys.argv[1]).read());n=next(n for n in t.body if isinstance(n,ast.Assign) and isinstance(n.targets[0],ast.Name) and n.targets[0].id=='TOOL_METADATA');print(json.dumps({k:v['name'] for k,v in ast.literal_eval(n.value).items()}))",path.join(app,'scripts/flask_proxmenux_routes.py')],{encoding:'utf8'})) + assert.deepEqual(names,metadata,'source title names must match real backend metadata') + for(const [key,name]of Object.entries(names)){ + assert.equal(formatter.exports.optimizationSourceName(key,name,translate('en')),name) + assert.equal(formatter.exports.optimizationSourceName(key,name,translate('sk')),catalogs.sk.settings.optimizations.sourceToolNames[key]) + assert.equal(formatter.exports.optimizationSourceName(key,name,translate('missing')),name) + } + assert.equal(Object.keys(names).length,27) + assert.equal(formatter.exports.optimizationSourceName('future','Future tool',translate('sk')),'Future tool') + const known=fixture('sk',[{...tools[0],key:'time_sync',name:'Time Synchronization'}]);known.render();await known.settle();await known.tool('time_sync').props.onClick();known.render();assert.ok(text(known.dialog()).includes('Synchronizácia času'));known.language('en');assert.ok(text(known.dialog()).includes('Time Synchronization')) + const f=fixture();f.render();await f.settle();let resolveOld;f.setReply(()=>new Promise(resolve=>resolveOld=resolve));const old=f.tool('one').props.onClick();f.render();assert.ok(flatten(f.dialog()).some(node=>node.props?.role==='status')) + f.close();f.render();resolveOld(sourceBody);await old;f.render();assert.equal(f.dialog(),undefined,'late success never reopens closed viewer') + let resolveStale;f.setReply(()=>new Promise(resolve=>resolveStale=resolve));const stale=f.tool('one').props.onClick();f.setReply(()=>({...sourceBody,source:'two() { :; }'}));await f.tool('two').props.onClick();f.render();resolveStale({http:404,body:{error:'Function not found in available scripts'}});await stale;f.render();assert.ok(text(f.dialog()).includes('Demo two'));assert.equal(flatten(f.dialog()).some(node=>node.props?.role==='alert'),false) + const before=f.calls.length;f.escape();f.render();assert.equal(f.dialog(),undefined);assert.equal(f.calls.length,before) + f.setReply(()=>sourceBody);await f.tool('one').props.onClick();f.render();let copyResolve;f.clipboard.writeText=()=>new Promise(resolve=>copyResolve=resolve);const copying=flatten(f.dialog()).find(node=>node.props?.title===f.t('actions.copyToClipboard')).props.onClick();f.close();f.render();copyResolve();await copying;f.render();assert.equal(f.dialog(),undefined) + let unmountedResolve;f.setReply(()=>new Promise(resolve=>unmountedResolve=resolve));const unmounted=f.tool('one').props.onClick();f.render();const snapshot=text(f.tree());f.unmount();unmountedResolve(sourceBody);await unmounted;f.render();assert.equal(text(f.tree()),snapshot,'response after unmount cannot update modal state') + assert.equal(f.calls.filter(call=>call.method!=='GET').length,0);assert.equal(f.calls.filter(call=>/scan|update|script-runner/.test(call.endpoint)).length,0) + console.log('PASS source viewer: actual Settings/fetchApi, EN/SK/fallback, 404/500/network/malformed/empty, exact copy, late requests and close/Esc; mutations/scan/update 0') +} +main().catch(error=>{console.error(error);process.exitCode=1}) diff --git a/tests/test_pbs_i18n.cjs b/tests/test_pbs_i18n.cjs new file mode 100644 index 00000000..93d92605 --- /dev/null +++ b/tests/test_pbs_i18n.cjs @@ -0,0 +1,154 @@ +// Shipped PBS code with only transport, hooks and UI primitives replaced. +const assert = require('node:assert/strict'), fs = require('node:fs'), vm = require('node:vm'); +const ts = require('typescript'); +const compile = source => ts.transpileModule(source, {compilerOptions: {module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020, jsx: ts.JsxEmit.ReactJSX}}).outputText; +const catalogs = Object.fromEntries(['en','sk'].map(l => [l, JSON.parse(fs.readFileSync(`AppImage/messages/${l}/common.json`))])); +const translate = locale => (key, params = {}) => { + const value = key.split('.').reduce((tree, part) => tree?.[part], catalogs[locale]); + assert.equal(typeof value, 'string', key); + return value.replace(/\{(\w+)\}/g, (m,k) => params[k] ?? m); +}; +const library = {exports: {}}; +vm.runInNewContext(compile(fs.readFileSync('AppImage/lib/pbs-messages.ts','utf8')), library); +const messages = library.exports; +const failure = code => Object.assign(new Error('RAW DIAGNOSTIC'), {body: {error:'RAW DIAGNOSTIC',code}}); +const flatten = n => !n || typeof n === 'boolean' ? [] : Array.isArray(n) ? n.flatMap(flatten) + : typeof n === 'object' ? n.type === 'Dialog' && !n.props.open ? [] : [n,...flatten(n.props?.children)] : [n]; +const text = n => flatten(n).filter(n => typeof n === 'string' || typeof n === 'number').join(''); + +function fixture(locale='sk', options={}) { + let cursor=0, slots=[], effects=[], tree, apiError, reloadError; + const calls=[], confirmations=[], reloads=[]; + const servers={local_available:false,servers:[{id:'saved',name:'Saved PBS',url:'https://saved.invalid:8007',token_id:'audit@pbs!monitor',has_token:true,fingerprint:''}],detected:[]}; + const status={name:'Fixture',version:'4.2.5',fetched_at:1700000000,services:{'proxmox-backup':'inactive'},datastores:[],tasks:[],sync:[],verify:[],prune:[],errors:{}}; + const t=translate(locale), loaded={}; + const jsx=(type,props) => typeof type === 'function' ? type(props) : ({type,props}); + const react={useState(initial){const i=cursor++;if(!(i in slots))slots[i]=typeof initial==='function'?initial():initial;return [slots[i],value=>{slots[i]=typeof value==='function'?value(slots[i]):value;}];}, + useEffect(fn,deps){const i=cursor++, old=slots[i];if(!old||deps.some((d,j)=>d!==old[j]))effects.push(fn);slots[i]=deps;}}; + function requireModule(name) { + if(name==='react')return react; + if(name==='react/jsx-runtime')return {jsx,jsxs:jsx,Fragment:'Fragment'}; + if(name==='swr')return {default:key=>({data:key?.startsWith('/api/pbs/status')?status:key?servers:undefined,error:options.loadError, + isLoading:false,mutate:async()=>{reloads.push(key);if(reloadError)throw reloadError;}})}; + if(name.includes('i18n/provider'))return {useT:()=>t,useI18n:()=>({language:locale})}; + if(name.includes('pbs-messages'))return messages; + if(name.includes('api-config'))return {fetchApi:async(path,opts)=>{calls.push({path,...opts});if(apiError)throw apiError;return {id:'new',success:true};}}; + if(name.endsWith('pbs-problem-message'))return load('AppImage/components/pbs-problem-message.tsx'); + if(name.endsWith('pbs-datastore-usage'))return load('AppImage/components/pbs-datastore-usage.tsx'); + if(name.includes('lib/utils'))return {formatStorage:n=>String(n)+' GB'}; + return new Proxy({}, {get:(_,key)=>key}); + } + function load(path) {if(loaded[path])return loaded[path];const e={};loaded[path]=e; + vm.runInNewContext(compile(fs.readFileSync(path,'utf8')), {exports:e,require:requireModule,Date,window:{confirm:message=>{confirmations.push(message);return options.confirm===true;}}});return e;} + const panel=load('AppImage/components/pbs-panel.tsx').PBSPanel; + return {t,servers,status,calls,confirmations,reloads,jsx,requireModule, + render(props){cursor=0;effects=[];tree=panel(props);effects.forEach(fn=>fn());return tree;}, + nodes:()=>flatten(tree),text:()=>text(tree), + button(label){const n=flatten(tree).find(n=>n.type==='Button'&&text(n)===label);assert.ok(n,label);return n;}, + input(field){const n=flatten(tree).find(n=>n.type==='Input'&&n.props.id==='pbs-'+field);assert.ok(n,field);return n;}, + select(label){const n=flatten(tree).find(n=>n.type==='Select'&&flatten(n).some(n=>n.props?.['aria-label']===label));assert.ok(n,label);return n;}, + fail:e=>{apiError=e;},failReload:e=>{reloadError=e;},load, + }; +} + +function overview(locale, sourcePath='AppImage/components/system-overview.tsx') { + const source=fs.readFileSync(sourcePath,'utf8'), ast=ts.createSourceFile('overview.tsx',source,ts.ScriptTarget.Latest,true,ts.ScriptKind.TSX), branches=[]; + function visit(n){if(ts.isConditionalExpression(n)&&n.condition.getText(ast)==='isPbs'&&n.whenTrue.getText(ast).includes('pbs.datastores'))branches.push(n.whenTrue.getText(ast));ts.forEachChild(n,visit);}visit(ast); + assert.equal(branches.length,2,'overview summary and storage details both consume PBS'); + const f=fixture(locale); + for(const branch of branches) { + for(const state of ['partial','network','empty','loading']) { + const pbsStatus=state==='loading'||state==='network'?undefined:{datastores:state==='empty'?[]:null,errors:{datastores:'RAW DIAGNOSTIC'},error_details:{datastores:{code:'pbs_token_rejected'}}}; + const context={isPbs:true,pbsStatus,pbsError:state==='network'?failure('pbs_connect_failed'):undefined,datastores:pbsStatus?.datastores, + t:f.t,require:f.requireModule,pbsDiagnostic:messages.pbsDiagnostic,PBSProblemMessage:f.load('AppImage/components/pbs-problem-message.tsx').PBSProblemMessage, + DatastoreUsageRow:f.load('AppImage/components/pbs-datastore-usage.tsx').DatastoreUsageRow}; + for(const name of ['Card','CardHeader','CardTitle','CardContent','Database','Badge'])context[name]=name; + vm.runInNewContext(compile('exports.result=('+branch+');'),{...context,exports:context}); + const rendered=text(context.result); + if(state==='partial') {assert.ok(rendered.includes(f.t('pbs.errors.tokenRejected')));assert.ok(!rendered.includes(f.t('pbs.loading')));assert.ok(!flatten(context.result).some(n=>n.props?.className?.includes('animate-pulse')));} + if(state==='network')assert.ok(rendered.includes(f.t('pbs.errors.connectFailed'))); + if(state==='empty')assert.ok(rendered.includes(f.t('pbs.noDatastores'))); + } + } +} + +async function main() { + const backend=fs.readFileSync('AppImage/scripts/pbs_manager.py','utf8')+fs.readFileSync('AppImage/scripts/flask_pbs_routes.py','utf8'); + const codes=new Set([...backend.matchAll(/(?:code|rejected_code)="(pbs_\w+)"/g)].map(m=>m[1])); + for(const locale of ['en','sk']) { + const t=translate(locale); + for(const code of codes) { + if(code==='pbs_unknown')continue; + const err=failure(code);err.body.params={count:32}; + assert.notEqual(messages.pbsErrorText(err,t),t('pbs.loadFailed'),code); + assert.ok(!messages.pbsErrorText(err,t).includes('RAW')); + } + for(const err of [null,undefined,'raw',new Error('raw'),{body:null},{code:'constructor'},{code:'__proto__'},{code:'future'}, + ...[null,0,-1,1.2,'32',Infinity,NaN,2**54].map(count=>({code:'pbs_connection_limit',params:{count}}))]) { + assert.equal(messages.pbsErrorText(err,t),t('pbs.loadFailed')); + } + assert.equal(messages.pbsResultText('OK',t),t('pbs.states.ok')); + assert.equal(messages.pbsResultText('WARNINGS: 2',t),t('pbs.states.warnings',{count:2})); + assert.equal(messages.pbsResultText(undefined,t),t('pbs.states.unknown')); + assert.equal(messages.pbsResultText('unknown',t),t('pbs.states.unknown')); + assert.equal(messages.pbsResultText('TASK ERROR: raw',t),t('pbs.states.error')); + for(const n of [-1,NaN,Infinity])assert.equal(messages.formatPBSDuration(n,t),'—'); + for(const [n,label] of [[0,'0 s'],[59,'59 s'],[60,'1 min 0 s'],[3599,'59 min 59 s'],[3600,'1 h 0 min'],[86399,'23 h 59 min'],[86400,'1 d 0 h']])assert.equal(messages.formatPBSDuration(n,t),label); + assert.equal(messages.pbsTaskType('garbage_collection',t),t('pbs.taskTypes.garbageCollection')); + assert.equal(messages.pbsTaskType('future',t),t('pbs.taskTypes.other',{type:'future'})); + assert.equal(messages.pbsServiceState('constructor',t),t('pbs.serviceStates.unknown')); + assert.equal(t('pbs.url'),locale==='sk'?'Adresa HTTPS':'HTTPS address'); + const diagnosticFixture=fixture(locale),problem=diagnosticFixture.load('AppImage/components/pbs-problem-message.tsx').PBSProblemMessage; + for(const code of codes){ + if(code==='pbs_unknown')continue; + const err=failure(code);err.body.params={count:32}; + const rendered=problem({problem:err,raw:'RAW DIAGNOSTIC'}); + assert.ok(!text(rendered).includes('RAW DIAGNOSTIC'),'Known '+code+' must not repeat an English application message'); + assert.ok(!flatten(rendered).some(n=>n.type==='details')); + } + for(const code of ['future','__proto__','constructor']){ + const rendered=problem({problem:failure(code),raw:'RAW DIAGNOSTIC'}); + assert.ok(text(rendered).includes('RAW DIAGNOSTIC'));assert.ok(flatten(rendered).some(n=>n.type==='details')); + } + const unknown=fixture(locale);unknown.status.tasks=[{upid:'unknown',endtime:1700000000,status:'unknown'}];unknown.status.sync=[{id:'unknown','last-run-state':'unknown'}]; + unknown.render();unknown.render(); + const unknownBadges=unknown.nodes().filter(n=>n.type==='Badge'&&text(n)===t('pbs.states.unknown')); + assert.equal(unknownBadges.length,2);assert.ok(unknownBadges.every(n=>!n.props.className.includes('red-'))); + unknown.status.tasks=[{upid:'warn',endtime:1700000000,status:'WARNINGS: 3'},{upid:'raw',endtime:1700000000,status:'RAW EXTERNAL TASK ERROR'}];unknown.status.sync=[];unknown.render(); + const taskDetails=unknown.nodes().filter(n=>n.type==='details');assert.equal(taskDetails.length,1);assert.ok(text(taskDetails[0]).includes('RAW EXTERNAL TASK ERROR')); + const f=fixture(locale);f.render();f.render();f.button(t('pbs.manage')).props.onClick();f.render(); + assert.equal(f.input('url').props['aria-describedby'],'pbs-url-help'); + assert.ok(f.text().includes(t('pbs.urlHelp')));assert.ok(f.text().includes(t('pbs.usernameHelp'))); + f.input('name').props.onChange({target:{value:'Draft'}});f.render(); + f.input('password').props.onChange({target:{value:'fake-one-time-password'}});f.render(); + f.button(t('pbs.cancel')).props.onClick();f.render();assert.equal(f.calls.length,0); + f.button(t('pbs.manage')).props.onClick();f.render();assert.equal(f.input('password').props.value,''); + f.input('name').props.onChange({target:{value:'Draft'}});f.render();f.input('url').props.onChange({target:{value:'http://bad.invalid'}});f.render(); + f.fail(failure('pbs_invalid_url'));await f.button(t('pbs.save')).props.onClick();f.render(); + assert.ok(f.text().includes(t('pbs.errors.invalidUrl')));assert.equal(f.input('url').props.value,'http://bad.invalid'); + assert.equal(f.calls[0].path,'/api/pbs/servers/login');assert.ok(!Object.hasOwn(JSON.parse(f.calls[0].body),'token_secret')); + f.button(t('pbs.methodToken')).props.onClick();f.render();await f.button(t('pbs.save')).props.onClick();f.render(); + assert.ok(f.text().includes(t('pbs.tokenSecretHelp')));assert.ok(!f.text().includes(t('pbs.tokenSecretKeepHelp'))); + assert.equal(f.input('token_secret').props['aria-describedby'],'pbs-token_secret-help'); + assert.equal(f.calls[1].path,'/api/pbs/servers');assert.ok(!Object.hasOwn(JSON.parse(f.calls[1].body),'password')); + f.select(t('pbs.editConnection')).props.onValueChange('saved');f.render();await f.button(t('pbs.remove')).props.onClick();f.render(); + assert.ok(f.text().includes(t('pbs.tokenSecretKeepHelp')));assert.ok(!f.text().includes(t('pbs.tokenSecretHelp'))); + assert.deepEqual(f.confirmations,[t('pbs.removeConfirm')]);assert.equal(f.calls.length,2,'Declined remove has no DELETE'); + const remove=fixture(locale,{confirm:true});remove.render();remove.render();remove.button(t('pbs.manage')).props.onClick();remove.render();remove.select(t('pbs.editConnection')).props.onValueChange('saved');remove.render(); + await remove.button(t('pbs.remove')).props.onClick();remove.render();assert.equal(remove.calls.length,1);assert.equal(remove.calls[0].method,'DELETE'); + const failedRemove=fixture(locale,{confirm:true});failedRemove.render();failedRemove.render();failedRemove.button(t('pbs.manage')).props.onClick();failedRemove.render();failedRemove.select(t('pbs.editConnection')).props.onValueChange('saved');failedRemove.render();failedRemove.fail(new Error('network failure')); + await failedRemove.button(t('pbs.remove')).props.onClick();failedRemove.render();assert.ok(failedRemove.text().includes(t('pbs.removeFailed')));assert.equal(failedRemove.calls.length,1); + const failedReload=fixture(locale);failedReload.render();failedReload.render();failedReload.button(t('pbs.manage')).props.onClick();failedReload.render();failedReload.failReload(new Error('raw reload')); + for(const [field,value] of Object.entries({name:'Valid',url:'https://fixture.invalid',username:'root@pam',password:'fake'})){failedReload.input(field).props.onChange({target:{value}});failedReload.render();} + assert.equal(failedReload.button(t('pbs.save')).props.disabled,false); + await failedReload.button(t('pbs.save')).props.onClick();failedReload.render();assert.equal(failedReload.calls.length,1,'No automatic mutation retry after refresh fails');assert.ok(failedReload.text().includes(t('pbs.savedRefreshFailed'))); + const removeReload=fixture(locale,{confirm:true});removeReload.render();removeReload.render();removeReload.button(t('pbs.manage')).props.onClick();removeReload.render();removeReload.select(t('pbs.editConnection')).props.onValueChange('saved');removeReload.render();removeReload.failReload(new Error('network')); + await removeReload.button(t('pbs.remove')).props.onClick();removeReload.render();assert.equal(removeReload.calls.length,1);assert.ok(removeReload.text().includes(t('pbs.removedRefreshFailed'))); + const store=f.load('AppImage/components/pbs-datastore-usage.tsx').PBSDatastoreCard({store:{name:'Offline',total:null,used:null,error:'RAW DIAGNOSTIC',error_code:'pbs_datastore_offline'}}); + assert.ok(text(store).includes(t('pbs.errors.datastoreOffline')));assert.ok(!text(store).includes('0 GB')); + overview(locale); + } + console.log('PASS: all structured PBS error codes, EN/SK/unknown diagnostics, forms/login/token/remove/cancel, no automatic retry, task/service/duration states and both real overview branches'); +} +main().catch(error=>{console.error(error);process.exitCode=1}); +module.exports={fixture,overview};