(function () {
  var LANG_KEY = "netrecon_lang";
  var CUSTOM_DICTS_KEY = "netrecon_custom_i18n";
  var LANG_META_KEY = "netrecon_lang_meta_v1";

  function getStorageAdapter() {
    var core = window.NetReconNewUICore || {};
    var platform = core.platform || null;
    return platform && platform.storage ? platform.storage : null;
  }

  function storageGet(key) {
    var storage = getStorageAdapter();
    if (storage && typeof storage.getItem === "function") {
      return storage.getItem(key);
    }
    try {
      return localStorage.getItem(key);
    } catch (_) {
      return null;
    }
  }

  function storageSet(key, value) {
    var storage = getStorageAdapter();
    if (storage && typeof storage.setItem === "function") {
      return storage.setItem(key, value);
    }
    try {
      localStorage.setItem(key, value);
      return true;
    } catch (_) {
      return false;
    }
  }

  // NOTE (shell/tools split, prep pass): en/pl below are flat, unordered
  // objects (~370 keys each) with shell and ip-scanner-tool keys fully
  // interleaved, not loosely grouped. Reordering them safely needs a
  // scripted (not manual) pass with a before/after key-set equality check,
  // given the size and a few escaped multi-line values. Deferred as its own
  // dedicated future step; not attempted in this low-risk increment. Shell vs tool
  // classification for tool-id-based keys (toolTitle_<id>/toolText_<id>)
  // should follow tool-catalog.js's split once that pass happens.
  var baseDictionaries = {
    en: {
      menuFile: "File",
      menuOptions: "Options",
      menuTools: "Tools",
      menuHelp: "Help",
      menuFileNew: "New",
      menuFileOpen: "Open",
      menuFileOpenRecent: "Open Recent",
      menuFileImport: "Import",
      menuFileSave: "Save",
      menuFileSaveAs: "Save as...",
      menuFileClose: "Close",
      menuFileExit: "Exit",
      menuOptionsCountries: "Country IP Library...",
      menuOptionsPresets: "Port Presets...",
      menuOptionsLanguage: "Language...",
      menuOptionsGeneral: "General...",
      menuOptionsImportTool: "Import Tool...",
      menuToolsAiAssistant: "AI Assistant",
      menuHelpVersions: "Versions",
      menuHelpDownload: "Download",
      windowMinimizeTitle: "Minimize",
      windowMaximizeTitle: "Maximize",
      windowFullscreenTitle: "Fullscreen",
      windowCloseTitle: "Close",
      showUnfinishedToolsTitle: "Show unfinished tools",
      demoDataButtonTitle: "Demo data mode",
      autoArrangeWindowsBtnTitle: "Auto Arrange windows",
      explorer: "Explorer",
      ipScanner: "IP Scanner",
      resultsSidebarTitle: "Results",
      resultsBrowser: "Result Data List",
      resultsIp: "IP Scan Results",
      tabResultsIp: "IP Results",
      tabPresetsTitle: "Presets",
      tabScrollLeft: "Scroll tabs left",
      tabScrollRight: "Scroll tabs right",
      terminalTab: "Terminal",
      consoleTab: "Console",
      toolTitle_scan_runner: "Scan Runner",
      toolTitle_globe: "World Globe",
      toolTitle_ip_library: "IP Library",
      toolTitle_shellcraft: "ShellCraft",
      toolTitle_presets: "Port Presets",
      toolTitle_general: "General",
      toolTitle_import_tool: "Import Tool",
      toolTitle_language_manager: "Language Manager",
      toolTitle_versions: "Versions",
      toolTitle_about: "About",
      toolTitle_license: "License",
      toolTitle_lorem_ipsum: "Lorem Ipsum",
      toolTitle_results_ip: "Result Data List",
      toolTitle_network_monitor: "Network Monitor",
      toolTitle_email_recon: "Email Recon",
      // Tab-strip labels (LS/CS/RS), read by tab-registry.js. Most tools
      // already had a working, correctly-translated tab-label key under a
      // different name (tabGeneralTitle, ipScanner, etc.) - those are
      // reused directly in tool-catalog.js rather than duplicated here.
      // Only tools with no working key, or whose only candidate key was for
      // different (longer/content-title) text than the actual tab label,
      // get one here: versions/shellcraft had no id-based translation at
      // all; language-manager/globe's only existing keys
      // (langManagerTitle/toolTitle_globe) are the longer in-content <h4>
      // title ("Language Manager"/"World Globe"), not the shorter tab text -
      // pre-existing mismatches in applyStaticTranslations(), not introduced
      // by this; config/shellcraft-library/shellcraft-inspector are new
      // RS/LS-only entries with nothing to reuse.
      tabLabel_language_manager: "Language",
      tabLabel_versions: "Versions",
      tabLabel_shellcraft: "ShellCraft",
      tabLabel_globe: "Globe",
      tabLabel_network_monitor: "Network Monitor",
      tabLabel_email_recon: "Email Recon",
      tabLabel_config: "Config",
      tabLabel_email_recon_config: "Email Recon Config",
      tabLabel_ai_properties: "AI Properties",
      tabLabel_shellcraft_library: "Library",
      tabLabel_shellcraft_inspector: "Inspector",
      toolResultsIpTitle: "Result Data List",
      toolResultsIpText: "Table of discovered hosts, open ports, and enrichment data.",
      toolText_results_ip: "Table of discovered hosts, open ports, and enrichment data.",
      toolText_scan_runner: "IP range, port presets, concurrent probing, and result persistence.",
      toolText_globe: "Interactive 3D globe plotting your scanned hosts by geolocation, fetched on demand.",
      globeLoading: "Loading globe...",
      globeEmptyNoResults: "Run a scan first - no hosts to plot yet.",
      globeEmptyNoGeo: "Couldn't resolve locations for any scanned host.",
      globeLoadError: "Failed to load the globe.",
      toolText_network_monitor: "Local TCP/UDP connections with owning process names, plus the LAN's ARP table with vendor lookup.",
      toolText_email_recon: "Look up an email address across breach, paste, and public-profile OSINT sources.",
      toolText_ip_library: "Country IP range library with PowerShell-based update and local cache.",
      toolText_shellcraft: "ShellCraft is a visual block editor: drag blocks from the Library onto the canvas, edit them in the Inspector, and run macros.",
      shellcraftSidebarTitle: "ShellCraft",
      shellcraftLibraryFunctionalHeading: "Functional",
      shellcraftLibraryMacrosHeading: "Macros",
      shellcraftBlockIfLabel: "If",
      shellcraftBlockRepeatUntilLabel: "Repeat Until",
      shellcraftBlockPowerShellLabel: "PowerShell",
      shellcraftBlockTimeTriggerLabel: "Time Trigger",
      shellcraftBlockNotRunnableNote: "Not implemented yet",
      shellcraftBlockDeleteBtn: "Delete block",
      shellcraftViewFlowLabel: "Flow",
      shellcraftViewTimelineLabel: "Timeline",
      shellcraftViewTreeLabel: "Tree",
      shellcraftViewLayeredLabel: "Layered",
      shellcraftViewNotImplementedNote: "Not implemented yet",
      statusBlockNotExecutable: "This block type isn't executable yet",
      shellcraftInspectorEmptyNote: "Select a block on the canvas to inspect it.",
      shellcraftInspectorMacroNameLabel: "Macro",
      shellcraftInspectorMacroActionLabel: "Triggers action",
      shellcraftInspectorConditionLabel: "Condition",
      shellcraftInspectorMaxIterationsLabel: "Max iterations",
      shellcraftInspectorCommandLabel: "Command",
      shellcraftInspectorTimeLabel: "Time (HH:MM)",
      shellcraftInspectorIntervalMinutesLabel: "Repeat every (minutes, 0 = off)",
      shellcraftInspectorRunBtn: "Run",
      toolTitle_pulpit: "Topology",
      tabLabel_pulpit: "Topology",
      tabLabel_pulpit_library: "Library",
      tabLabel_pulpit_inspector: "Inspector",
      toolTitle_pulpit_preview: "Desktop Preview",
      tabLabel_pulpit_preview: "Preview",
      tabLabel_pulpit_preview_list: "Cameras",
      toolText_pulpit_preview: "Live VNC view of a Topology node's desktop - set a VNC port on a node in the Inspector, then click Preview. Desktop app only.",
      toolText_pulpit: "A manually-curated visual network topology: place computers, servers, switches, printers, routers, VMs, and Scanner/Sniffer icons anywhere, connect them, edit per-type fields, and keep notes on each - or build from your last IP scan automatically.",
      pulpitLibraryHeading: "Add computer",
      pulpitAddRemoteBtn: "Remote computer",
      pulpitAddLocalBtn: "Local computer",
      pulpitAddVirtualBtn: "Virtual machine",
      pulpitAddOwnBtn: "Custom device",
      pulpitDefaultNameRemote: "Remote Computer",
      pulpitDefaultNameLocal: "Local Computer",
      pulpitDefaultNameVirtual: "Virtual Machine",
      pulpitDefaultNameOwn: "Custom Device",
      pulpitNodeDeleteBtn: "Delete computer",
      pulpitInspectorEmptyNote: "Select a computer on the canvas to inspect it.",
      pulpitInspectorTypeLabel: "Type",
      pulpitInspectorNameLabel: "Name",
      pulpitInspectorHostLabel: "IP / host",
      pulpitConnRdpLabel: "RDP",
      pulpitConnVncLabel: "VNC",
      pulpitHypervisorQemuLabel: "QEMU",
      pulpitHypervisorVbLabel: "VirtualBox",
      pulpitRdpConnectBtn: "Connect via RDP",
      pulpitHypervisorQemuVncHint: "QEMU exposes VNC natively (-vnc ADDR:N binds port 5900+N) - no software needed inside the guest.",
      pulpitHypervisorVbVncHint: "VirtualBox has no native VNC - install a VNC server inside the guest (e.g. TigerVNC, User-Mode) first.",
      pulpitVncNeedsHypervisorNote: "Check QEMU or VirtualBox above first - VNC's host/port depends on which one manages this VM.",
      pulpitInspectorVncPortLabel: "VNC port",
      pulpitInspectorNoteLabel: "Note",
      pulpitTypeRemoteLabel: "Remote",
      pulpitTypeLocalLabel: "Local",
      pulpitTypeVirtualLabel: "Virtual",
      pulpitTypeOwnLabel: "Own",
      pulpitAddServerBtn: "Server",
      pulpitAddSwitchBtn: "Switch",
      pulpitAddPrinterBtn: "Printer",
      pulpitAddRouterBtn: "Router",
      pulpitAddScannerBtn: "Scanner",
      pulpitAddSnifferBtn: "Sniffer",
      pulpitDefaultNameServer: "Server",
      pulpitDefaultNameSwitch: "Switch",
      pulpitDefaultNamePrinter: "Printer",
      pulpitDefaultNameRouter: "Router",
      pulpitDefaultNameScanner: "Scanner",
      pulpitDefaultNameSniffer: "Sniffer",
      pulpitTypeServerLabel: "Server",
      pulpitTypeSwitchLabel: "Switch",
      pulpitTypePrinterLabel: "Printer",
      pulpitTypeRouterLabel: "Router",
      pulpitTypeScannerLabel: "Scanner",
      pulpitTypeSnifferLabel: "Sniffer",
      pulpitFieldOsLabel: "OS",
      pulpitFieldRoleLabel: "Role",
      pulpitFieldPortsLabel: "Ports",
      pulpitFieldVlanLabel: "VLAN",
      pulpitFieldModelLabel: "Model",
      pulpitFieldQueueLabel: "Queue name",
      pulpitFieldWanLabel: "WAN address",
      pulpitLibraryToolsHeading: "Add tool",
      pulpitAutoDiscoverBtn: "Build from last scan",
      pulpitAutoDiscoverNoneFound: "No new hosts to add - everything from the last scan is already on the map.",
      pulpitNodeRunBtn: "Run",
      pulpitRemoteRunHeading: "Remote install",
      pulpitRemoteHostLabel: "Target host / IP",
      pulpitRemoteUsernameLabel: "Admin username",
      pulpitRemotePasswordLabel: "Admin password",
      pulpitRemoteInstallerUrlLabel: "Installer download link",
      pulpitRemoteInstallerUrlHint: "Paste the direct .exe link for the installer - QEMU/VirtualBox don't publish a stable \"latest\" link, so use the buttons below to open the official download page and copy it from there.",
      pulpitRemoteQemuQuickpickBtn: "Open QEMU downloads",
      pulpitRemoteVirtualboxQuickpickBtn: "Open VirtualBox downloads",
      pulpitRemoteRunSubmitBtn: "Run",
      pulpitRemoteRunMissingFieldsNote: "Fill in host, username, password and an installer link first.",
      pulpitRemoteRunPendingNote: "Connecting and installing - this can take a while...",
      pulpitRemoteRunSuccessNote: "Done.",
      pulpitRemoteRunErrorPrefix: "Failed:",
      pulpitPreviewStartBtn: "Preview",
      pulpitPreviewStopBtn: "Stop preview",
      pulpitPreviewNeedsHostNote: "Set a host and VNC port above first.",
      pulpitPreviewDesktopOnlyNote: "Desktop preview needs a raw network connection - only available in the desktop app, not the web version.",
      pulpitPreviewEmptyNote: "No preview focused - start one from a computer's Inspector.",
      pulpitPreviewNoneActiveNote: "No active previews yet.",
      pulpitPreviewPasswordPlaceholder: "VNC password",
      toolTitle_mail_xss_tester: "Mail XSS Tester",
      tabLabel_mail_xss_tester: "Mail XSS",
      tabLabel_mail_xss_tester_library: "Test setup",
      tabLabel_mail_xss_tester_results: "Hit log",
      toolText_mail_xss_tester: "Send yourself an email containing several HTML/XSS payload variants - each one proves it executed by calling a unique beacon URL, so a payload your webmail sanitizes away simply never reports in. Desktop app only.",
      mailXssDesktopOnlyNote: "Mail XSS Tester needs a raw TCP listener and a spawned tunnel process - only available in the desktop app, not the web version.",
      mailXssPayloadsHeading: "Payloads to include",
      mailXssPayloadImgOnerror: "IMG onerror",
      mailXssPayloadSvgOnload: "SVG onload",
      mailXssPayloadSvgScript: "SVG + <script>",
      mailXssPayloadCssImport: "CSS @import",
      mailXssPayloadIframeSrc: "IFRAME src",
      mailXssPayloadForeignObject: "SVG foreignObject",
      mailXssTunnelHeading: "Public beacon tunnel",
      mailXssStartTunnelBtn: "Start tunnel",
      mailXssStopTunnelBtn: "Stop tunnel",
      mailXssTunnelStartingNote: "Starting beacon listener and Cloudflare tunnel...",
      mailXssTunnelRunningNote: "Tunnel is up:",
      mailXssTunnelErrorPrefix: "Tunnel failed:",
      mailXssDownloadCloudflaredBtn: "Download cloudflared",
      mailXssSendHeading: "Send test email",
      mailXssGmailAddressLabel: "Gmail address",
      mailXssAppPasswordLabel: "Gmail app password",
      mailXssToLabel: "Send to",
      mailXssSubjectLabel: "Subject",
      mailXssDefaultSubject: "Sanitization test",
      mailXssSendBtn: "Send test email",
      mailXssSendMissingFieldsNote: "Fill in your Gmail address, app password, recipient and subject first.",
      mailXssSendPendingNote: "Sending...",
      mailXssSendSuccessNote: "Sent - open it in your webmail and watch the hit log.",
      mailXssSendErrorPrefix: "Failed:",
      mailXssTriggeredYes: "Triggered",
      mailXssTriggeredNo: "Not triggered",
      mailXssStatus_idle: "Idle - start the tunnel first.",
      mailXssStatus_starting: "Starting...",
      mailXssStatus_running: "Running",
      mailXssStatus_error: "Error",
      mailXssPayloadColumnLabel: "Payload",
      mailXssTriggeredColumnLabel: "Result",
      mailXssNoPayloadsSelectedNote: "No payloads selected.",
      mailXssNoHitsYetNote: "No beacon hits yet.",
      toolTitle_google_dork: "Google Dork Finder",
      tabLabel_google_dork: "Google Dork",
      tabLabel_google_dork_library: "Query builder",
      tabLabel_google_dork_templates: "Presets",
      toolText_google_dork: "Compose an advanced Google search query (site:/filetype:/inurl:/intitle:/intext:, exact phrases, +include/-exclude) and open it in your browser - nothing is scraped in-app.",
      googleDorkResponsibleUseNote: "Uses only Google's own public search index - no scanning, no unauthorized access. You're responsible for what you do with anything you find.",
      googleDorkFieldsHeading: "Query builder",
      googleDorkTargetLabel: "Target (site:)",
      googleDorkPhraseLabel: "Exact phrase",
      googleDorkIncludeLabel: "Include words (+)",
      googleDorkExcludeLabel: "Exclude words (-)",
      googleDorkFiletypeLabel: "File type",
      googleDorkInurlLabel: "URL contains",
      googleDorkIntitleLabel: "Title contains",
      googleDorkIntextLabel: "Page text contains",
      googleDorkRawLabel: "Extra operators",
      googleDorkOpenBtn: "Open in Google",
      googleDorkQueryHeading: "Query",
      googleDorkQueryEmptyNote: "Fill in at least one field to build a query.",
      googleDorkHistoryHeading: "Recent queries",
      googleDorkHistoryEmptyNote: "No queries yet.",
      googleDorkHistoryUseAria: "Reuse this query",
      googleDorkHistoryDeleteAria: "Delete from history",
      googleDorkCategory_secrets: "Exposed secrets & config",
      googleDorkCategory_access: "Access panels",
      googleDorkCategory_data: "Exposed data",
      googleDorkTplEnvFile: "Exposed .env files",
      googleDorkTplGitExposed: "Exposed .git directories",
      googleDorkTplConfigFiles: "Exposed config files",
      googleDorkTplBackupFiles: "Exposed backup files",
      googleDorkTplLogFiles: "Exposed log files",
      googleDorkTplApiKeys: "Exposed API keys",
      googleDorkTplAdminPanel: "Admin panels",
      googleDorkTplLoginPages: "Login pages",
      googleDorkTplDirectoryListing: "Directory listing exposed",
      googleDorkTplSqlDump: "Exposed SQL/DB dumps",
      toolTitle_agent_profiles: "Agent Identity",
      tabLabel_agent_profiles: "Agent Identity",
      tabLabel_agent_profiles_library: "Identities",
      toolText_agent_profiles: "Your own account-creation identities for OSINT work: nickname, email, login, a masked password, notes, a photo, and file attachments - not data about the person you're investigating.",
      agentProfileNameLabel: "Name",
      agentProfileNicknameLabel: "Nickname",
      agentProfileEmailLabel: "Email",
      agentProfileLoginLabel: "Login",
      agentProfilePasswordLabel: "Password",
      agentProfileNoteLabel: "Note",
      agentProfilePhotoLabel: "Photo",
      agentProfileAttachmentsLabel: "Attachments",
      agentProfileAddBtn: "+ Add profile",
      agentProfileDeleteBtn: "Delete profile",
      agentProfileShowPasswordBtn: "Show/hide password",
      agentProfileAddAttachmentBtn: "Add file...",
      agentProfileAddPhotoBtn: "Add photo...",
      agentProfileRemoveAttachmentBtn: "Remove attachment",
      agentProfileEmptyNote: "Select or add a profile to edit it.",
      agentProfileDefaultName: "New profile",
      agentProfileCopyBtn: "Copy",
      agentProfileCopiedStatus: "Copied to clipboard",
      agentProfileServicesLabel: "Social media services",
      agentProfileAddServiceBtn: "+ Add service",
      agentProfileRemoveServiceBtn: "Delete service",
      agentProfileServiceNamePlaceholder: "Service name (e.g. Facebook)",
      agentProfileAddTextFieldBtn: "+ Text field",
      agentProfileAddPasswordFieldBtn: "+ Password field",
      agentProfileFieldLabelPlaceholder: "Field name (e.g. Login)",
      agentProfileRemoveFieldBtn: "Remove field",
      toolText_presets: "Preset catalog for scan ports with default profile controls.",
      toolText_general: "Choose which shell preferences are remembered across app restarts.",
      toolText_import_tool: "Import, list, and remove tools/extensions from JSON manifest.",
      importToolSubtitle: "Install addons from the GitHub catalog or load a manifest from a local file.",
      versionsEmptyTitle: "Versions",
      versionsEmptyText: "No version entries available.",
      versionsScrollLeftAria: "Scroll versions left",
      versionsScrollRightAria: "Scroll versions right",
      versionsTimelineAria: "Published versions timeline",
      importToolEmptyText: "No imported tools yet.",
      importToolInstallBtn: "Install",
      importToolUninstallBtn: "Uninstall",
      importToolLoadFileBtn: "Load from file...",
      importToolCatalogHeading: "Www addons",
      importToolCatalogEmpty: "No addons found in the catalog.",
      importToolCatalogError: "Could not load the addon catalog.",
      presetsListAria: "Port presets",
      presetsAddBtn: "+ Add",
      presetsDeleteBtn: "Delete",
      presetsMoveUpBtn: "Move Up",
      presetsMoveDownBtn: "Move Down",
      presetsSetDefaultBtn: "Set as default",
      presetsEditHeading: "Edit preset",
      presetsDefaultCol: "Default",
      presetsEmojiLabel: "Emoji",
      presetsNameLabel: "Name",
      presetsPortsLabel: "Ports",
      presetsHint: "Enter port numbers separated by commas, e.g. 80, 443, 8080, 554",
      presetsSaveBtn: "Save",
      resultsIpHostsLabel: "Hosts",
      resultsIpOpenPortsLabel: "Open ports",
      resultsIpNoOpenPorts: "No open ports",
      resultsIpColumnsButton: "Columns",
      resultsIpResetFilters: "Reset filters",
      resultsIpFilterTypeButton: "IP / Ports",
      resultsIpFilterTypeIp: "IP",
      resultsIpFilterTypePorts: "Ports",
      resultsIpFilterMarksButton: "Favorites / Checked",
      resultsIpFilterMarksFavorite: "Favorites",
      resultsIpFilterMarksChecked: "Checked",
      resultsIpFilterStatusButton: "Status",
      resultsIpFilterStatusActive: "Active",
      resultsIpFilterStatusUnknown: "Unknown",
      resultsIpFilterStatusDead: "Dead",
      resultsIpColumnHostname: "Hostname",
      resultsIpColumnCountryFlag: "Country Flag",
      resultsIpColumnIsp: "ISP",
      resultsIpColumnAs: "AS",
      resultsIpColumnDeviceIdentification: "Device Identification",
      resultsIpColumnLocation: "Location",
      resultsIpColumnHttpPageTitle: "HTTP Page Title",
      resultsIpColumnAccessSnapshot: "Access / Snapshot",
      resultsIpColumnBanner: "Banner Grabbing",
      resultsIpColumnSslCert: "SSL/TLS Certificate Info",
      resultsIpHeaderIpAddressPort: "IP Adress / Port",
      resultsIpHeaderPing: "Ping",
      resultsIpHeaderHostname: "Hostname",
      resultsIpHeaderFlag: "Flag",
      resultsIpHeaderIsp: "ISP",
      resultsIpHeaderAs: "AS",
      resultsIpHeaderDeviceIdentification: "Device Identification",
      resultsIpHeaderLocation: "Location",
      resultsIpHeaderHttpPageTitle: "HTTP Page Title",
      resultsIpHeaderAccessSnapshot: "Access / Snapshot",
      resultsIpHeaderBanner: "Banner Grabbing",
      resultsIpHeaderSslCert: "SSL/TLS Certificate Info",
      toolText_language_manager: "Add, activate, and review language dictionaries.",
      toolText_versions: "Application change and release history.",
      toolText_about: "Project and author information.",
      toolText_license: "License and usage terms.",
      toolText_lorem_ipsum: "Placeholder tool with static filler text.",
      assistant: "Assistant",
      toolRoute: "Tool route",
      active: "active",
      noActiveTab: "no active tab",
      menuPrefix: "Menu",
      tabPrefix: "Tab",
      tabCloseAria: "Close tab",
      extManagerTitle: "Extension Manager",
      extManifestLabel: "Manifest JSON",
      extManifestPlaceholder: "Paste extension manifest JSON",
      extUninstallLabel: "Extension id to uninstall",
      extUninstallPlaceholder: "com.example.demo",
      extInstallBtn: "Install",
      extListBtn: "List",
      extUninstallBtn: "Uninstall",
      extCloseBtn: "Close",
      extManagerReady: "Ready. Install, list, or uninstall extensions.",
      langManagerTitle: "Language Manager",
      langInstalledHeading: "Installed languages",
      langImportBtn: "Import language...",
      langCatalogHeading: "Import language",
      langCatalogEmpty: "Loading...",
      langCatalogError: "Could not load the language catalog.",
      langCatalogInstalledBadge: "✓ Installed",
      langCatalogInstallOk: "Language installed",
      langAddFail: "Language add failed",
      langActivateOk: "Language activated",
      langActivateFail: "Language activation failed",
      langListHeader: "Available languages",
      langInvalidCode: "Invalid language code",
      langInvalidDict: "Invalid language dictionary",
      forAppVersionPrefix: "For app",
      extManagerPrompt: "Extension manager: type install, list, or uninstall",
      extManifestPrompt: "Paste extension manifest JSON",
      extInvalidJson: "Invalid JSON manifest",
      extDesktopOnlyFeature: "This feature is only available in the desktop app.",
      extInstallOk: "Extension installed",
      extInstallFail: "Extension install failed",
      extListEmpty: "No installed extensions",
      extListHeader: "Installed extensions",
      extUninstallPrompt: "Type extension id to uninstall",
      extUninstallOk: "Extension uninstalled",
      extUninstallFail: "Extension uninstall failed",
      extPermissionConfirmTitle: "Extension Permissions",
      extPermissionConfirmOk: "Install",
      extPermissionConfirmPrefix: "This extension requests the following permissions:",
      extPermissionConfirmSuffix: "Only install this extension if you trust it. Continue?",
      extPermissionDeclined: "Installation cancelled - permissions not granted.",
      tabGeneralTitle: "General",
      importToolTitle: "Import Tool",
      ipLibraryTabTitle: "IP Library",
      ipLibraryTitle: "Country IP Library",
      ipLibraryNote: "Update the country range library using a local PowerShell script and keep a cached copy.",
      ipLibraryCountriesLabel: "Country codes",
      ipLibraryTopRangesLabel: "Top ranges per country",
      ipLibraryUpdateBtn: "Update (PowerShell)",
      ipLibraryLoadBtn: "Load cached",
      ipLibraryClearBtn: "Clear base",
      ipLibraryLastUpdateLabel: "Last update:",
      ipLibraryStatusEmpty: "No cached IP library data.",
      ipLibraryStatusLoaded: "Loaded",
      ipLibraryStatusUpdated: "Updated",
      ipLibraryStatusCleared: "IP library cache cleared.",
      ipLibraryStatusUpdatedAt: "Updated at:",
      ipLibraryStatusUpdating: "Updating country IP library...",
      ipLibraryStatusUpdateFailed: "IP library update failed.",
      ipLibraryStatusBadCountries: "Provide at least one 2-letter country code.",
      ipLibraryStatusInvalidCache: "Cached IP library is invalid JSON.",
      ipLibraryCentralHint: "Manage update parameters in the left IP Library panel. Current cached ranges are shown below.",
      ipLibraryTableCountry: "Country",
      ipLibraryTableAddress: "Address range",
      ipLibraryTableEmpty: "No country ranges loaded.",
      netMonConnectionsTitle: "Connections",
      netMonLanDevicesTitle: "LAN Devices",
      netMonIntervalLabel: "Interval (seconds)",
      netMonLiveStartBtn: "Start",
      netMonLiveStopBtn: "Stop",
      netMonScanBtn: "Scan",
      netMonMoveUpBtn: "Move Up",
      netMonMoveDownBtn: "Move Down",
      netMonSendTitle: "Send to IP Scanner",
      netMonSendBtn: "Send",
      netMonSendAutoLabel: "Auto-send new only (every scan)",
      netMonSendSrcConnLocal: "Connections - Local Address",
      netMonSendSrcConnRemote: "Connections - Remote Address",
      netMonSendSrcLanIp: "LAN Devices - IP Address",
      netMonColProtocol: "Protocol",
      netMonColLocalAddr: "Local Address",
      netMonColRemoteAddr: "Remote Address",
      netMonColState: "State",
      netMonColPid: "PID",
      netMonColProcess: "Process",
      netMonColIp: "IP Address",
      netMonColMac: "MAC Address",
      netMonColVendor: "Vendor",
      netMonColInterface: "Interface",
      netMonEmptyConnections: "No connections found.",
      netMonEmptyArp: "No ARP entries found.",
      netMonChangesEmpty: "No changes since the last scan.",
      netMonHistoryAppeared: "Appeared",
      netMonHistoryDisappeared: "Disappeared",
      netMonKeepChangesLabel: "Keep changes visible",
      netMonModeActual: "Current only",
      netMonModeAll: "All",
      netMonModeChanges: "Changes only",
      netMonViewFlat: "Flat",
      netMonViewGroupProcess: "Group by Process",
      netMonViewGroupPid: "Group by PID",
      netMonViewGroupProtocol: "Group by Protocol",
      netMonViewGroupLocal: "Group by Local Address",
      netMonViewGroupRemote: "Group by Remote Address",
      netMonViewGroupState: "Group by State",
      netMonViewGroupVendor: "Group by Vendor",
      netMonViewGroupInterface: "Group by Interface",
      netMonViewGroupIp: "Group by IP",
      netMonViewGroupMac: "Group by MAC",
      emailReconInputLabel: "Email",
      emailReconInputPlaceholder: "name@example.com",
      emailReconHistoryTitle: "Recent Lookups",
      emailReconHistoryEmpty: "No lookups yet.",
      emailReconHistoryUseAria: "Use this email",
      emailReconHistoryDeleteAria: "Delete from history",
      emailReconProfilesTitle: "Profiles",
      emailReconProfilesEmpty: "No profiles yet.",
      emailReconProfileNamePlaceholder: "Profile name",
      emailReconProfileAddAria: "Add profile",
      emailReconProfileDeleteAria: "Delete profile",
      emailReconProfileNameRequired: "Enter a profile name.",
      emailReconSourcesTitle: "Sources",
      emailReconSrcEmailrep: "emailrep.io",
      emailReconSrcGravatar: "Gravatar",
      emailReconSrcGithub: "GitHub",
      emailReconSrcHibpBreaches: "HIBP Breaches",
      emailReconSrcHibpPastes: "HIBP Pastes",
      emailReconSrcEmailrepHelp: "Email reputation service - flags whether the address looks deliverable/active and lists other services it's been publicly seen on.",
      emailReconSrcGravatarHelp: "Global avatar service - returns a public profile (photo, display name, linked profiles) if one was ever created for this email.",
      emailReconSrcGithubHelp: "Official GitHub search - finds accounts that have this email set as public in their profile (hidden by default).",
      emailReconSrcHibpBreachesHelp: "Have I Been Pwned - lists known data breaches (e.g. LinkedIn 2016) that included this email address.",
      emailReconSrcHibpPastesHelp: "Have I Been Pwned - checks public paste sites (like Pastebin) for leaked data mentioning this email.",
      emailReconSrcXposedornot: "XposedOrNot",
      emailReconSrcXposedornotHelp: "Free breach-checking service, no API key needed - lists known data breaches that included this email address.",
      emailReconSrcLeakcheck: "LeakCheck",
      emailReconSrcLeakcheckHelp: "Free public breach-checking API, no key needed - checks this email against LeakCheck's leaked-data index.",
      emailReconAttributionPrefix: "Powered by",
      emailReconApiKeysTitle: "API Keys",
      emailReconHibpKeyLabel: "HIBP API key",
      emailReconHibpKeyPlaceholder: "hibp-api-key",
      emailReconColSource: "Source",
      emailReconColStatus: "Status",
      emailReconColSummary: "Summary",
      emailReconColDetail: "Detail",
      emailReconEmptyResults: "Run a lookup to see results.",
      emailReconHitCount: "{n} of {total} sources found a match",
      emailReconSummaryExistsYes: "Likely a real, active email",
      emailReconSummaryExistsNo: "No hits found",
      emailReconSummaryExistsUnknown: "Inconclusive",
      emailReconStatusFound: "Found",
      emailReconStatusNotFound: "Not found",
      emailReconStatusError: "Error",
      emailReconStatusSkippedNoKey: "Skipped (no API key)",
      emailReconStatusSkippedDisabled: "Skipped (disabled)",
      emailReconInvalidEmail: "Enter a valid email address.",
      emailReconNoSourcesSelected: "No sources selected - enable at least one in Email Recon Config.",
      statusEmailReconStart: "Email Recon: lookup started",
      statusEmailReconStop: "Email Recon: stopped",
      statusEmailReconDone: "Email Recon: lookup complete",
      statusEmailReconHistoryDeleted: "Email Recon: removed from history",
      statusEmailReconHistorySaveFailed: "Email Recon: failed to save history",
      statusProfileEmailReconAdded: "Email Recon profile added",
      statusProfileEmailReconLoaded: "Email Recon profile loaded",
      helpAboutTitle: "About",
      helpLicenseTitle: "License",
      tabAboutTitle: "About",
      tabLicenseTitle: "License",
      aboutHeading: "OSINT NET Auditor",
      aboutVersionLabel: "Automatic version from one source:",
      aboutByAuthor: "by Michal Stankiewicz",
      aboutSpecialThanksHeading: "Special thanks to:",
      aboutTestersLabel: "Testers: tBane -",
      aboutVibecodingNote: "This application is entirely created using vibecoding by an amateur. It is, and always will be, free along with all its add-ons.",
      aboutSupportHeading: "Do you like what I build?",
      aboutSupportBody: "If my work inspired you or helped in real use, you can support further development:",
      aboutSupportQuick: "Quick support: Bank transfer or BLIK to phone:",
      aboutSupportPhone: "+48 797 486 355",
      aboutSupportContact: "Stay in touch: Facebook",
      aboutSupportFacebook: "facebook.com/MajkelMajkel",
      aboutProjectPageLabel: "Project page:",
      aboutProjectPageUrl: "facebook.com/OSINTNETAuditor",
      aboutTransferHeading: "Transfer details:",
      aboutTransferName: "Michal Stankiewicz",
      aboutTransferCity: "02-585 Warszawa",
      aboutTransferBank: "PKO BP",
      aboutTransferIban: "IBAN: PL55 1020 1097 0000 7902 0226 5353",
      aboutTransferTitle: "Title: \"inspiracja\"",
      aboutTotalCostsHeading: "My total costs:",
      aboutTotalCostClaude: "claude - 22.14€",
      aboutTotalCostDomains: "domains - $4",
      aboutTotalCostCopilot: "github copilot - $78.00",
      aboutTotalCostOther: "other expenses - $12",
      aboutTotalCostAds: "ads - $16",
      aboutZrzutkaLabel: "Support via Zrzutka (fundraiser):",
      aboutZrzutkaUrl: "zrzutka.pl/msa2pj",
      licenseHeading: "MIT License",
      scannerDetectIp: "Detect IP",
      scannerExternalIp: "External IP",
      scannerLocalIp: "Local IP",
      scannerSubnets: "Subnets",
      scannerIpRange: "IP Range",
      scannerRangeModeRange: "Range",
      scannerRangeModeCidr: "CIDR",
      scannerModeIcmp: "ICMP",
      scannerFrom: "From",
      scannerTo: "To",
      scannerPorts: "Ports",
      scannerStart: "Start",
      scannerStop: "Stop",
      scannerClear: "Clear",
      scannerPortPresets: "Port Presets",
      scannerIpExtractor: "IP Extractor",
      scannerExtractorPlaceholder: "example.com 192.168.1.10",
      scannerAddExtract: "Add / Extract",
      scannerExtractedPlaceholder: "Extracted IPs...",
      scannerRangeHistory: "Range History",
      scannerNoRangeHistory: "No scan ranges yet.",
      scannerHistoryUseAria: "Use range",
      scannerHistoryDeleteAria: "Delete range",
      scannerProfilesTitle: "Profiles",
      scannerProfileNamePlaceholder: "Profile name",
      scannerProfileColorAria: "Profile color",
      scannerProfileAddAria: "Add profile",
      scannerProfileDeleteAria: "Delete profile",
      scannerProfileSelectLabel: "Profile",
      scannerProfileNone: "—",
      statusProfileNameRequired: "Enter a profile name first",
      statusProfileAdded: "Profile added:",
      statusProfileDeleted: "Profile deleted",
      statusProfileLoaded: "Profile loaded:",
      configGroupProtocol: "Protocol",
      configProtocolTcpEnabled: "TCP Connect",
      configProtocolTcpSyn: "TCP SYN",
      configProtocolUdp: "UDP",
      configGroupPerformance: "Performance",
      configHostTimeout: "Host timeout (ms)",
      configMaxConcurrentHosts: "Max concurrent hosts",
      configMaxConcurrentPorts: "Max concurrent ports per host",
      configRetries: "Retries",
      configGroupDetect: "Detect",
      configDetectServiceProbing: "Service Probing",
      configDetectHostEnrichment: "Host Enrichment",
      configReverseDns: "Reverse DNS",
      configBannerGrabbing: "Banner Grabbing",
      configSslCertInfo: "SSL/TLS Certificate Info",
      configOsDetection: "OS Detection",
      configGroupSecurity: "Security",
      configRandomizePorts: "Randomize ports",
      configRandomizeHosts: "Randomize hosts",
      configScanDelay: "Scan delay (ms)",
      statusScanStart: "Scan started:",
      statusScanStop: "Scan finished",
      statusScanClear: "Scan results cleared",
      statusTcpSynNotImplemented: "TCP SYN scanning is not implemented yet",
      statusNoProtocolSelected: "Select at least one protocol (TCP, UDP, or ICMP) to scan",
      statusUdpAmbiguityNote: "UDP: no response may mean open or filtered, marked accordingly",
      statusUdpAloneNote: "UDP alone can't confirm a host is alive - enable TCP or ICMP too for reliable detection",
      portStatusOpenFiltered: "open?",
      portStatusOpenFilteredTitle: "No response - port may be open or silently filtered, can't tell which",
      statusExternalIp: "External IP:",
      statusLocalIp: "Local IP:",
      statusSubnet: "Subnet:",
      macroExtIpName: "Detect External IP",
      macroLocalIpName: "Detect Local IP",
      macroSubnetsName: "Detect Subnets",
      macroRunBtn: "Run",
      statusMacroRun: "Macro run",
      statusMacroRunFailed: "Macro run failed (target action not found)",
      macroHelpHint: "Write help or ? to see macro list",
      macroUnknownCommand: "Unknown macro",
      statusRangeSet: "IP Range set:",
      statusRangeRecalled: "IP Range recalled:",
      statusRangeDeleted: "Range removed from history",
      statusRangeHistoryInvalid: "Range history: invalid range, not recorded",
      statusRangeHistorySaveFailed: "Range history: save failed",
      statusBlurIpOn: "IP blur enabled",
      statusBlurIpOff: "IP blur disabled",
      statusUnfinishedToolsOn: "Unfinished tools shown",
      statusUnfinishedToolsOff: "Unfinished tools hidden",
      statusDemoDataOn: "Demo data mode enabled",
      statusDemoDataOff: "Demo data mode disabled",
      statusExtractorNoInput: "IP Extractor: no input",
      statusExtractorAdded: "IP Extractor: added",
      statusExtractorUnresolved: "unresolved",
      statusDesktopOnlyShort: "desktop only",
      statusDesktopOnlySuffix: " (desktop only)",
      statusErrorShort: "error",
      statusCommandFailed: "command failed",
      statusExternalIpDesktopOnly: "External IP: desktop only",
      statusExternalIpNoOutput: "External IP: no output",
      statusExternalIpCommandFailed: "External IP: command failed",
      statusLocalIpDesktopOnly: "Local IP: desktop only",
      statusLocalIpNoOutput: "Local IP: no output",
      statusLocalIpCommandFailed: "Local IP: command failed",
      statusSubnetsDesktopOnly: "Subnets: desktop only",
      statusSubnetsNoOutput: "Subnets: no output",
      statusSubnetsCommandFailed: "Subnets: command failed",
      statusProcNoActive: "No active processes",
      statusProcTooltipHeader: "Active processes:",
      statusProcScanRange: "Scan IP range",
      statusProcDetectExternalIp: "Detect external IP",
      statusProcDetectLocalIp: "Detect local IP",
      statusProcDetectSubnets: "Detect subnets",
      panelHideLeft: "Hide left section",
      panelRestoreLeft: "Restore left section",
      panelHideRight: "Hide right section",
      panelRestoreRight: "Restore right section",
      panelHideBottom: "Hide bottom section",
      panelRestoreBottom: "Restore bottom section",
      scannerTipDetectExternal: "Detect your external/public IP",
      scannerTipDetectLocal: "Detect your local LAN IP",
      scannerTipDetectSubnets: "Detect local subnets",
      scannerTipUseDetectedRange: "Use detected IP/subnet as the scan range",
      scannerTipStart: "Start scan for current range",
      scannerTipStop: "Stop current scan",
      scannerTipClear: "Clear current scan state",
      scannerTipPortPresets: "Open the Port Presets tab",
      scannerTipAddExtract: "Add IPs and resolve domains to IP",
      tipMenuGroupFile: "Session operations: save, load, close, import, and exit.",
      tipMenuGroupOptions: "Scan configuration, UI language, and extensions.",
      tipMenuGroupTools: "Switch between diagnostic tools.",
      tipMenuGroupHelp: "Version, download, and assistant information.",
      tipActionNewSession: "Close current session and start a new one.",
      tipActionSaveSession: "Save current session.",
      tipActionLoadSession: "Load saved session.",
      tipActionCloseSession: "Close active session.",
      tipActionImportAnotherSession: "Import data from another session.",
      tipActionSaveSessionAs: "Save current session under a new name.",
      tipActionExit: "Exit application.",
      sessionSaveOk: "Session saved",
      sessionSaveFailed: "Session save failed",
      sessionSqliteEngineLoading: "Loading SQLite engine…",
      sessionSaveRetry: "Save failed, choose a location to save to",
      sessionLoadOk: "Session loaded",
      sessionLoadFailed: "Session load failed",
      sessionLoadEmpty: "Session file not found",
      sessionVersionMismatchTitle: "Version mismatch",
      sessionVersionMismatchMessage: "This session was saved with app version {saved}, but you're running {current}.",
      sessionVersionMismatchOk: "OK",
      sessionMissingAddonsTitle: "Missing addons",
      sessionMissingAddonsMessage: "This session used addon(s) that aren't installed right now. Select which ones to install:",
      sessionMissingAddonsInstall: "Install selected",
      sessionMissingAddonsSkip: "Skip",
      sessionCloseConfirm: "Close the current session? Open tabs and scan results will be cleared.",
      sessionCloseConfirmTitle: "Close Session",
      sessionCloseConfirmOk: "Close",
      sessionCloseOk: "Session closed",
      sessionNewConfirm: "Start a new session? Open tabs and scan results will be cleared.",
      sessionNewConfirmTitle: "New Session",
      sessionNewConfirmOk: "New",
      sessionListEmpty: "No recent sessions yet.",
      sessionWelcomeTitle: "Recent sessions",
      sessionRemoveFromList: "Remove from list",
      sessionNoneLabel: "No active session",
      sessionTabsLabel: "tabs",
      exitPromptSaveChanges: "Save changes before exit?",
      exitPromptSaveAndExit: "Save and exit",
      exitPromptExitWithoutSave: "Exit without saving",
      exitPromptCancel: "Cancel",
      exitPromptCancelled: "Exit cancelled",
      exitDialogTitle: "Exit Application",
      exitDialogMessage: "Do you want to save changes before closing?",
      updateAvailableTitle: "Update available",
      updateAvailableMessage: "A newer version is available:",
      updateAvailableDownload: "Download",
      updateAvailableLater: "Later",
      tipActionCountries: "Country-based IP range library.",
      tipActionPresets: "Manage port presets.",
      tipActionLanguage: "Add and activate UI languages.",
      tipActionGeneral: "Choose which shell preferences are remembered at next launch.",
      generalIntroNote: "Choose which preferences should be remembered the next time you launch the app.",
      generalGroupSession: "Session",
      generalAutoLoadLastSession: "Auto Load last session",
      generalGroupUpdates: "Updates",
      generalCheckForUpdates: "Check for updates on startup",
      generalGroupAppearance: "Appearance",
      generalPanelSideRight: "Swap panel sides (activity bar/LS on the right, RS on the left)",
      generalRememberLanguage: "Remember UI language",
      generalRememberSkin: "Remember skin / theme",
      generalUiSwitchLabel: "UI",
      generalUiSwitchDefault: "Default",
      generalUiSwitchTest: "Test",
      generalRememberPanelSizes: "Remember panel sizes and collapsed state",
      generalGroupPrivacyTools: "Privacy & tools",
      generalRememberBlurIp: "Remember \"Blur IP addresses\" state",
      generalRememberShowUnfinishedTools: "Remember \"Show unfinished tools\" state",
      generalGroupWindows: "Windows",
      generalRememberWindowState: "Remember window state (windowed / maximized / fullscreen)",
      generalRememberDetachedWindows: "Remember detached window layout",
      generalRememberOpenTabs: "Remember open tabs (LS/RS/CS)",
      generalGroupAssistant: "Assistant",
      generalRememberClippyEnabled: "Remember Clippy enabled state",
      generalGroupAddons: "Addons",
      generalRememberExtensions: "Remember installed addons",
      generalExtensionsCautionNote: "If unchecked, installed addons will need to be reinstalled every time the app starts.",
      generalGroupHistory: "History",
      generalRememberRangeHistory: "Remember IP range history",
      generalGroupAiAssistant: "AI Assistant",
      aiFieldProvider: "Provider:",
      aiFieldModel: "Model:",
      aiFieldStorage: "Storage:",
      aiApiKeyLabel: "API key:",
      aiApiKeyPlaceholder: "API key",
      generalGroupGoogleDorkApi: "Google Dork API",
      googleDorkApiKeyLabel: "API key:",
      googleDorkApiKeyPlaceholder: "Custom Search API key",
      googleDorkApiCxLabel: "Search engine ID:",
      googleDorkApiCxPlaceholder: "Search engine ID (cx)",
      googleDorkApiCxLinkText: "create one",
      googleDorkApiNote: "Not used yet - saved for a future \"extract results\" feature on Google Dork Finder.",
      generalGroupFirebaseConfig: "Firebase (Communicator)",
      firebaseConfigApiKeyLabel: "API key:",
      firebaseConfigApiKeyPlaceholder: "apiKey",
      firebaseConfigAuthDomainLabel: "Auth domain:",
      firebaseConfigAuthDomainPlaceholder: "authDomain",
      firebaseConfigProjectIdLabel: "Project ID:",
      firebaseConfigProjectIdPlaceholder: "projectId",
      firebaseConfigOauthClientIdLabel: "OAuth client ID (Desktop app type):",
      firebaseConfigOauthClientIdPlaceholder: "...apps.googleusercontent.com",
      firebaseConfigClientSecretLabel: "OAuth client secret:",
      firebaseConfigClientSecretPlaceholder: "GOCSPX-...",
      firebaseConfigNote: "First 3 fields: Firebase Console -> Project settings -> Your apps -> Web app config. OAuth client ID + secret: Google Cloud Console -> Credentials -> Create Credentials -> OAuth client ID -> Desktop app.",
      toolTitle_komunikator: "Communicator",
      tabLabel_komunikator: "Communicator",
      tabLabel_komunikator_library: "Account",
      tabLabel_komunikator_members: "Members",
      toolText_komunikator: "Sign in with Google - group chat with a few invited friends is coming in a future update.",
      komunikatorAccountHeading: "Google account",
      komunikatorSignInBtn: "Sign in with Google",
      komunikatorSignOutBtn: "Sign out",
      komunikatorSigningInNote: "Waiting for you to finish signing in in your browser...",
      komunikatorSignedInAs: "Signed in as:",
      komunikatorErrorPrefix: "Sign-in failed:",
      komunikatorErrorMissingConfig: "Fill in the Firebase config in Options -> General first.",
      komunikatorStatusHeading: "Account",
      komunikatorNotAMemberNote: "You're signed in but haven't joined the room yet - enter an invite code in the Members panel.",
      komunikatorNoMessagesYetNote: "No messages yet - say hello!",
      komunikatorMessagePlaceholder: "Type a message... (Enter to send, Shift+Enter for a new line)",
      komunikatorMembersHeading: "Members",
      komunikatorMembersSignInFirstNote: "Sign in first (Account tab) to see members or join the room.",
      komunikatorNoMembersYetNote: "No members yet.",
      komunikatorInviteHeading: "Invite",
      komunikatorGenerateInviteBtn: "Generate invite code",
      komunikatorInviteCodeNote: "Share this code with a friend - it works once.",
      komunikatorJoinCodeLabel: "Invite code",
      komunikatorJoinBtn: "Join room",
      aiGetKeyLinkText: "get API key",
      aiStorageLocal: "local",
      aiModelOpus: "Opus",
      aiModelSonnet: "Sonnet",
      aiModelHaiku: "Haiku",
      aiModelPro: "Pro",
      aiModelFlash: "Flash",
      aiManagePermissionsBtn: "Manage AI Tools & Permissions...",
      aiPermTitle: "AI Tools & Permissions",
      aiPermIntroNote: "UI only for now - these settings don't affect the assistant's behavior yet.",
      aiPermGroupProfile: "Profile",
      aiPermProfileReadonly: "Read-only",
      aiPermProfileAssisted: "Assisted",
      aiPermProfileAutonomous: "Autonomous",
      aiPermProfileCustom: "Custom",
      aiPermGroupAccess: "Tool Access",
      aiPermLevel_off: "Off",
      aiPermLevel_auto: "Auto",
      aiPermLevel_ask: "Ask",
      aiPermLevelMixed: "Mixed",
      aiPermLockedNote: "Locked - always requires confirmation",
      aiPermUnavailableNote: "Not yet wired up to a real AI call",
      aiPermPriorityLabel: "Priority on conflict (tree vs. macro)",
      aiPermPriorityRestrictive: "Most restrictive wins (recommended)",
      aiPermPriorityTool: "Priority: tool",
      aiPermPriorityMacro: "Priority: macro",
      aiPermGroupGuardrails: "Guardrails",
      aiPermMaxActionsLabel: "Max actions per conversation",
      aiPermLockSettingsLabel: "Block further changes",
      aiPermGroupAuditLog: "Audit Log",
      aiPermClearLogBtn: "Clear log",
      aiPermExportLogBtn: "Export log",
      aiPermLogEmpty: "No actions logged yet.",
      aiPermNodeEmailRecon: "📧 Email Recon",
      aiPermNodeEmailReconLookup: "Run lookup",
      aiPermNodeEmailReconHibp: "HIBP (paid)",
      aiPermNodeEmailReconHistory: "Read history",
      aiPermNodeNetworkMonitor: "🖧 Network Monitor",
      aiPermNodeNetworkMonitorRead: "Read data",
      aiPermNodeNetworkMonitorLive: "Start/stop live monitoring",
      aiPermNodeNetworkMonitorSend: "Send IPs to scanner",
      aiPermNodeIpScanner: "🔍 IP Scanner",
      aiPermNodeIpScannerRead: "Read results",
      aiPermNodeIpScannerScan: "Start scan",
      aiPermNodeMacros: "🧩 Macros",
      aiPermNodeNavigation: "🔀 Navigation",
      aiPermNodeNavigationSwitch: "Switch tool/tab",
      aiPermNodeNavigationOpenTab: "Open tab",
      aiPermNodeNavigationCloseTab: "Close tab",
      toolTitle_ai_permissions: "AI Tools & Permissions",
      toolText_ai_permissions: "Manage what the AI assistant is allowed to see and do across the app's tools.",
      tabLabel_ai_permissions: "AI Permissions",
      aiToolConfirmTitle: "Confirm AI action",
      aiToolConfirmMessage: "The assistant wants to run: {action} {args}",
      aiToolConfirmOk: "Allow",
      aiToolMetaBlocked: "Blocked (Off in AI Permissions): {action}",
      aiToolMetaGuardrail: "Skipped (max actions per conversation reached): {action}",
      aiToolMetaDeclined: "Declined: {action}",
      aiToolMetaDone: "{action} - done",
      aiToolMetaFailed: "{action} - {reason}",
      aiToolMaxRoundsReached: "Reached the internal tool-call round limit for this reply.",
      aiToolHibpConfirmTitle: "Include HIBP (paid)?",
      aiToolHibpConfirmMessage: "This lookup would also query Have I Been Pwned, which uses a paid API key. Include it?",
      aiToolHibpConfirmOk: "Include HIBP",
      aiSystemPromptUiLabel: "System prompt (UI mode)",
      aiSystemPromptPsLabel: "System prompt (PS mode)",
      aiSystemPromptRestoreBtn: "Restore default",
      aiModeUiCheckboxTitle: "Quick safety switch for the assistant's tool access (tool-calling, navigation, macros). Unchecking it does not stop the assistant from replying - it just takes away its ability to act, so it can only chat.",
      aiModeBadgeTitle: "Click to open AI Properties (token/round limits) for the active provider.",
      aiUiModeEnabledNote: "UI mode enabled.",
      aiUiModeDisabledNote: "UI mode disabled.",
      aiStopBtnTitle: "Stop",
      aiToolStoppedNote: "Stopped.",
      aiClearHistoryBtnTitle: "Clear chat history",
      aiClearHistoryConfirmTitle: "Clear chat history?",
      aiClearHistoryConfirmMessage: "This deletes the whole conversation and resets the action-count guardrail. This can't be undone.",
      aiClearHistoryConfirmOk: "Clear",
      aiPropertiesTitle: "AI Properties",
      aiPropertiesActiveNote: "Active provider",
      aiPropMaxTokensLabel: "Max output tokens",
      aiPropMaxRoundsLabel: "Max rounds per conversation",
      aiPropTokenCounterLabel: "Estimated tokens counter",
      aiTokenCounterUnit: "tokens",
      aiTokenCounterTotalLabel: "total",
      tipActionCustomization: "Open the Import Tool panel.",
      tipActionVersions: "Application version information.",
      tipActionDownload: "Application download links.",
      tipActionAbout: "Project information.",
      tipActionLicense: "License information.",
      tipActionAssistant: "Show or hide the Clippy assistant.",
      tipActionWindowMin: "Minimize application window.",
      tipActionWindowMax: "Maximize application window.",
      tipActionWindowFullscreen: "Toggle fullscreen mode.",
      tipActionAutoArrange: "Automatically arrange detached windows.",
      tipActionWindowClose: "Close application window.",
      tipActionBlurIp: "Blur visible IP addresses/hostnames (safe screen sharing).",
      tipActionShowUnfinishedTools: "Show/hide unfinished tools in the Tools menu and LRSB.",
      tipActionDemoData: "Enable demo data mode - new tool entries are tagged as demo so they can be bulk-removed without touching real data.",
      devFullResetButtonTitle: "Dev full reset button",
      devFullResetConfirmTitle: "Full Reset",
      devFullResetConfirmMessage: "Reset app memory and clear all saved state? The app will reload.",
      devFullResetConfirmOk: "Reset",
      blurIpSoonButtonTitle: "Blur IP addresses",
      autoArrangeOnUndockTitle: "Auto arrange when tabs are opened in floating windows",
      autoArrangeOnUndockPrefix: "auto arrange on undock",
      stateEnabled: "enabled",
      stateDisabled: "disabled",
      detachedSwapTitle: "Swap content with another window",
      detachedDockTitle: "Dock tab back",
      detachedUndockTitle: "Open tab in floating window",
      detachedNoWindowsToArrange: "no detached windows to arrange",
      detachedAutoArrangedPrefix: "auto-arranged",
      detachedWindowsLabel: "windows",
      detachedLayoutReset: "floating layout reset",
      detachedDocked: "docked",
      detachedUndocked: "undocked",
      detachedClosed: "closed",
      tipPanelActivityBar: "Quick icons for switching primary tools.",
      tipPanelSidebar: "Tool and scanner controls sidebar.",
      tipPanelEditor: "Main work area for the active tool.",
      tipPanelConsole: "Diagnostic log and macro console.",
      tipPanelAssistant: "AI assistant panel and analysis threads.",
      tipPanelStatusBar: "Session and active tool status bar.",
      clippyOn: "Clippy on",
      clippyOff: "Clippy off",
      clippyCloseAria: "Close assistant",
      clippyTip1: "Need a quick start? Set an IP range and click Start.",
      clippyTip2: "Use the Results Browser to switch between IP Results, IP Library, and Presets views.",
      clippyTip3: "You can manage extensions and languages in Options -> Customization.",
      clippyTip4: "Tip: click me to rotate hints instantly.",
      psConsolePlaceholder: "Type PowerShell command and press Enter",
      psConsoleReady: "PowerShell integrated console ready.",
      psConsoleRunning: "Running PowerShell command...",
      psConsoleDesktopOnly: "PowerShell execution is available only in desktop (Tauri) mode.",
      psConsoleExecFailed: "PowerShell execution failed:",
    },
    pl: {
      menuFile: "Plik",
      menuOptions: "Opcje",
      menuTools: "Narzędzia",
      menuHelp: "Pomoc",
      menuFileNew: "Nowy",
      menuFileOpen: "Otwórz",
      menuFileOpenRecent: "Otwórz ostatnie",
      menuFileImport: "Importuj",
      menuFileSave: "Zapisz",
      menuFileSaveAs: "Zapisz jako...",
      menuFileClose: "Zamknij",
      menuFileExit: "Wyjście",
      menuOptionsCountries: "Biblioteka IP krajów...",
      menuOptionsPresets: "Presety portów...",
      menuOptionsLanguage: "Język...",
      menuOptionsGeneral: "Ogólne...",
      menuOptionsImportTool: "Import narzędzia...",
      menuToolsAiAssistant: "Asystent AI",
      menuHelpVersions: "Wersje",
      menuHelpDownload: "Pobierz",
      windowMinimizeTitle: "Minimalizuj",
      windowMaximizeTitle: "Maksymalizuj",
      windowFullscreenTitle: "Pełny ekran",
      windowCloseTitle: "Zamknij",
      showUnfinishedToolsTitle: "Pokaż nieukończone narzędzia",
      demoDataButtonTitle: "Tryb danych przykładowych",
      autoArrangeWindowsBtnTitle: "Automatyczne rozmieszczanie okien",
      explorer: "Eksplorator",
      ipScanner: "Skaner IP",
      resultsSidebarTitle: "Wyniki",
      resultsBrowser: "Lista danych wynikowych",
      resultsIp: "Wyniki IP Scan",
      tabResultsIp: "Wyniki IP",
      tabPresetsTitle: "Presety",
      tabScrollLeft: "Przewiń zakładki w lewo",
      tabScrollRight: "Przewiń zakładki w prawo",
      terminalTab: "Terminal",
      consoleTab: "Konsola",
      toolTitle_scan_runner: "Scan Runner",
      toolTitle_globe: "Glob",
      toolTitle_ip_library: "Biblioteka IP",
      toolTitle_shellcraft: "ShellCraft",
      toolTitle_presets: "Presety portow",
      toolTitle_general: "Ogolne",
      toolTitle_import_tool: "Import Tool",
      toolTitle_language_manager: "Menedzer jezykow",
      toolTitle_versions: "Wersje",
      toolTitle_about: "O aplikacji",
      toolTitle_license: "Licencja",
      toolTitle_lorem_ipsum: "Lorem Ipsum",
      toolTitle_results_ip: "Lista danych wynikowych",
      toolTitle_network_monitor: "Monitor Sieci",
      toolTitle_email_recon: "Email Recon",
      tabLabel_language_manager: "Język",
      tabLabel_versions: "Wersje",
      tabLabel_shellcraft: "ShellCraft",
      tabLabel_globe: "Globus",
      tabLabel_network_monitor: "Monitor Sieci",
      tabLabel_email_recon: "Email Recon",
      tabLabel_email_recon_config: "Konfiguracja Email Recon",
      tabLabel_ai_properties: "Wlasciwosci AI",
      tabLabel_config: "Konfiguracja",
      tabLabel_shellcraft_library: "Biblioteka",
      tabLabel_shellcraft_inspector: "Inspektor",
      toolResultsIpTitle: "Lista danych wynikowych",
      toolResultsIpText: "Tabela wykrytych hostów, portów i wzbogaconych danych.",
      toolText_results_ip: "Tabela wykrytych hostow, portow i wzbogaconych danych.",
      toolText_scan_runner: "Zakres IP, presety portów, równoległe sondowanie i zapis wyników.",
      toolText_globe: "Interaktywny globus 3D pokazujący zeskanowane hosty wg geolokalizacji, pobieranej na żądanie.",
      globeLoading: "Ladowanie globu...",
      globeEmptyNoResults: "Najpierw uruchom skan - nie ma jeszcze hostow do wyswietlenia.",
      globeEmptyNoGeo: "Nie udalo sie ustalic lokalizacji zadnego zeskanowanego hosta.",
      globeLoadError: "Nie udalo sie zaladowac globu.",
      toolText_network_monitor: "Lokalne połączenia TCP/UDP z nazwami procesów właściciela oraz tabela ARP sieci LAN z rozpoznawaniem producenta.",
      toolText_email_recon: "Sprawdź adres e-mail w źródłach OSINT: wycieki, pasty i publiczne profile.",
      toolText_ip_library: "Biblioteka zakresow IP krajow z aktualizacja przez PowerShell i cache lokalnym.",
      toolText_shellcraft: "ShellCraft to wizualny edytor bloków: przeciągaj bloki z Biblioteki na canvas, edytuj je w Inspektorze i uruchamiaj makra.",
      shellcraftSidebarTitle: "ShellCraft",
      shellcraftLibraryFunctionalHeading: "Funkcjonalne",
      shellcraftLibraryMacrosHeading: "Makra",
      shellcraftBlockIfLabel: "If",
      shellcraftBlockRepeatUntilLabel: "Repeat Until",
      shellcraftBlockPowerShellLabel: "PowerShell",
      shellcraftBlockTimeTriggerLabel: "Wyzwalacz czasowy",
      shellcraftBlockNotRunnableNote: "Jeszcze niezaimplementowane",
      shellcraftBlockDeleteBtn: "Usun blok",
      shellcraftViewFlowLabel: "Flow",
      shellcraftViewTimelineLabel: "Timeline",
      shellcraftViewTreeLabel: "Drzewo",
      shellcraftViewLayeredLabel: "Warstwy",
      shellcraftViewNotImplementedNote: "Jeszcze niezaimplementowane",
      statusBlockNotExecutable: "Ten typ bloku nie jest jeszcze wykonywalny",
      shellcraftInspectorEmptyNote: "Kliknij blok na plotnie, aby zobaczyc jego wlasciwosci.",
      shellcraftInspectorMacroNameLabel: "Makro",
      shellcraftInspectorMacroActionLabel: "Wywoluje akcje",
      shellcraftInspectorConditionLabel: "Warunek",
      shellcraftInspectorMaxIterationsLabel: "Maks. iteracji",
      shellcraftInspectorCommandLabel: "Komenda",
      shellcraftInspectorTimeLabel: "Godzina (GG:MM)",
      shellcraftInspectorIntervalMinutesLabel: "Powtarzaj co (minuty, 0 = wylaczone)",
      shellcraftInspectorRunBtn: "Uruchom",
      toolTitle_pulpit: "Topologia",
      tabLabel_pulpit: "Topologia",
      tabLabel_pulpit_library: "Biblioteka",
      tabLabel_pulpit_inspector: "Inspektor",
      toolTitle_pulpit_preview: "Podglad pulpitu",
      tabLabel_pulpit_preview: "Podglad",
      tabLabel_pulpit_preview_list: "Kamery",
      toolText_pulpit_preview: "Zywy podglad VNC pulpitu wezla z Topologii - ustaw port VNC na wezle w Inspektorze, potem kliknij Podglad. Tylko aplikacja desktopowa.",
      toolText_pulpit: "Recznie prowadzona wizualna topologia sieci: umieszczaj komputery, serwery, switche, drukarki, routery, maszyny wirtualne i ikony Skanera/Sniffera, lacz je, edytuj pola wlasciwe dla typu i prowadz notatki - albo zbuduj mape automatycznie z ostatniego skanu IP.",
      pulpitLibraryHeading: "Dodaj komputer",
      pulpitAddRemoteBtn: "Komputer zdalny",
      pulpitAddLocalBtn: "Komputer lokalny",
      pulpitAddVirtualBtn: "Maszyna wirtualna",
      pulpitAddOwnBtn: "Wlasne urzadzenie",
      pulpitDefaultNameRemote: "Komputer zdalny",
      pulpitDefaultNameLocal: "Komputer lokalny",
      pulpitDefaultNameVirtual: "Maszyna wirtualna",
      pulpitDefaultNameOwn: "Wlasne urzadzenie",
      pulpitNodeDeleteBtn: "Usun komputer",
      pulpitInspectorEmptyNote: "Wybierz komputer na plotnie, aby zobaczyc jego wlasciwosci.",
      pulpitInspectorTypeLabel: "Typ",
      pulpitInspectorNameLabel: "Nazwa",
      pulpitInspectorHostLabel: "IP / host",
      pulpitConnRdpLabel: "RDP",
      pulpitConnVncLabel: "VNC",
      pulpitHypervisorQemuLabel: "QEMU",
      pulpitHypervisorVbLabel: "VirtualBox",
      pulpitRdpConnectBtn: "Polacz przez RDP",
      pulpitHypervisorQemuVncHint: "QEMU udostepnia VNC natywnie (-vnc ADDR:N wiaze port 5900+N) - zadnego oprogramowania wewnatrz goscia.",
      pulpitHypervisorVbVncHint: "VirtualBox nie ma natywnego VNC - najpierw zainstaluj serwer VNC wewnatrz goscia (np. TigerVNC, tryb User-Mode).",
      pulpitVncNeedsHypervisorNote: "Zaznacz najpierw QEMU albo VirtualBox powyzej - host/port VNC zalezy od tego, kto zarzadza ta VM.",
      pulpitInspectorVncPortLabel: "Port VNC",
      pulpitInspectorNoteLabel: "Notatka",
      pulpitTypeRemoteLabel: "Zdalny",
      pulpitTypeLocalLabel: "Lokalny",
      pulpitTypeVirtualLabel: "Wirtualny",
      pulpitTypeOwnLabel: "Wlasny",
      pulpitAddServerBtn: "Serwer",
      pulpitAddSwitchBtn: "Switch",
      pulpitAddPrinterBtn: "Drukarka",
      pulpitAddRouterBtn: "Router",
      pulpitAddScannerBtn: "Skaner",
      pulpitAddSnifferBtn: "Sniffer",
      pulpitDefaultNameServer: "Serwer",
      pulpitDefaultNameSwitch: "Switch",
      pulpitDefaultNamePrinter: "Drukarka",
      pulpitDefaultNameRouter: "Router",
      pulpitDefaultNameScanner: "Skaner",
      pulpitDefaultNameSniffer: "Sniffer",
      pulpitTypeServerLabel: "Serwer",
      pulpitTypeSwitchLabel: "Switch",
      pulpitTypePrinterLabel: "Drukarka",
      pulpitTypeRouterLabel: "Router",
      pulpitTypeScannerLabel: "Skaner",
      pulpitTypeSnifferLabel: "Sniffer",
      pulpitFieldOsLabel: "System",
      pulpitFieldRoleLabel: "Rola",
      pulpitFieldPortsLabel: "Porty",
      pulpitFieldVlanLabel: "VLAN",
      pulpitFieldModelLabel: "Model",
      pulpitFieldQueueLabel: "Nazwa kolejki",
      pulpitFieldWanLabel: "Adres WAN",
      pulpitLibraryToolsHeading: "Dodaj narzedzie",
      pulpitNodeRunBtn: "Uruchom",
      pulpitRemoteRunHeading: "Zdalna instalacja",
      pulpitRemoteHostLabel: "Docelowy host / IP",
      pulpitRemoteUsernameLabel: "Login administratora",
      pulpitRemotePasswordLabel: "Haslo administratora",
      pulpitRemoteInstallerUrlLabel: "Link do instalatora",
      pulpitRemoteInstallerUrlHint: "Wklej bezposredni link .exe do instalatora - QEMU/VirtualBox nie publikuja stalego linku \"najnowsza wersja\", wiec uzyj przyciskow ponizej zeby otworzyc oficjalna strone pobierania i stamtad go skopiowac.",
      pulpitRemoteQemuQuickpickBtn: "Otworz pobieranie QEMU",
      pulpitRemoteVirtualboxQuickpickBtn: "Otworz pobieranie VirtualBox",
      pulpitRemoteRunSubmitBtn: "Uruchom",
      pulpitRemoteRunMissingFieldsNote: "Uzupelnij host, login, haslo i link do instalatora.",
      pulpitRemoteRunPendingNote: "Laczenie i instalacja - to moze chwile potrwac...",
      pulpitRemoteRunSuccessNote: "Gotowe.",
      pulpitRemoteRunErrorPrefix: "Blad:",
      pulpitPreviewStartBtn: "Podglad",
      pulpitPreviewStopBtn: "Zatrzymaj podglad",
      pulpitPreviewNeedsHostNote: "Najpierw ustaw host i port VNC powyzej.",
      pulpitPreviewDesktopOnlyNote: "Podglad pulpitu wymaga surowego polaczenia sieciowego - dostepny tylko w aplikacji desktopowej, nie w wersji www.",
      pulpitPreviewEmptyNote: "Brak aktywnego podgladu w centrum - uruchom go z Inspektora komputera.",
      pulpitPreviewNoneActiveNote: "Brak aktywnych podgladow.",
      pulpitPreviewPasswordPlaceholder: "Haslo VNC",
      toolTitle_mail_xss_tester: "Tester XSS w poczcie",
      tabLabel_mail_xss_tester: "Mail XSS",
      tabLabel_mail_xss_tester_library: "Konfiguracja testu",
      tabLabel_mail_xss_tester_results: "Log trafien",
      toolText_mail_xss_tester: "Wyslij do siebie maila z kilkoma wariantami payloadow HTML/XSS - kazdy udowadnia wykonanie wywolujac unikalny URL beacon, wiec payload wyciety przez sanityzacje Twojej poczty po prostu nigdy sie nie zglosi. Tylko aplikacja desktopowa.",
      mailXssDesktopOnlyNote: "Tester XSS w poczcie wymaga surowego nasluchu TCP i uruchomienia procesu tunelu - dostepny tylko w aplikacji desktopowej, nie w wersji www.",
      mailXssPayloadsHeading: "Payloady do wyslania",
      mailXssPayloadImgOnerror: "IMG onerror",
      mailXssPayloadSvgOnload: "SVG onload",
      mailXssPayloadSvgScript: "SVG + <script>",
      mailXssPayloadCssImport: "CSS @import",
      mailXssPayloadIframeSrc: "IFRAME src",
      mailXssPayloadForeignObject: "SVG foreignObject",
      mailXssTunnelHeading: "Publiczny tunel beacon",
      mailXssStartTunnelBtn: "Uruchom tunel",
      mailXssStopTunnelBtn: "Zatrzymaj tunel",
      mailXssTunnelStartingNote: "Uruchamianie nasluchu beacon i tunelu Cloudflare...",
      mailXssTunnelRunningNote: "Tunel dziala:",
      mailXssTunnelErrorPrefix: "Blad tunelu:",
      mailXssDownloadCloudflaredBtn: "Pobierz cloudflared",
      mailXssSendHeading: "Wyslij testowego maila",
      mailXssGmailAddressLabel: "Adres Gmail",
      mailXssAppPasswordLabel: "Haslo aplikacji Gmail",
      mailXssToLabel: "Wyslij do",
      mailXssSubjectLabel: "Temat",
      mailXssDefaultSubject: "Test sanityzacji",
      mailXssSendBtn: "Wyslij testowego maila",
      mailXssSendMissingFieldsNote: "Uzupelnij adres Gmail, haslo aplikacji, odbiorce i temat.",
      mailXssSendPendingNote: "Wysylanie...",
      mailXssSendSuccessNote: "Wyslano - otworz w swojej poczcie i obserwuj log trafien.",
      mailXssSendErrorPrefix: "Blad:",
      mailXssTriggeredYes: "Zadzialal",
      mailXssTriggeredNo: "Nie zadzialal",
      mailXssStatus_idle: "Bezczynny - najpierw uruchom tunel.",
      mailXssStatus_starting: "Uruchamianie...",
      mailXssStatus_running: "Dziala",
      mailXssStatus_error: "Blad",
      mailXssPayloadColumnLabel: "Payload",
      mailXssTriggeredColumnLabel: "Wynik",
      mailXssNoPayloadsSelectedNote: "Nie wybrano zadnych payloadow.",
      mailXssNoHitsYetNote: "Brak trafien beacon.",
      toolTitle_google_dork: "Google Dork Finder",
      tabLabel_google_dork: "Google Dork",
      tabLabel_google_dork_library: "Budowanie zapytania",
      tabLabel_google_dork_templates: "Presety",
      toolText_google_dork: "Zloz zaawansowane zapytanie Google (site:/filetype:/inurl:/intitle:/intext:, dokladne frazy, +wlacz/-wyklucz) i otworz je w przegladarce - nic nie jest scrapowane w aplikacji.",
      googleDorkResponsibleUseNote: "Korzysta tylko z publicznego indeksu wyszukiwania Google - zadnego skanowania, zadnego nieautoryzowanego dostepu. Odpowiadasz za to, co zrobisz z tym, co znajdziesz.",
      googleDorkFieldsHeading: "Budowanie zapytania",
      googleDorkTargetLabel: "Cel (site:)",
      googleDorkPhraseLabel: "Dokladna fraza",
      googleDorkIncludeLabel: "Wlacz slowa (+)",
      googleDorkExcludeLabel: "Wyklucz slowa (-)",
      googleDorkFiletypeLabel: "Typ pliku",
      googleDorkInurlLabel: "URL zawiera",
      googleDorkIntitleLabel: "Tytul zawiera",
      googleDorkIntextLabel: "Tresc strony zawiera",
      googleDorkRawLabel: "Dodatkowe operatory",
      googleDorkOpenBtn: "Otworz w Google",
      googleDorkQueryHeading: "Zapytanie",
      googleDorkQueryEmptyNote: "Uzupelnij przynajmniej jedno pole, aby zbudowac zapytanie.",
      googleDorkHistoryHeading: "Ostatnie zapytania",
      googleDorkHistoryEmptyNote: "Brak zapytan.",
      googleDorkHistoryUseAria: "Uzyj ponownie tego zapytania",
      googleDorkHistoryDeleteAria: "Usun z historii",
      googleDorkCategory_secrets: "Ujawnione sekrety i konfiguracja",
      googleDorkCategory_access: "Panele dostepu",
      googleDorkCategory_data: "Ujawnione dane",
      googleDorkTplEnvFile: "Ujawnione pliki .env",
      googleDorkTplGitExposed: "Ujawnione katalogi .git",
      googleDorkTplConfigFiles: "Ujawnione pliki konfiguracyjne",
      googleDorkTplBackupFiles: "Ujawnione pliki kopii zapasowych",
      googleDorkTplLogFiles: "Ujawnione pliki logow",
      googleDorkTplApiKeys: "Ujawnione klucze API",
      googleDorkTplAdminPanel: "Panele administracyjne",
      googleDorkTplLoginPages: "Strony logowania",
      googleDorkTplDirectoryListing: "Ujawniony listing katalogu",
      googleDorkTplSqlDump: "Ujawnione zrzuty SQL/bazy danych",
      pulpitAutoDiscoverBtn: "Zbuduj z ostatniego skanu",
      pulpitAutoDiscoverNoneFound: "Brak nowych hostow do dodania - wszystko z ostatniego skanu jest juz na mapie.",
      toolTitle_agent_profiles: "Tozsamosc agenta",
      tabLabel_agent_profiles: "Tozsamosc agenta",
      tabLabel_agent_profiles_library: "Tozsamosci",
      toolText_agent_profiles: "Twoje wlasne tozsamosci do zakladania kont podczas pracy OSINT: nick, e-mail, login, zamaskowane haslo, notatki, zdjecie i zalaczniki plikow - nie dane osoby, ktora sprawdzasz.",
      agentProfileNameLabel: "Nazwa",
      agentProfileNicknameLabel: "Nick",
      agentProfileEmailLabel: "E-mail",
      agentProfileLoginLabel: "Login",
      agentProfilePasswordLabel: "Haslo",
      agentProfileNoteLabel: "Notatka",
      agentProfilePhotoLabel: "Zdjecie",
      agentProfileAttachmentsLabel: "Zalaczniki",
      agentProfileAddBtn: "+ Dodaj profil",
      agentProfileDeleteBtn: "Usun profil",
      agentProfileShowPasswordBtn: "Pokaz/ukryj haslo",
      agentProfileAddAttachmentBtn: "Dodaj plik...",
      agentProfileAddPhotoBtn: "Dodaj zdjecie...",
      agentProfileRemoveAttachmentBtn: "Usun zalacznik",
      agentProfileEmptyNote: "Wybierz lub dodaj profil, aby go edytowac.",
      agentProfileDefaultName: "Nowy profil",
      agentProfileCopyBtn: "Kopiuj",
      agentProfileCopiedStatus: "Skopiowano do schowka",
      agentProfileServicesLabel: "Serwisy spolecznosciowe",
      agentProfileAddServiceBtn: "+ Dodaj usluge",
      agentProfileRemoveServiceBtn: "Usun usluge",
      agentProfileServiceNamePlaceholder: "Nazwa uslugi (np. Facebook)",
      agentProfileAddTextFieldBtn: "+ Pole tekstowe",
      agentProfileAddPasswordFieldBtn: "+ Pole haslowe",
      agentProfileFieldLabelPlaceholder: "Nazwa pola (np. Login)",
      agentProfileRemoveFieldBtn: "Usun pole",
      toolText_presets: "Katalog presetow portow z edycja i wyborem domyslnego profilu.",
      toolText_general: "Wybierz, ktore ustawienia powloki maja byc pamietane przy nastepnym uruchomieniu.",
      toolText_import_tool: "Importowanie, lista i usuwanie narzędzi oraz rozszerzeń z manifestu JSON.",
      importToolSubtitle: "Instaluj dodatki z katalogu GitHub albo wczytaj manifest z pliku lokalnego.",
      versionsEmptyTitle: "Wersje",
      versionsEmptyText: "Brak wpisow wersji.",
      versionsScrollLeftAria: "Przewin wersje w lewo",
      versionsScrollRightAria: "Przewin wersje w prawo",
      versionsTimelineAria: "Os czasu opublikowanych wersji",
      importToolEmptyText: "Brak zaimportowanych narzedzi.",
      importToolInstallBtn: "Zainstaluj",
      importToolUninstallBtn: "Odinstaluj",
      importToolLoadFileBtn: "Wczytaj z pliku...",
      importToolCatalogHeading: "Www addons",
      importToolCatalogEmpty: "Nie znaleziono dodatkow w katalogu.",
      importToolCatalogError: "Nie udalo sie zaladowac katalogu dodatkow.",
      presetsListAria: "Presety portow",
      presetsAddBtn: "+ Dodaj",
      presetsDeleteBtn: "Usun",
      presetsMoveUpBtn: "Przenies wyzej",
      presetsMoveDownBtn: "Przenies nizej",
      presetsSetDefaultBtn: "Ustaw jako domyslny",
      presetsEditHeading: "Edytuj preset",
      presetsDefaultCol: "Default",
      presetsEmojiLabel: "Emotka",
      presetsNameLabel: "Nazwa",
      presetsPortsLabel: "Porty",
      presetsHint: "Wpisz numery portow oddzielone przecinkami, np. 80, 443, 8080, 554",
      presetsSaveBtn: "Zapisz",
      resultsIpHostsLabel: "Hosty",
      resultsIpOpenPortsLabel: "Otwarte porty",
      resultsIpNoOpenPorts: "Brak otwartych portow",
      resultsIpColumnsButton: "Kolumny",
      resultsIpResetFilters: "Resetuj filtry",
      resultsIpFilterTypeButton: "IP / Porty",
      resultsIpFilterTypeIp: "IP",
      resultsIpFilterTypePorts: "Porty",
      resultsIpFilterMarksButton: "Ulubione / Haczyk",
      resultsIpFilterMarksFavorite: "Ulubione",
      resultsIpFilterMarksChecked: "Z haczykiem",
      resultsIpFilterStatusButton: "Status",
      resultsIpFilterStatusActive: "Aktywne",
      resultsIpFilterStatusUnknown: "Nieznane",
      resultsIpFilterStatusDead: "Martwe",
      resultsIpColumnHostname: "Hostname",
      resultsIpColumnCountryFlag: "Flaga kraju",
      resultsIpColumnIsp: "ISP",
      resultsIpColumnAs: "AS",
      resultsIpColumnDeviceIdentification: "Device Identification",
      resultsIpColumnLocation: "Lokalizacja",
      resultsIpColumnHttpPageTitle: "HTTP Page Title",
      resultsIpColumnAccessSnapshot: "Access / Snapshot",
      resultsIpColumnBanner: "Banner Grabbing",
      resultsIpColumnSslCert: "SSL/TLS Certificate Info",
      resultsIpHeaderIpAddressPort: "Adres IP / Port",
      resultsIpHeaderPing: "Ping",
      resultsIpHeaderHostname: "Hostname",
      resultsIpHeaderFlag: "Flaga",
      resultsIpHeaderIsp: "ISP",
      resultsIpHeaderAs: "AS",
      resultsIpHeaderDeviceIdentification: "Device Identification",
      resultsIpHeaderLocation: "Lokalizacja",
      resultsIpHeaderHttpPageTitle: "HTTP Page Title",
      resultsIpHeaderAccessSnapshot: "Access / Snapshot",
      resultsIpHeaderBanner: "Banner Grabbing",
      resultsIpHeaderSslCert: "SSL/TLS Certificate Info",
      toolText_language_manager: "Dodawanie, aktywacja i przegląd słowników językowych.",
      toolText_versions: "Historia zmian i wydań aplikacji.",
      toolText_about: "Informacje o projekcie i autorze.",
      toolText_license: "Informacje o licencji i warunkach użycia.",
      toolText_lorem_ipsum: "Narzędzie placeholder ze statycznym tekstem wypełniającym.",
      assistant: "Asystent",
      toolRoute: "Trasa narzędzia",
      active: "aktywne",
      noActiveTab: "brak aktywnej zakładki",
      menuPrefix: "Menu",
      tabPrefix: "Zakładka",
      tabCloseAria: "Zamknij zakładkę",
      extManagerTitle: "Menedzer rozszerzen",
      extManifestLabel: "Manifest JSON",
      extManifestPlaceholder: "Wklej JSON manifestu rozszerzenia",
      extUninstallLabel: "Id rozszerzenia do odinstalowania",
      extUninstallPlaceholder: "com.example.demo",
      extInstallBtn: "Instaluj",
      extListBtn: "Lista",
      extUninstallBtn: "Odinstaluj",
      extCloseBtn: "Zamknij",
      extManagerReady: "Gotowe. Zainstaluj, wyswietl liste lub odinstaluj rozszerzenia.",
      langManagerTitle: "Menedzer jezykow",
      langInstalledHeading: "Zainstalowane jezyki",
      langImportBtn: "Importuj jezyk...",
      langCatalogHeading: "Importuj jezyk",
      langCatalogEmpty: "Wczytywanie...",
      langCatalogError: "Nie udalo sie wczytac katalogu jezykow.",
      langCatalogInstalledBadge: "✓ Zainstalowano",
      langCatalogInstallOk: "Jezyk zainstalowany",
      langAddFail: "Dodanie jezyka nieudane",
      langActivateOk: "Jezyk aktywowany",
      langActivateFail: "Aktywacja jezyka nieudana",
      langListHeader: "Dostepne jezyki",
      langInvalidCode: "Niepoprawny kod jezyka",
      langInvalidDict: "Niepoprawny slownik jezyka",
      forAppVersionPrefix: "Dla aplikacji",
      extManagerPrompt: "Menedzer rozszerzen: wpisz install, list lub uninstall",
      extManifestPrompt: "Wklej JSON manifestu rozszerzenia",
      extInvalidJson: "Niepoprawny JSON manifestu",
      extDesktopOnlyFeature: "Ta funkcja jest dostepna tylko w aplikacji desktopowej.",
      extInstallOk: "Rozszerzenie zainstalowane",
      extInstallFail: "Instalacja rozszerzenia nieudana",
      extListEmpty: "Brak zainstalowanych rozszerzen",
      extListHeader: "Zainstalowane rozszerzenia",
      extUninstallPrompt: "Podaj id rozszerzenia do odinstalowania",
      extUninstallOk: "Rozszerzenie odinstalowane",
      extUninstallFail: "Odinstalowanie rozszerzenia nieudane",
      extPermissionConfirmTitle: "Uprawnienia rozszerzenia",
      extPermissionConfirmOk: "Zainstaluj",
      extPermissionConfirmPrefix: "To rozszerzenie prosi o nastepujace uprawnienia:",
      extPermissionConfirmSuffix: "Instaluj tylko rozszerzenia, ktorym ufasz. Kontynuowac?",
      extPermissionDeclined: "Instalacja anulowana - uprawnienia nie zostaly przyznane.",
      tabGeneralTitle: "Ogolne",
      importToolTitle: "Import Tool",
      ipLibraryTabTitle: "Biblioteka IP",
      ipLibraryTitle: "Biblioteka krajowych zakresow IP",
      ipLibraryNote: "Aktualizuj biblioteke zakresow krajow lokalnym skryptem PowerShell i trzymaj kopie w cache.",
      ipLibraryCountriesLabel: "Kody krajow",
      ipLibraryTopRangesLabel: "Liczba zakresow na kraj",
      ipLibraryUpdateBtn: "Aktualizuj (PowerShell)",
      ipLibraryLoadBtn: "Wczytaj cache",
      ipLibraryClearBtn: "Wyczysc baze",
      ipLibraryLastUpdateLabel: "Ostatnia aktualizacja:",
      ipLibraryStatusEmpty: "Brak danych biblioteki IP w cache.",
      ipLibraryStatusLoaded: "Wczytano",
      ipLibraryStatusUpdated: "Zaktualizowano",
      ipLibraryStatusCleared: "Wyczyszczono cache biblioteki IP.",
      ipLibraryStatusUpdatedAt: "Aktualizacja:",
      ipLibraryStatusUpdating: "Aktualizacja biblioteki IP...",
      ipLibraryStatusUpdateFailed: "Aktualizacja biblioteki IP nieudana.",
      ipLibraryStatusBadCountries: "Podaj co najmniej jeden 2-literowy kod kraju.",
      ipLibraryStatusInvalidCache: "Cache biblioteki IP ma niepoprawny JSON.",
      ipLibraryCentralHint: "Parametry aktualizacji ustawisz w lewym panelu IP Library. Ponizej widzisz aktualne zakresy z cache.",
      ipLibraryTableCountry: "Kraj",
      ipLibraryTableAddress: "Zakres adresow",
      ipLibraryTableEmpty: "Brak wczytanych zakresow krajowych.",
      netMonConnectionsTitle: "Połączenia",
      netMonLanDevicesTitle: "Urządzenia LAN",
      netMonIntervalLabel: "Interwał (sekundy)",
      netMonLiveStartBtn: "Start",
      netMonLiveStopBtn: "Stop",
      netMonScanBtn: "Skanuj",
      netMonMoveUpBtn: "Przesuń w górę",
      netMonMoveDownBtn: "Przesuń w dół",
      netMonSendTitle: "Wyślij do IP Scanner",
      netMonSendBtn: "Wyślij",
      netMonSendAutoLabel: "Wysyłaj automatycznie tylko nowe (co skan)",
      netMonSendSrcConnLocal: "Connections - Adres lokalny",
      netMonSendSrcConnRemote: "Connections - Adres zdalny",
      netMonSendSrcLanIp: "LAN Devices - Adres IP",
      netMonColProtocol: "Protokół",
      netMonColLocalAddr: "Adres lokalny",
      netMonColRemoteAddr: "Adres zdalny",
      netMonColState: "Stan",
      netMonColPid: "PID",
      netMonColProcess: "Proces",
      netMonColIp: "Adres IP",
      netMonColMac: "Adres MAC",
      netMonColVendor: "Producent",
      netMonColInterface: "Interfejs",
      netMonEmptyConnections: "Nie znaleziono połączeń.",
      netMonEmptyArp: "Nie znaleziono wpisów ARP.",
      netMonChangesEmpty: "Brak zmian od ostatniego skanu.",
      netMonHistoryAppeared: "Pojawiło się",
      netMonHistoryDisappeared: "Zniknęło",
      netMonKeepChangesLabel: "Zachowaj zmiany",
      netMonModeActual: "Tylko bieżący stan",
      netMonModeAll: "Wszystko",
      netMonModeChanges: "Tylko zmiany",
      netMonViewFlat: "Płaski",
      netMonViewGroupProcess: "Grupuj wg procesu",
      netMonViewGroupPid: "Grupuj wg PID",
      netMonViewGroupProtocol: "Grupuj wg protokołu",
      netMonViewGroupLocal: "Grupuj wg adresu lokalnego",
      netMonViewGroupRemote: "Grupuj wg adresu zdalnego",
      netMonViewGroupState: "Grupuj wg stanu",
      netMonViewGroupVendor: "Grupuj wg producenta",
      netMonViewGroupInterface: "Grupuj wg interfejsu",
      netMonViewGroupIp: "Grupuj wg IP",
      netMonViewGroupMac: "Grupuj wg MAC",
      emailReconInputLabel: "Email",
      emailReconInputPlaceholder: "name@example.com",
      emailReconHistoryTitle: "Ostatnie sprawdzenia",
      emailReconHistoryEmpty: "Brak sprawdzeń.",
      emailReconHistoryUseAria: "Użyj tego adresu",
      emailReconHistoryDeleteAria: "Usuń z historii",
      emailReconProfilesTitle: "Profile",
      emailReconProfilesEmpty: "Brak profili.",
      emailReconProfileNamePlaceholder: "Nazwa profilu",
      emailReconProfileAddAria: "Dodaj profil",
      emailReconProfileDeleteAria: "Usuń profil",
      emailReconProfileNameRequired: "Podaj nazwę profilu.",
      emailReconSourcesTitle: "Źródła",
      emailReconSrcEmailrep: "emailrep.io",
      emailReconSrcGravatar: "Gravatar",
      emailReconSrcGithub: "GitHub",
      emailReconSrcHibpBreaches: "HIBP - wycieki",
      emailReconSrcHibpPastes: "HIBP - pasty",
      emailReconSrcEmailrepHelp: "Serwis reputacji e-maili - sprawdza, czy adres jest aktywny/deliverable i w jakich serwisach był publicznie widziany.",
      emailReconSrcGravatarHelp: "Globalny serwis avatarów - zwraca publiczny profil (zdjęcie, nazwa, linki), jeśli ktoś go kiedyś założył dla tego maila.",
      emailReconSrcGithubHelp: "Oficjalne wyszukiwanie GitHuba - znajduje konta z tym mailem ustawionym jako publiczny w profilu (domyślnie ukryty).",
      emailReconSrcHibpBreachesHelp: "Have I Been Pwned - lista znanych wycieków danych (np. LinkedIn 2016), w których wystąpił ten adres.",
      emailReconSrcHibpPastesHelp: "Have I Been Pwned - sprawdza publiczne wklejki (np. Pastebin) pod kątem wycieków wspominających ten adres.",
      emailReconSrcXposedornot: "XposedOrNot",
      emailReconSrcXposedornotHelp: "Darmowy serwis sprawdzania wycieków, bez klucza API - lista znanych wycieków, w których wystąpił ten adres.",
      emailReconSrcLeakcheck: "LeakCheck",
      emailReconSrcLeakcheckHelp: "Darmowe publiczne API sprawdzania wycieków, bez klucza - sprawdza ten adres w bazie LeakCheck.",
      emailReconAttributionPrefix: "Wspierane przez",
      emailReconApiKeysTitle: "Klucze API",
      emailReconHibpKeyLabel: "Klucz API HIBP",
      emailReconHibpKeyPlaceholder: "hibp-api-key",
      emailReconColSource: "Źródło",
      emailReconColStatus: "Status",
      emailReconColSummary: "Podsumowanie",
      emailReconColDetail: "Szczegóły",
      emailReconEmptyResults: "Uruchom sprawdzenie, aby zobaczyć wyniki.",
      emailReconHitCount: "{n} z {total} źródeł znalazło dopasowanie",
      emailReconSummaryExistsYes: "Prawdopodobnie prawdziwy, aktywny adres e-mail",
      emailReconSummaryExistsNo: "Nie znaleziono trafień",
      emailReconSummaryExistsUnknown: "Wynik niejednoznaczny",
      emailReconStatusFound: "Znaleziono",
      emailReconStatusNotFound: "Nie znaleziono",
      emailReconStatusError: "Błąd",
      emailReconStatusSkippedNoKey: "Pominięto (brak klucza API)",
      emailReconStatusSkippedDisabled: "Pominięto (wyłączone)",
      emailReconInvalidEmail: "Podaj poprawny adres e-mail.",
      emailReconNoSourcesSelected: "Nie wybrano żadnego źródła - włącz przynajmniej jedno w konfiguracji Email Recon.",
      statusEmailReconStart: "Email Recon: rozpoczęto sprawdzanie",
      statusEmailReconStop: "Email Recon: zatrzymano",
      statusEmailReconDone: "Email Recon: sprawdzanie zakończone",
      statusEmailReconHistoryDeleted: "Email Recon: usunięto z historii",
      statusEmailReconHistorySaveFailed: "Email Recon: nie udało się zapisać historii",
      statusProfileEmailReconAdded: "Dodano profil Email Recon",
      statusProfileEmailReconLoaded: "Wczytano profil Email Recon",
      helpAboutTitle: "O aplikacji",
      helpLicenseTitle: "Licencja",
      tabAboutTitle: "O aplikacji",
      tabLicenseTitle: "Licencja",
      aboutHeading: "OSINT NET Auditor",
      aboutVersionLabel: "Automatyczna wersja z jednego zrodla:",
      aboutByAuthor: "by Michal Stankiewicz",
      aboutSpecialThanksHeading: "Specjalne podziekowania dla:",
      aboutTestersLabel: "Testerzy: tBane -",
      aboutVibecodingNote: "Ta aplikacja jest w calosci tworzona metoda vibecodingu przez amatora. Jest i zawsze bedzie darmowa, wraz ze wszystkimi swoimi dodatkami.",
      aboutSupportHeading: "Podoba Ci sie to, co robie?",
      aboutSupportBody: "Jesli moja praca byla dla Ciebie inspiracja lub realna pomoca, mozesz wesprzec moje dalsze dzialania:",
      aboutSupportQuick: "Szybkie wsparcie: Przelew tradycyjny lub BLIK na numer telefonu:",
      aboutSupportPhone: "+48 797 486 355",
      aboutSupportContact: "Badzmy w kontakcie: Facebook",
      aboutSupportFacebook: "facebook.com/MajkelMajkel",
      aboutProjectPageLabel: "Strona projektu:",
      aboutProjectPageUrl: "facebook.com/OSINTNETAuditor",
      aboutTransferHeading: "Dane do przelewu:",
      aboutTransferName: "Michal Stankiewicz",
      aboutTransferCity: "02-585 Warszawa",
      aboutTransferBank: "PKO BP",
      aboutTransferIban: "IBAN: PL55 1020 1097 0000 7902 0226 5353",
      aboutTransferTitle: "Tytulem: \"inspiracja\"",
      aboutTotalCostsHeading: "My total costs:",
      aboutTotalCostClaude: "claude - 22.14€",
      aboutTotalCostDomains: "domains - $4",
      aboutTotalCostCopilot: "github copilot - $78.00",
      aboutTotalCostOther: "other expenses - $12",
      aboutTotalCostAds: "ads - $16",
      aboutZrzutkaLabel: "Wesprzyj przez Zrzutke (zbiorke):",
      aboutZrzutkaUrl: "zrzutka.pl/msa2pj",
      licenseHeading: "Licencja MIT",
      scannerDetectIp: "Wykryj IP",
      scannerExternalIp: "Zewnetrzne IP",
      scannerLocalIp: "Lokalne IP",
      scannerSubnets: "Podsieci",
      scannerIpRange: "Zakres IP",
      scannerRangeModeRange: "Zakres",
      scannerRangeModeCidr: "CIDR",
      scannerModeIcmp: "ICMP",
      scannerFrom: "Od",
      scannerTo: "Do",
      scannerPorts: "Porty",
      scannerStart: "Start",
      scannerStop: "Stop",
      scannerClear: "Wyczysc",
      scannerPortPresets: "Presety portow",
      scannerIpExtractor: "Ekstraktor IP",
      scannerExtractorPlaceholder: "example.com 192.168.1.10",
      scannerAddExtract: "Dodaj / Ekstraktuj",
      scannerExtractedPlaceholder: "Wyekstrahowane IP...",
      scannerRangeHistory: "Historia zakresow",
      scannerNoRangeHistory: "Brak zapisanych zakresow.",
      scannerHistoryUseAria: "Uzyj zakresu",
      scannerHistoryDeleteAria: "Usun zakres",
      scannerProfilesTitle: "Profile",
      scannerProfileNamePlaceholder: "Nazwa profilu",
      scannerProfileColorAria: "Kolor profilu",
      scannerProfileAddAria: "Dodaj profil",
      scannerProfileDeleteAria: "Usun profil",
      scannerProfileSelectLabel: "Profil",
      scannerProfileNone: "—",
      statusProfileNameRequired: "Najpierw wpisz nazwe profilu",
      statusProfileAdded: "Dodano profil:",
      statusProfileDeleted: "Usunieto profil",
      statusProfileLoaded: "Wczytano profil:",
      configGroupProtocol: "Protokol",
      configProtocolTcpEnabled: "TCP Connect",
      configProtocolTcpSyn: "TCP SYN",
      configProtocolUdp: "UDP",
      configGroupPerformance: "Wydajnosc",
      configHostTimeout: "Timeout hosta (ms)",
      configMaxConcurrentHosts: "Maks. rownoleglych hostow",
      configMaxConcurrentPorts: "Maks. rownoleglych portow na host",
      configRetries: "Ponowne proby",
      configGroupDetect: "Wykrywanie",
      configDetectServiceProbing: "Aktywne sondy",
      configDetectHostEnrichment: "Wzbogacanie danych",
      configReverseDns: "Reverse DNS",
      configBannerGrabbing: "Banner Grabbing",
      configSslCertInfo: "Informacje o certyfikacie SSL/TLS",
      configOsDetection: "Wykrywanie systemu operacyjnego",
      configGroupSecurity: "Bezpieczenstwo",
      configRandomizePorts: "Losowa kolejnosc portow",
      configRandomizeHosts: "Losowa kolejnosc hostow",
      configScanDelay: "Opoznienie skanu (ms)",
      statusScanStart: "Skan uruchomiony:",
      statusScanStop: "Skan zakonczony",
      statusScanClear: "Wyczyszczono wyniki skanu",
      statusTcpSynNotImplemented: "Skanowanie TCP SYN nie jest jeszcze zaimplementowane",
      statusNoProtocolSelected: "Wybierz co najmniej jeden protokol (TCP, UDP lub ICMP) do skanowania",
      statusUdpAmbiguityNote: "UDP: brak odpowiedzi moze oznaczac port otwarty lub filtrowany - oznaczone osobno",
      statusUdpAloneNote: "Sam UDP nie potwierdzi ze host zyje - wlacz tez TCP lub ICMP dla pewnego wykrycia",
      portStatusOpenFiltered: "otwarty?",
      portStatusOpenFilteredTitle: "Brak odpowiedzi - port moze byc otwarty lub cicho filtrowany, nie da sie rozroznic",
      statusExternalIp: "Zewnetrzne IP:",
      statusLocalIp: "Lokalne IP:",
      statusSubnet: "Podsiec:",
      macroExtIpName: "Wykryj zewnetrzne IP",
      macroLocalIpName: "Wykryj lokalne IP",
      macroSubnetsName: "Wykryj podsieci",
      macroRunBtn: "Uruchom",
      statusMacroRun: "Uruchomiono makro",
      statusMacroRunFailed: "Uruchomienie makra nieudane (nie znaleziono akcji docelowej)",
      macroHelpHint: "Wpisz help lub ? aby zobaczyc liste makr",
      macroUnknownCommand: "Nieznane makro",
      statusRangeSet: "Ustawiono zakres IP:",
      statusRangeRecalled: "Przywrocono zakres IP:",
      statusRangeDeleted: "Usunieto zakres z historii",
      statusRangeHistoryInvalid: "Historia zakresow: niepoprawny zakres, nie zapisano",
      statusRangeHistorySaveFailed: "Historia zakresow: zapis nieudany",
      statusBlurIpOn: "Rozmycie IP wlaczone",
      statusBlurIpOff: "Rozmycie IP wylaczone",
      statusUnfinishedToolsOn: "Pokazano niedokonczone narzedzia",
      statusUnfinishedToolsOff: "Ukryto niedokonczone narzedzia",
      statusDemoDataOn: "Tryb danych przykladowych wlaczony",
      statusDemoDataOff: "Tryb danych przykladowych wylaczony",
      statusExtractorNoInput: "Ekstraktor IP: brak danych",
      statusExtractorAdded: "Ekstraktor IP: dodano",
      statusExtractorUnresolved: "nierozwiazane",
      statusDesktopOnlyShort: "tylko desktop",
      statusDesktopOnlySuffix: " (tylko desktop)",
      statusErrorShort: "blad",
      statusCommandFailed: "polecenie nie powiodlo sie",
      statusExternalIpDesktopOnly: "Zewnetrzne IP: tylko desktop",
      statusExternalIpNoOutput: "Zewnetrzne IP: brak wyniku",
      statusExternalIpCommandFailed: "Zewnetrzne IP: polecenie nie powiodlo sie",
      statusLocalIpDesktopOnly: "Lokalne IP: tylko desktop",
      statusLocalIpNoOutput: "Lokalne IP: brak wyniku",
      statusLocalIpCommandFailed: "Lokalne IP: polecenie nie powiodlo sie",
      statusSubnetsDesktopOnly: "Podsieci: tylko desktop",
      statusSubnetsNoOutput: "Podsieci: brak wyniku",
      statusSubnetsCommandFailed: "Podsieci: polecenie nie powiodlo sie",
      statusProcNoActive: "Brak aktywnych procesow",
      statusProcTooltipHeader: "Aktywne procesy:",
      statusProcScanRange: "Skanowanie zakresu IP",
      statusProcDetectExternalIp: "Wykrywanie zewnetrznego IP",
      statusProcDetectLocalIp: "Wykrywanie lokalnego IP",
      statusProcDetectSubnets: "Wykrywanie podsieci",
      panelHideLeft: "Ukryj lewy panel",
      panelRestoreLeft: "Przywroc lewy panel",
      panelHideRight: "Ukryj prawy panel",
      panelRestoreRight: "Przywroc prawy panel",
      panelHideBottom: "Ukryj dolny panel",
      panelRestoreBottom: "Przywroc dolny panel",
      scannerTipDetectExternal: "Wykryj zewnetrzne/publiczne IP",
      scannerTipDetectLocal: "Wykryj lokalne IP w sieci LAN",
      scannerTipDetectSubnets: "Wykryj lokalne podsieci",
      scannerTipUseDetectedRange: "Uzyj wykrytego IP/podsieci jako zakresu skanowania",
      scannerTipStart: "Uruchom skanowanie biezacego zakresu",
      scannerTipStop: "Zatrzymaj biezace skanowanie",
      scannerTipClear: "Wyczysc stan biezacego skanu",
      scannerTipPortPresets: "Otworz zakladke Presety portow",
      scannerTipAddExtract: "Dodaj IP i rozwiaz domeny do adresow IP",
      tipMenuGroupFile: "Operacje sesji: zapis, odczyt, domkniecie, import i wyjscie.",
      tipMenuGroupOptions: "Konfiguracja skanowania, jezyka interfejsu i rozszerzen.",
      tipMenuGroupTools: "Przelaczanie pomiedzy narzedziami diagnostycznymi.",
      tipMenuGroupHelp: "Informacje o wersji, pobieraniu i asystencie.",
      tipActionNewSession: "Zamkniecie biezacej sesji i rozpoczecie nowej.",
      tipActionSaveSession: "Zapis aktualnej sesji.",
      tipActionLoadSession: "Wczytanie zapisanej sesji.",
      tipActionCloseSession: "Zamkniecie aktywnej sesji.",
      tipActionImportAnotherSession: "Import danych z innej sesji.",
      tipActionSaveSessionAs: "Zapis aktualnej sesji pod nowa nazwa.",
      tipActionExit: "Wyjscie z aplikacji.",
      sessionSaveOk: "Sesja zapisana",
      sessionSaveFailed: "Zapis sesji nieudany",
      sessionSqliteEngineLoading: "Ladowanie silnika SQLite…",
      sessionSaveRetry: "Zapis nieudany, wybierz lokalizacje zapisu",
      sessionLoadOk: "Sesja wczytana",
      sessionLoadFailed: "Wczytanie sesji nieudane",
      sessionLoadEmpty: "Nie znaleziono pliku sesji",
      sessionVersionMismatchTitle: "Niezgodnosc wersji",
      sessionVersionMismatchMessage: "Ta sesja zostala zapisana w wersji {saved}, a Ty uzywasz wersji {current}.",
      sessionVersionMismatchOk: "OK",
      sessionMissingAddonsTitle: "Brakujace dodatki",
      sessionMissingAddonsMessage: "Ta sesja korzystala z dodatkow, ktore nie sa teraz zainstalowane. Wybierz, ktore zainstalowac:",
      sessionMissingAddonsInstall: "Zainstaluj zaznaczone",
      sessionMissingAddonsSkip: "Pomin",
      sessionCloseConfirm: "Zamknac biezaca sesje? Otwarte zakladki i wyniki skanu zostana wyczyszczone.",
      sessionCloseConfirmTitle: "Zamkniecie sesji",
      sessionCloseConfirmOk: "Zamknij",
      sessionCloseOk: "Sesja zamknieta",
      sessionNewConfirm: "Rozpoczac nowa sesje? Otwarte zakladki i wyniki skanu zostana wyczyszczone.",
      sessionNewConfirmTitle: "Nowa sesja",
      sessionNewConfirmOk: "Nowa",
      sessionListEmpty: "Brak ostatnich sesji.",
      sessionWelcomeTitle: "Ostatnie sesje",
      sessionRemoveFromList: "Usun z listy",
      sessionNoneLabel: "Brak aktywnej sesji",
      sessionTabsLabel: "zakladki",
      exitPromptSaveChanges: "Zapisac zmiany przed wyjsciem?",
      exitPromptSaveAndExit: "Zapisz i wyjdz",
      exitPromptExitWithoutSave: "Wyjdz bez zapisu",
      exitPromptCancel: "Anuluj",
      exitPromptCancelled: "Anulowano wyjscie",
      exitDialogTitle: "Zamkniecie aplikacji",
      exitDialogMessage: "Czy zapisac zmiany przed zamknieciem?",
      updateAvailableTitle: "Dostepna aktualizacja",
      updateAvailableMessage: "Dostepna jest nowsza wersja:",
      updateAvailableDownload: "Pobierz",
      updateAvailableLater: "Pozniej",
      tipActionCountries: "Biblioteka zakresow IP wedlug krajow.",
      tipActionPresets: "Zarzadzanie presetami portow.",
      tipActionLanguage: "Dodawanie i aktywacja jezykow UI.",
      tipActionGeneral: "Wybierz, ktore ustawienia powloki maja byc pamietane przy nastepnym uruchomieniu.",
      generalIntroNote: "Wybierz, ktore ustawienia maja byc pamietane przy nastepnym uruchomieniu aplikacji.",
      generalGroupSession: "Sesja",
      generalAutoLoadLastSession: "Automatycznie wczytaj ostatnia sesje",
      generalGroupUpdates: "Aktualizacje",
      generalCheckForUpdates: "Sprawdzaj aktualizacje przy uruchomieniu",
      generalGroupAppearance: "Wyglad",
      generalPanelSideRight: "Zamien strony paneli (pasek aktywnosci/LS po prawej, RS po lewej)",
      generalRememberLanguage: "Pamietaj jezyk UI",
      generalRememberSkin: "Pamietaj skin / motyw",
      generalUiSwitchLabel: "UI",
      generalUiSwitchDefault: "Domyslne",
      generalUiSwitchTest: "Testowe",
      generalRememberPanelSizes: "Pamietaj rozmiary i stan zwiniecia paneli",
      generalGroupPrivacyTools: "Prywatnosc i narzedzia",
      generalRememberBlurIp: "Pamietaj stan \"Rozmycie adresow IP\"",
      generalRememberShowUnfinishedTools: "Pamietaj stan \"Show unfinished tools\"",
      generalGroupWindows: "Okna",
      generalRememberWindowState: "Pamietaj stan okna (okienkowy / zmaksymalizowany / pelny ekran)",
      generalRememberDetachedWindows: "Pamietaj uklad odczepionych okien",
      generalRememberOpenTabs: "Pamietaj otwarte zakladki (LS/RS/CS)",
      generalGroupAssistant: "Asystent",
      generalRememberClippyEnabled: "Pamietaj stan wlaczenia Clippy",
      generalGroupAddons: "Dodatki",
      generalRememberExtensions: "Pamietaj zainstalowane dodatki",
      generalExtensionsCautionNote: "Jesli odznaczone, zainstalowane dodatki trzeba bedzie instalowac ponownie przy kazdym starcie aplikacji.",
      generalGroupHistory: "Historia",
      generalRememberRangeHistory: "Pamietaj historie zakresow IP",
      generalGroupAiAssistant: "Asystent AI",
      aiFieldProvider: "Dostawca:",
      aiFieldModel: "Model:",
      aiFieldStorage: "Schowek:",
      aiApiKeyLabel: "Klucz API:",
      aiApiKeyPlaceholder: "Klucz API",
      generalGroupGoogleDorkApi: "Google Dork API",
      googleDorkApiKeyLabel: "Klucz API:",
      googleDorkApiKeyPlaceholder: "Klucz API Custom Search",
      googleDorkApiCxLabel: "ID wyszukiwarki:",
      googleDorkApiCxPlaceholder: "ID wyszukiwarki (cx)",
      googleDorkApiCxLinkText: "utworz",
      googleDorkApiNote: "Jeszcze nie uzywane - zapisane na przyszla funkcje \"wyciagnij wyniki\" w Google Dork Finder.",
      generalGroupFirebaseConfig: "Firebase (Komunikator)",
      firebaseConfigApiKeyLabel: "Klucz API:",
      firebaseConfigApiKeyPlaceholder: "apiKey",
      firebaseConfigAuthDomainLabel: "Domena auth:",
      firebaseConfigAuthDomainPlaceholder: "authDomain",
      firebaseConfigProjectIdLabel: "ID projektu:",
      firebaseConfigProjectIdPlaceholder: "projectId",
      firebaseConfigOauthClientIdLabel: "Client ID OAuth (typ Desktop app):",
      firebaseConfigOauthClientIdPlaceholder: "...apps.googleusercontent.com",
      firebaseConfigClientSecretLabel: "Client secret (OAuth):",
      firebaseConfigClientSecretPlaceholder: "GOCSPX-...",
      firebaseConfigNote: "Pierwsze 3 pola: konsola Firebase -> Ustawienia projektu -> Twoje aplikacje -> konfiguracja Web. Client ID OAuth + secret: Google Cloud Console -> Credentials -> Create Credentials -> OAuth client ID -> Desktop app.",
      toolTitle_komunikator: "Komunikator",
      tabLabel_komunikator: "Komunikator",
      tabLabel_komunikator_library: "Konto",
      tabLabel_komunikator_members: "Członkowie",
      toolText_komunikator: "Zaloguj się przez Google - czat grupowy z zaproszonymi znajomymi pojawi się w przyszłej aktualizacji.",
      komunikatorAccountHeading: "Konto Google",
      komunikatorSignInBtn: "Zaloguj przez Google",
      komunikatorSignOutBtn: "Wyloguj",
      komunikatorSigningInNote: "Czekam az dokonczysz logowanie w przegladarce...",
      komunikatorSignedInAs: "Zalogowano jako:",
      komunikatorErrorPrefix: "Logowanie nieudane:",
      komunikatorErrorMissingConfig: "Najpierw uzupelnij konfiguracje Firebase w Opcje -> General.",
      komunikatorStatusHeading: "Konto",
      komunikatorNotAMemberNote: "Jestes zalogowany, ale jeszcze nie dolaczyles do pokoju - wpisz kod zaproszenia w panelu Czlonkowie.",
      komunikatorNoMessagesYetNote: "Brak wiadomosci - przywitaj sie!",
      komunikatorMessagePlaceholder: "Napisz wiadomosc... (Enter wysyla, Shift+Enter nowa linia)",
      komunikatorMembersHeading: "Czlonkowie",
      komunikatorMembersSignInFirstNote: "Zaloguj sie najpierw (zakladka Konto), zeby zobaczyc czlonkow lub dolaczyc do pokoju.",
      komunikatorNoMembersYetNote: "Brak czlonkow.",
      komunikatorInviteHeading: "Zaproszenie",
      komunikatorGenerateInviteBtn: "Wygeneruj kod zaproszenia",
      komunikatorInviteCodeNote: "Wyslij ten kod znajomemu - dziala jednorazowo.",
      komunikatorJoinCodeLabel: "Kod zaproszenia",
      komunikatorJoinBtn: "Dolacz do pokoju",
      aiGetKeyLinkText: "pobierz klucz API",
      aiStorageLocal: "lokalnie",
      aiModelOpus: "Opus",
      aiModelSonnet: "Sonnet",
      aiModelHaiku: "Haiku",
      aiModelPro: "Pro",
      aiModelFlash: "Flash",
      aiManagePermissionsBtn: "Zarzadzaj narzedziami i uprawnieniami AI...",
      aiPermTitle: "Narzedzia i uprawnienia AI",
      aiPermIntroNote: "Na razie tylko interfejs - te ustawienia nie wplywaja jeszcze na dzialanie asystenta.",
      aiPermGroupProfile: "Profil",
      aiPermProfileReadonly: "Tylko odczyt",
      aiPermProfileAssisted: "Asystowany",
      aiPermProfileAutonomous: "Autonomiczny",
      aiPermProfileCustom: "Wlasny",
      aiPermGroupAccess: "Dostep do narzedzi",
      aiPermLevel_off: "Wylaczone",
      aiPermLevel_auto: "Auto",
      aiPermLevel_ask: "Pytaj",
      aiPermLevelMixed: "Mieszane",
      aiPermLockedNote: "Zablokowane - zawsze wymaga potwierdzenia",
      aiPermUnavailableNote: "Jeszcze niepodpiete pod realne wywolania AI",
      aiPermPriorityLabel: "Priorytet przy konflikcie (drzewko vs. makro)",
      aiPermPriorityRestrictive: "Wygrywa bardziej restrykcyjne (zalecane)",
      aiPermPriorityTool: "Priorytet: narzedzie",
      aiPermPriorityMacro: "Priorytet: makro",
      aiPermGroupGuardrails: "Ograniczenia",
      aiPermMaxActionsLabel: "Maks. akcji na rozmowe",
      aiPermLockSettingsLabel: "Zablokuj mozliwosc zmiany",
      aiPermGroupAuditLog: "Log audytowy",
      aiPermClearLogBtn: "Wyczysc log",
      aiPermExportLogBtn: "Eksportuj log",
      aiPermLogEmpty: "Brak zarejestrowanych akcji.",
      aiPermNodeEmailRecon: "📧 Email Recon",
      aiPermNodeEmailReconLookup: "Uruchom lookup",
      aiPermNodeEmailReconHibp: "HIBP (platne)",
      aiPermNodeEmailReconHistory: "Czytaj historie",
      aiPermNodeNetworkMonitor: "🖧 Network Monitor",
      aiPermNodeNetworkMonitorRead: "Czytaj dane",
      aiPermNodeNetworkMonitorLive: "Start/stop monitorowania",
      aiPermNodeNetworkMonitorSend: "Wyslij IP do skanera",
      aiPermNodeIpScanner: "🔍 IP Scanner",
      aiPermNodeIpScannerRead: "Czytaj wyniki",
      aiPermNodeIpScannerScan: "Uruchom skan",
      aiPermNodeMacros: "🧩 Makra",
      aiPermNodeNavigation: "🔀 Nawigacja",
      aiPermNodeNavigationSwitch: "Przelacz narzedzie/zakladke",
      aiPermNodeNavigationOpenTab: "Otworz zakladke",
      aiPermNodeNavigationCloseTab: "Zamknij zakladke",
      toolTitle_ai_permissions: "Narzedzia i uprawnienia AI",
      toolText_ai_permissions: "Zarzadzaj tym, co asystent AI moze widziec i robic w narzedziach aplikacji.",
      tabLabel_ai_permissions: "Uprawnienia AI",
      aiToolConfirmTitle: "Potwierdz akcje AI",
      aiToolConfirmMessage: "Asystent chce wykonac: {action} {args}",
      aiToolConfirmOk: "Zezwol",
      aiToolMetaBlocked: "Zablokowane (Wylaczone w Uprawnieniach AI): {action}",
      aiToolMetaGuardrail: "Pominieto (osiagnieto limit akcji na rozmowe): {action}",
      aiToolMetaDeclined: "Odrzucono: {action}",
      aiToolMetaDone: "{action} - wykonano",
      aiToolMetaFailed: "{action} - {reason}",
      aiToolMaxRoundsReached: "Osiagnieto wewnetrzny limit wywolan narzedzi dla tej odpowiedzi.",
      aiToolHibpConfirmTitle: "Uwzglednic HIBP (platne)?",
      aiToolHibpConfirmMessage: "To wyszukiwanie sprawdziloby rowniez Have I Been Pwned, ktore korzysta z platnego klucza API. Uwzglednic?",
      aiToolHibpConfirmOk: "Uwzglednij HIBP",
      aiSystemPromptUiLabel: "System prompt (tryb UI)",
      aiSystemPromptPsLabel: "System prompt (tryb PS)",
      aiSystemPromptRestoreBtn: "Przywroc domyslny",
      aiModeUiCheckboxTitle: "Szybki bezpiecznik dostepu asystenta do narzedzi (wywolywanie narzedzi, nawigacja, makra). Odznaczenie NIE zatrzymuje odpowiadania asystenta - tylko odbiera mu mozliwosc dzialania, wiec moze juz tylko rozmawiac.",
      aiModeBadgeTitle: "Kliknij, aby otworzyc Wlasciwosci AI (limity tokenow/rund) dla aktywnego dostawcy.",
      aiUiModeEnabledNote: "Tryb UI wlaczony.",
      aiUiModeDisabledNote: "Tryb UI wylaczony.",
      aiStopBtnTitle: "Zatrzymaj",
      aiToolStoppedNote: "Zatrzymano.",
      aiClearHistoryBtnTitle: "Wyczysc historie czatu",
      aiClearHistoryConfirmTitle: "Wyczyscic historie czatu?",
      aiClearHistoryConfirmMessage: "To usunie cala rozmowe i zresetuje licznik akcji (guardrail). Nie da sie tego cofnac.",
      aiClearHistoryConfirmOk: "Wyczysc",
      aiPropertiesTitle: "Wlasciwosci AI",
      aiPropertiesActiveNote: "Aktywny dostawca",
      aiPropMaxTokensLabel: "Max. tokenow odpowiedzi",
      aiPropMaxRoundsLabel: "Max. rund na rozmowe",
      aiPropTokenCounterLabel: "Licznik szacowanych tokenow",
      aiTokenCounterUnit: "tokenow",
      aiTokenCounterTotalLabel: "lacznie",
      tipActionCustomization: "Otworz panel Import Tool.",
      tipActionVersions: "Informacje o wersjach aplikacji.",
      tipActionDownload: "Linki do pobrania aplikacji.",
      tipActionAbout: "Informacje o projekcie.",
      tipActionLicense: "Informacje o licencji.",
      tipActionAssistant: "Pokaz lub ukryj asystenta Clippy.",
      tipActionWindowMin: "Minimalizacja okna aplikacji.",
      tipActionWindowMax: "Maksymalizacja okna aplikacji.",
      tipActionWindowFullscreen: "Przelaczenie trybu pelnoekranowego.",
      tipActionAutoArrange: "Automatyczne rozmieszczenie odpiętych okien.",
      tipActionWindowClose: "Zamykanie okna aplikacji.",
      tipActionBlurIp: "Rozmywa widoczne adresy IP/hostname na ekranie (bezpieczne udostepnianie ekranu).",
      tipActionShowUnfinishedTools: "Pokazuje/ukrywa niedokonczone narzedzia w menu Tools i LRSB.",
      tipActionDemoData: "Wlacza tryb danych przykladowych - nowe wpisy narzedzi sa oznaczane jako demo, zeby mozna je bylo hurtowo usunac bez ruszania prawdziwych danych.",
      devFullResetButtonTitle: "Przycisk pelnego resetu dev",
      devFullResetConfirmTitle: "Pelny reset",
      devFullResetConfirmMessage: "Zresetowac pamiec aplikacji i wyczyscic wszystkie zapisane dane? Aplikacja zostanie przeladowana.",
      devFullResetConfirmOk: "Resetuj",
      blurIpSoonButtonTitle: "Rozmycie adresow IP",
      autoArrangeOnUndockTitle: "Automatycznie rozmieszczaj przy otwieraniu zakładek w pływających oknach",
      autoArrangeOnUndockPrefix: "auto rozmieszczanie przy odpinaniu",
      stateEnabled: "włączone",
      stateDisabled: "wyłączone",
      detachedSwapTitle: "Zamień zawartość z innym oknem",
      detachedDockTitle: "Przypnij zakładkę z powrotem",
      detachedUndockTitle: "Otwórz zakładkę w pływającym oknie",
      detachedNoWindowsToArrange: "brak odpiętych okien do rozmieszczenia",
      detachedAutoArrangedPrefix: "automatycznie rozmieszczono",
      detachedWindowsLabel: "okna",
      detachedLayoutReset: "zresetowano układ pływającego okna",
      detachedDocked: "przypięto",
      detachedUndocked: "odpięto",
      detachedClosed: "zamknięto",
      tipPanelActivityBar: "Szybkie ikony do przelaczania glownych narzedzi.",
      tipPanelSidebar: "Panel boczny sterowania skanerem i narzedziami.",
      tipPanelEditor: "Glowny obszar roboczy aktywnego narzedzia.",
      tipPanelConsole: "Konsola logow i makr diagnostycznych.",
      tipPanelAssistant: "Panel asystenta AI i watkow analitycznych.",
      tipPanelStatusBar: "Pasek statusu sesji i aktywnego narzedzia.",
      clippyOn: "Clippy wlaczony",
      clippyOff: "Clippy wylaczony",
      clippyCloseAria: "Zamknij asystenta",
      clippyTip1: "Szybki start: ustaw zakres IP i kliknij Start.",
      clippyTip2: "Uzyj Przegladania wynikow, aby przelaczac widoki Wynikow IP, Biblioteki IP i Presetow.",
      clippyTip3: "Rozszerzeniami i jezykami zarzadzasz w Opcje -> Dostosowanie.",
      clippyTip4: "Wskazowka: kliknij mnie, aby od razu zmienic podpowiedz.",
      psConsolePlaceholder: "Wpisz komende PowerShell i nacisnij Enter",
      psConsoleReady: "Zintegrowana konsola PowerShell gotowa.",
      psConsoleRunning: "Uruchamianie komendy PowerShell...",
      psConsoleDesktopOnly: "Wykonywanie PowerShell jest dostepne tylko w trybie desktop (Tauri).",
      psConsoleExecFailed: "Blad wykonania PowerShell:",
    },
  };

  function cloneDictionaries(dicts) {
    var out = {};
    Object.keys(dicts || {}).forEach(function (langCode) {
      out[langCode] = Object.assign({}, dicts[langCode] || {});
    });
    return out;
  }

  var dictionaries = cloneDictionaries(baseDictionaries);

  // Language Manager -> installed-languages list (flag/name/version per
  // language). Parallel to `dictionaries` but never merged into it - lookup
  // text (`t()`) never touches this. Built-ins get a fixed identity (no
  // version - they're not an importable "package"); imported/catalog
  // languages get whatever metadata addLanguage() was given, if any.
  function makeBuiltInLangMeta() {
    return {
      en: { name: "English", flag: "🇬🇧", version: "", rtl: false },
      pl: { name: "Polski", flag: "🇵🇱", version: "", rtl: false },
    };
  }

  var langMeta = makeBuiltInLangMeta();

  function normalizeLangCode(code) {
    if (typeof code !== "string") return "";
    var normalized = code.trim().toLowerCase();
    if (!normalized) return "";
    return /^[a-z]{2,3}(?:-[a-z0-9]{2,8})?$/.test(normalized) ? normalized : "";
  }

  function saveCustomDictionaries() {
    var custom = {};
    Object.keys(dictionaries).forEach(function (code) {
      if (!baseDictionaries[code]) {
        custom[code] = Object.assign({}, dictionaries[code]);
      }
    });

    try {
      storageSet(CUSTOM_DICTS_KEY, JSON.stringify(custom));
    } catch (_) {}
  }

  function loadCustomDictionaries() {
    var payload = null;
    try {
      payload = storageGet(CUSTOM_DICTS_KEY);
    } catch (_) {
      payload = null;
    }

    if (!payload) return;

    var parsed = null;
    try {
      parsed = JSON.parse(payload);
    } catch (_) {
      parsed = null;
    }

    if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return;

    Object.keys(parsed).forEach(function (code) {
      var normalizedCode = normalizeLangCode(code);
      var dict = parsed[code];
      if (!normalizedCode || !dict || typeof dict !== "object" || Array.isArray(dict)) return;
      dictionaries[normalizedCode] = Object.assign({}, dict);
    });
  }

  function saveLangMeta() {
    var custom = {};
    Object.keys(langMeta).forEach(function (code) {
      if (!baseDictionaries[code]) {
        custom[code] = Object.assign({}, langMeta[code]);
      }
    });

    try {
      storageSet(LANG_META_KEY, JSON.stringify(custom));
    } catch (_) {}
  }

  function loadLangMeta() {
    var payload = null;
    try {
      payload = storageGet(LANG_META_KEY);
    } catch (_) {
      payload = null;
    }

    if (!payload) return;

    var parsed = null;
    try {
      parsed = JSON.parse(payload);
    } catch (_) {
      parsed = null;
    }

    if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return;

    Object.keys(parsed).forEach(function (code) {
      var normalizedCode = normalizeLangCode(code);
      var meta = parsed[code];
      if (!normalizedCode || !meta || typeof meta !== "object" || Array.isArray(meta)) return;
      langMeta[normalizedCode] = {
        name: String(meta.name || normalizedCode.toUpperCase()),
        flag: String(meta.flag || "🌐"),
        version: String(meta.version || ""),
        rtl: !!meta.rtl,
      };
    });
  }

  function getCurrentLang() {
    var raw = storageGet(LANG_KEY) || "en";
    return dictionaries[raw] ? raw : "en";
  }

  function addLanguage(code, dictionary, meta, persist) {
    var normalizedCode = normalizeLangCode(code);
    if (!normalizedCode) {
      return { ok: false, error: "Invalid language code" };
    }

    if (!dictionary || typeof dictionary !== "object" || Array.isArray(dictionary)) {
      return { ok: false, error: "Invalid language dictionary" };
    }

    dictionaries[normalizedCode] = Object.assign({}, dictionary);
    langMeta[normalizedCode] = {
      name: String((meta && meta.name) || normalizedCode.toUpperCase()),
      flag: String((meta && meta.flag) || "🌐"),
      version: String((meta && meta.version) || ""),
      rtl: !!(meta && meta.rtl),
    };
    if (persist !== false) {
      saveCustomDictionaries();
      saveLangMeta();
    }
    return { ok: true, code: normalizedCode };
  }

  function listLanguages() {
    return Object.keys(dictionaries).sort();
  }

  // Language Manager -> installed-languages list: same set as
  // listLanguages(), enriched with display metadata for each code. Always
  // returns a usable {name,flag,version} even for a code that somehow has
  // no langMeta entry (shouldn't happen via addLanguage, but stay
  // defensive since dictionaries/langMeta are two separate maps).
  function listLanguageDetails() {
    return listLanguages().map(function (code) {
      var meta = langMeta[code] || { name: code.toUpperCase(), flag: "🌐", version: "", rtl: false };
      return { code: code, name: meta.name, flag: meta.flag, version: meta.version, rtl: !!meta.rtl };
    });
  }

  function resetLanguages() {
    dictionaries = cloneDictionaries(baseDictionaries);
    langMeta = makeBuiltInLangMeta();
    loadCustomDictionaries();
    loadLangMeta();
  }

  // Language Manager -> Arabic/RTL support: whichever language is active,
  // <html dir> must match its langMeta.rtl flag (built-ins are always ltr;
  // catalog-installed languages carry their own "rtl" manifest field, see
  // installLanguageManifest() in panels-runtime.js). Text-direction-only
  // RTL - the shell's LS/RS/activity-bar layout stays physically where it
  // is; only text direction flips. See docs/ROADMAP.md for the deferred
  // full-mirror approach.
  function applyDirForLang(code) {
    var meta = langMeta[code];
    document.documentElement.setAttribute("dir", meta && meta.rtl ? "rtl" : "ltr");
  }

  function createI18n() {
    var lang = getCurrentLang();

    function t(key) {
      return (dictionaries[lang] && dictionaries[lang][key]) || (dictionaries.en && dictionaries.en[key]) || key;
    }

    function setLang(next) {
      var normalized = normalizeLangCode(next);
      if (!normalized || !dictionaries[normalized]) return lang;
      lang = normalized;
      storageSet(LANG_KEY, normalized);
      document.documentElement.setAttribute("lang", normalized);
      applyDirForLang(normalized);
      try {
        window.dispatchEvent(new CustomEvent("netrecon:language-changed", { detail: { lang: normalized } }));
      } catch (_) {}
      return lang;
    }

    function getLang() {
      return lang;
    }

    document.documentElement.setAttribute("lang", lang);
    applyDirForLang(lang);

    return {
      t: t,
      getLang: getLang,
      setLang: setLang,
      addLanguage: addLanguage,
      listLanguages: listLanguages,
      listLanguageDetails: listLanguageDetails,
    };
  }

  loadCustomDictionaries();
  loadLangMeta();

  window.NetReconNewUICore = window.NetReconNewUICore || {};
  window.NetReconNewUICore.i18n = {
    createI18n: createI18n,
    getCurrentLang: getCurrentLang,
    addLanguage: addLanguage,
    listLanguages: listLanguages,
    listLanguageDetails: listLanguageDetails,
    resetLanguages: resetLanguages,
  };
})();
