# Copyright (C) 2026 Avakode # This file is distributed under the GPL-2.0-or-later. msgid "" msgstr "" "Project-Id-Version: Guard Forge – Security, Login Protection, 2FA & Audit Log 1.6.2\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/guardforge\n" "POT-Creation-Date: 2026-10-16T09:54:01+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Domain: guardforge\n" "X-Generator: WP-CLI 2.12.0\n" "X-Includes-Domain: forge\n" #. Plugin Name of the plugin #: guardforge.php msgid "Guard Forge – Security, Login Protection, 2FA & Audit Log" msgstr "" #. Plugin URI of the plugin #: guardforge.php msgid "https://guardforge.app" msgstr "" #. Description of the plugin #: guardforge.php msgid "Hardening, brute-force protection, two-factor authentication, file-integrity monitoring, audit log and Content-Security-Policy for WordPress. The Pro add-on adds a WAF, malware scanner, CVE feed, Geo-IP and alerts." msgstr "" #. Author of the plugin #: guardforge.php msgid "Avakode" msgstr "" #. Author URI of the plugin #: guardforge.php msgid "https://avakode.com" msgstr "" #. translators: %d is the number of advisory records imported. #: admin/class-admin.php:237 #, php-format msgid "Feed refreshed (%d records)." msgstr "" #. translators: %s: the reason the other side gave, as it gave it #: admin/class-admin.php:251 #: includes/class-first-screen.php:170 #, php-format msgid "The last fetch failed: %s" msgstr "" #: admin/class-admin.php:253 #: includes/class-first-screen.php:171 msgid "The last fetch attempt failed." msgstr "" #: admin/class-admin.php:348 msgid "This screen is part of GuardForge Pro, a separate plugin. Everything else on this site keeps working without it." msgstr "" #: admin/class-admin.php:350 msgid "About GuardForge Pro" msgstr "" #: admin/class-admin.php:358 #: includes/class-audit-log.php:198 #: includes/class-case-actions.php:346 #: includes/class-guard-report-export.php:109 #: includes/class-hardening-score-badge.php:457 #: includes/class-hardening-score.php:1533 #: includes/class-integrity.php:818 #: includes/class-two-factor.php:306 #: includes/class-two-factor.php:324 msgid "Access denied." msgstr "" #: admin/partials/audit-log.php:15 msgid "Audit log cleared." msgstr "" #. translators: %d is the total number of admin action events. #: admin/partials/audit-log.php:50 #, php-format msgid "Admin actions · total: %d" msgstr "" #: admin/partials/audit-log.php:53 #: includes/class-core.php:138 msgid "Audit log" msgstr "" #. translators: %d is how many rows were walked. #: admin/partials/audit-log.php:69 #, php-format msgid "Chain intact — %d rows checked, every one still points at what wrote before it." msgstr "" #. translators: %d is how many times the chain restarted from a fresh genesis. #: admin/partials/audit-log.php:82 #, php-format msgid "(chain restarted %d time — pre-upgrade or unhashed rows are in the mix; each restart is only expected once, at row 1.)" msgid_plural "(chain restarted %d times — pre-upgrade or unhashed rows are in the mix; each restart is only expected once, at row 1.)" msgstr[0] "" msgstr[1] "" #: admin/partials/audit-log.php:92 msgid "This table is larger than one check can walk within a single request, so only the oldest rows were checked this time — nothing broken was found among them. Lowering how long the audit log is kept (Settings) shrinks the table so a future check can cover all of it." msgstr "" #. translators: %d is the id of the first row whose hash no longer matches. #: admin/partials/audit-log.php:100 #, php-format msgid "Chain broken at row #%d — its stored hash no longer matches its content or its predecessor." msgstr "" #: admin/partials/audit-log.php:108 msgid "Chain integrity" msgstr "" #: admin/partials/audit-log.php:111 msgid "Every row is chained to the one before it: editing or deleting a row after the fact breaks the chain from that point on, and this check finds where. Rows written before this check existed have no hash and are skipped — the first hashed row after them starts a new chain rather than reporting a break." msgstr "" #: admin/partials/audit-log.php:116 msgid "Verify chain" msgstr "" #: admin/partials/audit-log.php:124 msgid "Export" msgstr "" #: admin/partials/audit-log.php:130 msgid "Download the audit trail as CSV — for a compliance review, an incident write-up, or your own archive. Available with GuardForge Pro." msgstr "" #: admin/partials/audit-log.php:140 msgid "Event type" msgstr "" #: admin/partials/audit-log.php:141 #: admin/partials/audit-log.php:157 #: admin/partials/login-log.php:91 msgid "User" msgstr "" #: admin/partials/audit-log.php:142 #: admin/partials/cases.php:214 #: admin/partials/login-log.php:75 msgid "Apply" msgstr "" #: admin/partials/audit-log.php:143 #: admin/partials/login-log.php:76 msgid "Reset" msgstr "" #: admin/partials/audit-log.php:147 msgid "Clear the entire audit log?" msgstr "" #: admin/partials/audit-log.php:148 #: admin/partials/login-log.php:81 msgid "Clear log" msgstr "" #: admin/partials/audit-log.php:156 #: admin/partials/login-log.php:89 msgid "Date & time" msgstr "" #: admin/partials/audit-log.php:158 msgid "Event" msgstr "" #: admin/partials/audit-log.php:159 msgid "Object" msgstr "" #: admin/partials/audit-log.php:160 msgid "Details" msgstr "" #: admin/partials/audit-log.php:161 #: admin/partials/unblock.php:89 msgid "IP" msgstr "" #: admin/partials/audit-log.php:168 #: admin/partials/login-log.php:101 msgid "No entries yet." msgstr "" #: admin/partials/cases.php:41 #: admin/partials/settings.php:182 msgid "File change" msgstr "" #: admin/partials/cases.php:42 #: admin/partials/settings.php:183 msgid "Vulnerability" msgstr "" #: admin/partials/cases.php:43 #: admin/partials/settings.php:184 msgid "Login series" msgstr "" #: admin/partials/cases.php:46 msgid "Open" msgstr "" #: admin/partials/cases.php:47 msgid "Acknowledged" msgstr "" #: admin/partials/cases.php:48 msgid "Assigned" msgstr "" #: admin/partials/cases.php:49 #: admin/partials/cases.php:312 msgid "Needs verification" msgstr "" #: admin/partials/cases.php:50 msgid "Mitigated" msgstr "" #: admin/partials/cases.php:51 msgid "Fix applied" msgstr "" #: admin/partials/cases.php:52 msgid "Explained" msgstr "" #: admin/partials/cases.php:53 msgid "Unverified" msgstr "" #: admin/partials/cases.php:54 #: admin/partials/cases.php:121 msgid "Fixed" msgstr "" #: admin/partials/cases.php:60 msgid "That case could not be found." msgstr "" #: admin/partials/cases.php:61 msgid "That case is not in a state that accepts this decision — someone may have already acted on it." msgstr "" #: admin/partials/cases.php:62 msgid "Enter a WordPress user ID to assign this case to." msgstr "" #: admin/partials/cases.php:63 msgid "A reason is required to record an expected change." msgstr "" #: admin/partials/cases.php:64 msgid "That decision only applies to file-change cases." msgstr "" #: admin/partials/cases.php:65 msgid "That remedy does not apply to this case type." msgstr "" #: admin/partials/cases.php:66 msgid "That action needs GuardForge Pro, which is not installed on this site." msgstr "" #: admin/partials/cases.php:67 msgid "This case has no evidence of the kind that action needs." msgstr "" #: admin/partials/cases.php:68 msgid "The update could not be applied — see the Vulnerabilities screen's action log for the error." msgstr "" #: admin/partials/cases.php:69 msgid "Brute-force protection is switched off for this site — turn it on under Settings before blocking an IP from here." msgstr "" #: admin/partials/cases.php:70 msgid "This IP is on the brute-force whitelist, so GuardForge will not block it." msgstr "" #: admin/partials/cases.php:71 msgid "This site is in staging mode, so IP blocks are not applied here." msgstr "" #: admin/partials/cases.php:76 #: admin/partials/cases.php:220 #: includes/class-core.php:137 msgid "Cases" msgstr "" #: admin/partials/cases.php:77 msgid "Investigations built from file integrity, the vulnerability feed and the login log" msgstr "" #. translators: %s is the case's new status label. #: admin/partials/cases.php:85 #, php-format msgid "Case updated: %s." msgstr "" #: admin/partials/cases.php:91 msgid "Cases matching this filter" msgstr "" #: admin/partials/cases.php:103 msgid "Still open on this page" msgstr "" #: admin/partials/cases.php:119 msgid "Detected" msgstr "" #: admin/partials/cases.php:120 msgid "Checked" msgstr "" #: admin/partials/cases.php:122 msgid "Left unknown" msgstr "" #: admin/partials/cases.php:123 msgid "Mitigated, not counted as fixed" msgstr "" #: admin/partials/cases.php:127 msgid "Month report" msgstr "" #: admin/partials/cases.php:133 msgid "Month" msgstr "" #: admin/partials/cases.php:141 msgid "Show" msgstr "" #: admin/partials/cases.php:147 msgid "Figure" msgstr "" #: admin/partials/cases.php:148 msgid "Count" msgstr "" #: admin/partials/cases.php:149 msgid "Counted from" msgstr "" #: admin/partials/cases.php:150 msgid "Window" msgstr "" #: admin/partials/cases.php:151 msgid "What it does not cover" msgstr "" #. translators: %s is a date and time. #: admin/partials/cases.php:171 #, php-format msgid "A reading of the case table as of %s, the last time cases were synced." msgstr "" #: admin/partials/cases.php:175 msgid "Cases have not been synced on this site yet, so this month has nothing recorded to count." msgstr "" #: admin/partials/cases.php:183 msgid "Download CSV for this client" msgstr "" #: admin/partials/cases.php:186 msgid "The file names this site and this month, the five figures above and one line per case: its id, type, status, dates, and whether it was closed with a recorded basis. It carries no file paths, IP addresses, user names, e-mail addresses, keys or evidence text." msgstr "" #: admin/partials/cases.php:192 msgid "Filter" msgstr "" #: admin/partials/cases.php:196 #: admin/partials/cases.php:227 #: admin/partials/vuln-db.php:209 msgid "Type" msgstr "" #: admin/partials/cases.php:198 #: admin/partials/cases.php:207 msgid "All" msgstr "" #: admin/partials/cases.php:205 #: admin/partials/cases.php:230 msgid "Status" msgstr "" #: admin/partials/cases.php:223 msgid "No cases match this filter. A case appears here once an integrity scan, the vulnerability feed or the login log produces something that meets the threshold for one." msgstr "" #: admin/partials/cases.php:228 msgid "Subject" msgstr "" #: admin/partials/cases.php:229 msgid "Confidence" msgstr "" #: admin/partials/cases.php:231 msgid "First observed" msgstr "" #: admin/partials/cases.php:232 msgid "Last observed" msgstr "" #: admin/partials/cases.php:233 msgid "Evidence" msgstr "" #: admin/partials/cases.php:234 #: admin/partials/cases.php:283 msgid "Decide" msgstr "" #. translators: %d is the number of evidence rows behind one case. #: admin/partials/cases.php:255 #, php-format msgid "%d observation" msgid_plural "%d observations" msgstr[0] "" msgstr[1] "" #: admin/partials/cases.php:268 msgid "Not checked:" msgstr "" #: admin/partials/cases.php:274 msgid "Resolution:" msgstr "" #: admin/partials/cases.php:291 msgid "Acknowledge" msgstr "" #: admin/partials/cases.php:300 msgid "Assign to WP user ID" msgstr "" #: admin/partials/cases.php:303 msgid "Assign" msgstr "" #: admin/partials/cases.php:321 msgid "Closes this case as an expected change. The evidence above is kept; the file itself is not touched." msgstr "" #: admin/partials/cases.php:322 msgid "Why was this change expected?" msgstr "" #: admin/partials/cases.php:323 msgid "Mark as expected change" msgstr "" #: admin/partials/cases.php:336 msgid "Applies GuardForge Pro's patch-by-update rule to this advisory now: the site installs the fixed version WordPress currently offers, if the rule's own safety checks allow it. This moves the case to \"fix applied\" — closing it as fixed still needs a recheck of the installed version." msgstr "" #: admin/partials/cases.php:337 msgid "Apply fix (patch by update)" msgstr "" #: admin/partials/cases.php:341 msgid "GuardForge Pro is not installed, so no automatic update is available for this case. Update the plugin from the Plugins screen instead." msgstr "" #: admin/partials/cases.php:353 msgid "Blocks the IP in this case for the site's configured lockout window, the same mechanism brute-force protection already enforces automatically. Refused if brute-force protection is switched off, this IP is whitelisted, or the site is in staging mode. This mitigates the case; it does not mark it fixed." msgstr "" #: admin/partials/cases.php:354 msgid "Block this IP now" msgstr "" #: admin/partials/cases.php:362 msgid "Turns on site-wide lockdown: blocks new user registration, comments and anonymous REST writes until turned off on the Lockdown screen." msgstr "" #: admin/partials/cases.php:363 msgid "Enable lockdown" msgstr "" #: admin/partials/cases.php:367 msgid "GuardForge Pro is not installed, so lockdown is not available. Blocking the IP above is the remedy this Free install can apply." msgstr "" #: admin/partials/cases.php:372 msgid "This case is closed. No further decision applies." msgstr "" #. translators: 1: current page, 2: total pages. #. translators: 1: page currently shown, 2: total number of pages. #: admin/partials/cases.php:387 #: includes/class-admin-header.php:124 #, php-format msgid "Page %1$d of %2$d" msgstr "" #: admin/partials/cases.php:393 msgid "« Previous" msgstr "" #: admin/partials/cases.php:396 msgid "Next »" msgstr "" #: admin/partials/cloudflare.php:17 #: admin/partials/cloudflare.php:45 msgid "Cloudflare firewall sync" msgstr "" #: admin/partials/cloudflare.php:18 msgid "Push a locked-out IP straight into your Cloudflare zone, so the next attempt never reaches WordPress at all. Available with GuardForge Pro." msgstr "" #: admin/partials/cloudflare.php:34 msgid "NOT CONNECTED" msgstr "" #: admin/partials/cloudflare.php:36 msgid "CONNECTED" msgstr "" #: admin/partials/cloudflare.php:38 msgid "NOT VERIFIED" msgstr "" #: admin/partials/cloudflare.php:40 msgid "CONFIGURED · not verified yet" msgstr "" #: admin/partials/cloudflare.php:50 msgid "Cloudflare settings saved." msgstr "" #: admin/partials/cloudflare.php:57 msgid "Cloudflare confirmed the token — the zone is readable." msgstr "" #: admin/partials/cloudflare.php:59 msgid "Cloudflare did not confirm the token." msgstr "" #: admin/partials/cloudflare.php:79 msgid "Token verification" msgstr "" #: admin/partials/cloudflare.php:82 msgid "Save a zone ID and an API token below, then verify them here." msgstr "" #: admin/partials/cloudflare.php:84 msgid "A zone ID and a token are saved but have never been checked against Cloudflare. Verify to confirm they actually work." msgstr "" #: admin/partials/cloudflare.php:87 msgid "Verified." msgstr "" #. translators: 1: the Cloudflare zone name, 2: date and time of the check. #: admin/partials/cloudflare.php:91 #, php-format msgid "Cloudflare confirmed this token can read zone \"%1$s\" on %2$s." msgstr "" #: admin/partials/cloudflare.php:99 msgid "Not verified." msgstr "" #. translators: 1: error code from the last check, 2: error message, 3: date and time of the check. #: admin/partials/cloudflare.php:103 #, php-format msgid "The check on %3$s failed (%1$s): %2$s" msgstr "" #: admin/partials/cloudflare.php:114 msgid "Verify token" msgstr "" #: admin/partials/cloudflare.php:115 msgid "Read-only — a GET on the zone's own details. Creates and deletes nothing." msgstr "" #: admin/partials/cloudflare.php:121 msgid "How to connect" msgstr "" #: admin/partials/cloudflare.php:124 msgid "In the Cloudflare dashboard, open your zone and copy the Zone ID from the Overview sidebar." msgstr "" #: admin/partials/cloudflare.php:125 msgid "Create an API token with one permission: Zone → Firewall Services → Edit, limited to that zone." msgstr "" #: admin/partials/cloudflare.php:126 msgid "Paste both below. The token is encrypted before it is stored and is never sent to Avakode." msgstr "" #: admin/partials/cloudflare.php:129 msgid "Blocks GuardForge creates are tagged in the rule notes and removed automatically after the retention window below. Rules you created by hand are never touched." msgstr "" #: admin/partials/cloudflare.php:139 msgid "Trusted edge addresses" msgstr "" #: admin/partials/cloudflare.php:142 msgid "This site does not trust Cloudflare's forwarded-for headers. Switch \"Trust Cloudflare IP ranges\" on in Settings if your traffic reaches WordPress through Cloudflare." msgstr "" #. translators: 1: number of address ranges, 2: date and time of the last refresh. #: admin/partials/cloudflare.php:149 #, php-format msgid "%1$d ranges, refreshed from Cloudflare on %2$s." msgstr "" #. translators: %d is the number of address ranges in the bundled snapshot. #: admin/partials/cloudflare.php:158 #, php-format msgid "Using the %d ranges bundled with the plugin. The live list is refreshed daily once GuardForge Pro is active." msgstr "" #. translators: 1: error message, 2: date and time of the last attempt. #: admin/partials/cloudflare.php:169 #, php-format msgid "The last attempt (%2$s) did not bring a list back: %1$s The ranges above are the ones still in use." msgstr "" #: admin/partials/cloudflare.php:176 msgid "These are the addresses whose CF-Connecting-IP header this site believes. Cloudflare adds ranges over time, so a stale list makes every visitor look like the edge in the login log." msgstr "" #: admin/partials/cloudflare.php:187 msgid "Zone credentials" msgstr "" #: admin/partials/cloudflare.php:190 msgid "Zone ID" msgstr "" #: admin/partials/cloudflare.php:194 msgid "API token" msgstr "" #: admin/partials/cloudflare.php:196 msgid "Stored — leave blank to keep it" msgstr "" #: admin/partials/cloudflare.php:196 msgid "Paste your scoped token" msgstr "" #: admin/partials/cloudflare.php:199 msgid "Remove our blocks after (days)" msgstr "" #: admin/partials/cloudflare.php:204 #: admin/partials/geo-ip.php:81 #: admin/partials/lockdown.php:125 msgid "Save" msgstr "" #: admin/partials/geo-ip.php:13 #: admin/partials/geo-ip.php:24 msgid "Geo-IP blocking" msgstr "" #: admin/partials/geo-ip.php:14 msgid "Block or allowlist whole countries. Uses Cloudflare CF-IPCountry, MaxMind GeoLite2, or the GuardForge cloud lookup. Available with GuardForge Pro." msgstr "" #: admin/partials/geo-ip.php:29 msgid "Geo-IP settings saved." msgstr "" #: admin/partials/geo-ip.php:33 msgid "How resolution works" msgstr "" #: admin/partials/geo-ip.php:36 msgid "If your site is behind Cloudflare, the CF-IPCountry header is trusted." msgstr "" #. translators: %s is the full path where the MaxMind database is expected. #: admin/partials/geo-ip.php:46 #, php-format msgid "Otherwise GuardForge looks for a MaxMind GeoLite2 database at %s." msgstr "" #: admin/partials/geo-ip.php:51 msgid "Failing both, it falls back to the GuardForge cloud lookup (rate-limited per license)." msgstr "" #: admin/partials/geo-ip.php:53 msgid "Unknown countries are never auto-blocked — too high false-positive risk." msgstr "" #: admin/partials/geo-ip.php:63 msgid "Country list" msgstr "" #: admin/partials/geo-ip.php:66 msgid "Mode" msgstr "" #: admin/partials/geo-ip.php:68 msgid "Block-list (deny these countries)" msgstr "" #: admin/partials/geo-ip.php:69 msgid "Allow-list (only these countries)" msgstr "" #: admin/partials/geo-ip.php:73 msgid "Country codes (ISO 3166-1 alpha-2)" msgstr "" #: admin/partials/geo-ip.php:75 msgid "Comma-separated. Examples: US, GB, DE." msgstr "" #: admin/partials/hardening-score.php:34 msgid "Not done" msgstr "" #: admin/partials/hardening-score.php:35 msgid "Partly done" msgstr "" #: admin/partials/hardening-score.php:36 msgid "Does not apply here" msgstr "" #: admin/partials/hardening-score.php:37 msgid "Done" msgstr "" #: admin/partials/hardening-score.php:46 msgid "Set, not in force here" msgstr "" #: admin/partials/hardening-score.php:50 #: includes/class-core.php:128 msgid "Hardening score" msgstr "" #: admin/partials/hardening-score.php:50 msgid "One number, and every point attributable to a control you can change" msgstr "" #: admin/partials/hardening-score.php:53 msgid "The score has been worked out again." msgstr "" #: admin/partials/hardening-score.php:56 msgid "The public badge is on. Its link is below." msgstr "" #: admin/partials/hardening-score.php:59 msgid "A new link has been issued. The old one now answers with a 404." msgstr "" #: admin/partials/hardening-score.php:62 msgid "The public badge is off and its link no longer answers." msgstr "" #: admin/partials/hardening-score.php:67 msgid "This badge was switched on for a different host name, so it is not being served here. That is what stops a copy of the database on a staging site from publishing the live site's grade. Switch it on again if this really is where it belongs." msgstr "" #: admin/partials/hardening-score.php:90 #: admin/partials/settings.php:127 msgid "Settings overview, not a security certificate." msgstr "" #. translators: %s is a comma-separated list of checklist item names. #: admin/partials/hardening-score.php:115 #, php-format msgid "This score was worked out with staging mode on. %s is switched on and correct, and this copy is deliberately not enforcing it. It keeps its points — a copy is not less secure for holding an alert e-mail back — but read the number as what your settings say, not as what is stopping anybody here." msgid_plural "This score was worked out with staging mode on. These are switched on and correct, and this copy is deliberately not enforcing them: %s. They keep their points — a copy is not less secure for holding an alert e-mail back — but read the number as what your settings say, not as what is stopping anybody here." msgstr[0] "" msgstr[1] "" #. translators: %d is the number of checklist items that are not yet fully earned. #: admin/partials/hardening-score.php:132 #, php-format msgid "%d item on the list is not yet fully earned. Each row below states exactly how many points it is worth and where to change it." msgid_plural "%d items on the list are not yet fully earned. Each row below states exactly how many points it is worth and where to change it." msgstr[0] "" msgstr[1] "" #: admin/partials/hardening-score.php:136 msgid "Every check that applies to this site is earned in full." msgstr "" #. translators: %s is a date and time. #: admin/partials/hardening-score.php:144 #, php-format msgid "Worked out %s. Nothing here leaves your server — every check reads this installation and makes no request of any kind." msgstr "" #: admin/partials/hardening-score.php:152 msgid "Work it out again" msgstr "" #: admin/partials/hardening-score.php:159 msgid "The last ninety days" msgstr "" #: admin/partials/hardening-score.php:162 msgid "One reading is not a history. GuardForge records the score once a day, so the line appears from tomorrow." msgstr "" #: admin/partials/hardening-score.php:175 msgid "Hardening score over the last ninety days" msgstr "" #: admin/partials/hardening-score.php:181 msgid "Day" msgstr "" #: admin/partials/hardening-score.php:182 msgid "Score" msgstr "" #: admin/partials/hardening-score.php:183 msgid "Items outstanding" msgstr "" #: admin/partials/hardening-score.php:201 msgid "The checklist" msgstr "" #: admin/partials/hardening-score.php:232 msgid "no points either way" msgstr "" #. translators: %1$d is the points earned so far, %2$d the points this item is worth. #: admin/partials/hardening-score.php:236 #, php-format msgid "%1$d of %2$d points" msgstr "" #: admin/partials/hardening-score.php:250 msgid "Public badge" msgstr "" #: admin/partials/hardening-score.php:253 msgid "This link publishes a letter grade and the month it was worked out. The grade comes only from the settings anyone can already check by loading your site — XML-RPC, the version tag, your response headers, whether your login names are public, whether directories list their contents." msgstr "" #: admin/partials/hardening-score.php:256 msgid "It never publishes your score, your two-factor coverage, your brute-force settings, your integrity results, whether an account is called admin, or anything about pending updates or vulnerable components." msgstr "" #: admin/partials/hardening-score.php:261 msgid "Your REST API is restricted to signed-in callers. GuardForge keeps this one route reachable on its own, so the badge still answers — you do not need to widen the allowlist for it." msgstr "" #: admin/partials/hardening-score.php:269 msgid "Publish a badge" msgstr "" #: admin/partials/hardening-score.php:275 msgid "GuardForge hardening grade" msgstr "" #: admin/partials/hardening-score.php:279 msgid "Paste this where you want it to appear:" msgstr "" #. translators: %1$s is the letter grade, %2$s the month it was worked out, as YYYY-MM. #: admin/partials/hardening-score.php:286 #, php-format msgid "Currently published: grade %1$s, checked %2$s." msgstr "" #: admin/partials/hardening-score.php:294 msgid "The current link stops working straight away. Anywhere you have already pasted it will show a broken image until you paste the new one. Issue a new link?" msgstr "" #: admin/partials/hardening-score.php:297 msgid "Issue a new link" msgstr "" #: admin/partials/hardening-score.php:300 msgid "The badge link stops answering and everywhere it is pasted will show a broken image. Turn it off?" msgstr "" #: admin/partials/hardening-score.php:303 msgid "Turn the badge off" msgstr "" #: admin/partials/integrity.php:51 msgid "Official" msgstr "" #: admin/partials/integrity.php:52 #: admin/partials/integrity.php:252 msgid "Modified" msgstr "" #: admin/partials/integrity.php:53 msgid "Not in the official build" msgstr "" #: admin/partials/integrity.php:54 msgid "Missing" msgstr "" #: admin/partials/integrity.php:55 msgid "No reference" msgstr "" #: admin/partials/integrity.php:59 #: includes/class-core.php:131 msgid "File integrity" msgstr "" #: admin/partials/integrity.php:59 msgid "Every file checked against the hashes wordpress.org publishes" msgstr "" #. translators: %s is the path of the file that was put back. #: admin/partials/integrity.php:67 #, php-format msgid "%s was replaced with the copy wordpress.org publishes. The old one is kept under uploads." msgstr "" #: admin/partials/integrity.php:73 msgid "Nothing was changed." msgstr "" #: admin/partials/integrity.php:77 msgid "What was downloaded did not match the official checksum, so it was thrown away." msgstr "" #: admin/partials/integrity.php:80 msgid "That file, or the directory holding it, is not writable by WordPress." msgstr "" #: admin/partials/integrity.php:83 msgid "The original could not be downloaded from wordpress.org." msgstr "" #: admin/partials/integrity.php:86 msgid "The file being replaced could not be copied aside, and a restore that destroys the evidence is not worth having." msgstr "" #: admin/partials/integrity.php:89 msgid "That file is not one wordpress.org lists for this version." msgstr "" #. translators: %d is the number of files found that are not in the official build. #: admin/partials/integrity.php:100 #, php-format msgid "Scan finished — %d file is not in the official build." msgid_plural "Scan finished — %d files are not in the official build." msgstr[0] "" msgstr[1] "" #. translators: %1$d is the number of changed files, %2$d is the number of removed files. #: admin/partials/integrity.php:105 #, php-format msgid "Scan finished — %1$d changed, %2$d removed files detected." msgstr "" #: admin/partials/integrity.php:108 msgid "Scan finished — no changes detected." msgstr "" #: admin/partials/integrity.php:116 msgid "Files tracked" msgstr "" #: admin/partials/integrity.php:120 msgid "Last scan" msgstr "" #: admin/partials/integrity.php:123 msgid "Daily" msgstr "" #: admin/partials/integrity.php:124 msgid "Cron cadence" msgstr "" #: admin/partials/integrity.php:129 msgid "Against the official checksums" msgstr "" #: admin/partials/integrity.php:132 msgid "No scan has run yet. The first one builds the baseline and asks wordpress.org what this WordPress is supposed to contain." msgstr "" #: admin/partials/integrity.php:143 msgid "WordPress publishes a hash for every file of core and of every plugin it hosts. \"Not in the official build\" means a file nobody published is sitting in that directory — which is what a backdoor looks like from here. \"No reference\" means nothing was checked: nobody publishes hashes for themes, or for a plugin that is premium, custom, or not on wordpress.org." msgstr "" #. translators: %d is the number of theme files compared against the previous scan instead of a published hash. #: admin/partials/integrity.php:150 #, php-format msgid "Themes stay on the snapshot comparison — %d file(s) here." msgstr "" #. translators: %s is a comma-separated list of plugin folder names. #: admin/partials/integrity.php:156 #, php-format msgid "Still waiting for a reference, and queued for the next scan: %s." msgstr "" #: admin/partials/integrity.php:168 #: admin/partials/integrity.php:241 #: admin/partials/integrity.php:308 #: admin/partials/scanner.php:105 msgid "File" msgstr "" #: admin/partials/integrity.php:169 msgid "Verdict" msgstr "" #: admin/partials/integrity.php:170 #: admin/partials/integrity.php:309 msgid "Scope" msgstr "" #: admin/partials/integrity.php:191 msgid "Restore from wordpress.org" msgstr "" #. translators: %s is a link to the WordPress Updates screen. #: admin/partials/integrity.php:198 #, php-format msgid "Put core files back by re-installing WordPress from %s." msgstr "" #: admin/partials/integrity.php:199 msgid "Dashboard → Updates" msgstr "" #. translators: %s is a link to the Plugins screen. #: admin/partials/integrity.php:208 #, php-format msgid "Reinstall it from %s — one file put back on its own can leave a half-updated plugin." msgstr "" #: admin/partials/integrity.php:209 msgid "Plugins" msgstr "" #. translators: 1: number of files listed here, 2: total number of files the checksums flagged. #: admin/partials/integrity.php:224 #, php-format msgid "Showing the %1$d most serious of %2$d." msgstr "" #: admin/partials/integrity.php:230 msgid "Nothing was flagged: every file that could be checked matched what wordpress.org published." msgstr "" #: admin/partials/integrity.php:237 msgid "What changed in the last scan" msgstr "" #: admin/partials/integrity.php:242 msgid "Change" msgstr "" #: admin/partials/integrity.php:251 msgid "Removed" msgstr "" #. translators: 1: number of files listed here, 2: total number of files the scan flagged. #: admin/partials/integrity.php:268 #, php-format msgid "Showing %1$d of %2$d flagged files." msgstr "" #: admin/partials/integrity.php:276 msgid "GuardForge Pro reads every event automatically, once an hour, instead of one at a time." msgstr "" #: admin/partials/integrity.php:287 msgid "Manual scan" msgstr "" #: admin/partials/integrity.php:292 #: admin/partials/settings.php:434 msgid "Run scan now" msgstr "" #: admin/partials/integrity.php:295 msgid "First run builds the baseline. Subsequent runs compare against the previous snapshot." msgstr "" #: admin/partials/integrity.php:301 msgid "Last verified files" msgstr "" #: admin/partials/integrity.php:304 msgid "No data yet. Run the scan above to create a baseline." msgstr "" #: admin/partials/integrity.php:310 msgid "SHA-256" msgstr "" #: admin/partials/integrity.php:311 #: admin/partials/settings.php:162 #: admin/partials/settings.php:291 msgid "Verified" msgstr "" #. translators: %d is the total number of tracked files. #: admin/partials/integrity.php:328 #, php-format msgid "Showing first 200 of %d files." msgstr "" #: admin/partials/lockdown.php:13 #: admin/partials/lockdown.php:25 msgid "Lockdown mode" msgstr "" #: admin/partials/lockdown.php:14 msgid "One-click emergency switch: disables registration, comments, REST writes and XML-RPC until you flip it back. Available with GuardForge Pro." msgstr "" #: admin/partials/lockdown.php:26 msgid "ACTIVE" msgstr "" #: admin/partials/lockdown.php:26 msgid "inactive" msgstr "" #: admin/partials/lockdown.php:36 msgid "⚠ Lockdown is now ACTIVE. Anonymous writes, registration and comments are disabled." msgstr "" #: admin/partials/lockdown.php:37 msgid "✓ Lockdown lifted — site is back to normal operation." msgstr "" #: admin/partials/lockdown.php:42 msgid "What lockdown does" msgstr "" #: admin/partials/lockdown.php:45 msgid "Disables new user registration." msgstr "" #: admin/partials/lockdown.php:46 msgid "Closes comments and pingbacks site-wide." msgstr "" #: admin/partials/lockdown.php:47 msgid "Blocks anonymous POST / PUT / DELETE REST calls (logged-in users unaffected)." msgstr "" #: admin/partials/lockdown.php:48 msgid "Forces XML-RPC off regardless of other settings." msgstr "" #: admin/partials/lockdown.php:50 msgid "Flip this on the moment you spot an incident, contain it, then flip back." msgstr "" #: admin/partials/lockdown.php:55 #: admin/partials/lockdown.php:62 msgid "Lift lockdown" msgstr "" #: admin/partials/lockdown.php:55 #: admin/partials/lockdown.php:62 msgid "Activate lockdown" msgstr "" #: admin/partials/lockdown.php:61 msgid "Lift lockdown?" msgstr "" #: admin/partials/lockdown.php:61 msgid "Activate lockdown now? Comments, registration and anonymous writes will be disabled." msgstr "" #: admin/partials/lockdown.php:69 msgid "Auto-lockdown settings saved." msgstr "" #: admin/partials/lockdown.php:78 msgid "Auto-lockdown" msgstr "" #: admin/partials/lockdown.php:80 msgid "Let GuardForge throw this same switch on its own, when one of its own signals already looks like an incident under way. It lifts itself after the window below, or you can lift it by hand at any time." msgstr "" #: admin/partials/lockdown.php:86 msgid "Enable auto-lockdown" msgstr "" #: admin/partials/lockdown.php:87 msgid "Master switch for both triggers below." msgstr "" #: admin/partials/lockdown.php:96 msgid "On a lockout spike" msgstr "" #. translators: %d is the fixed window, in minutes, the threshold counts distinct IPs over. #: admin/partials/lockdown.php:102 #, php-format msgid "This many distinct IP addresses locked out within %d minutes." msgstr "" #: admin/partials/lockdown.php:112 msgid "On a malware-scanner finding" msgstr "" #: admin/partials/lockdown.php:114 msgid "Any signature match from a quick or deep scan." msgstr "" #: admin/partials/lockdown.php:117 msgid "Lift automatically after (minutes)" msgstr "" #: admin/partials/login-log.php:15 msgid "Login log cleared." msgstr "" #. translators: %d is the total number of authentication attempts. #: admin/partials/login-log.php:57 #, php-format msgid "Authentication attempts · total: %d" msgstr "" #: admin/partials/login-log.php:60 #: includes/class-core.php:139 msgid "Login log" msgstr "" #: admin/partials/login-log.php:68 msgid "All results" msgstr "" #: admin/partials/login-log.php:69 msgid "Success" msgstr "" #: admin/partials/login-log.php:70 msgid "Failed" msgstr "" #: admin/partials/login-log.php:71 msgid "Locked" msgstr "" #: admin/partials/login-log.php:72 msgid "Soft-locked (staging)" msgstr "" #: admin/partials/login-log.php:74 msgid "Filter by IP" msgstr "" #: admin/partials/login-log.php:80 msgid "Clear the entire login log?" msgstr "" #: admin/partials/login-log.php:90 msgid "IP address" msgstr "" #: admin/partials/login-log.php:92 msgid "Result" msgstr "" #: admin/partials/login-log.php:93 msgid "User-Agent" msgstr "" #: admin/partials/scanner.php:15 #: admin/partials/scanner.php:35 #: includes/class-core.php:130 msgid "Malware scanner" msgstr "" #: admin/partials/scanner.php:16 msgid "Heuristics + signature-based scanning across wp-content. Available with GuardForge Pro." msgstr "" #: admin/partials/scanner.php:36 msgid "never run" msgstr "" #: admin/partials/scanner.php:40 msgid "Scan complete." msgstr "" #: admin/partials/scanner.php:44 msgid "Run a scan" msgstr "" #: admin/partials/scanner.php:50 msgid "Quick" msgstr "" #. translators: %s is a comma-separated list of scanned file extensions. #: admin/partials/scanner.php:53 #, php-format msgid "%s files, 1 MB cap per file." msgstr "" #: admin/partials/scanner.php:57 msgid "Deep" msgstr "" #. translators: %s is a comma-separated list of scanned file extensions. #: admin/partials/scanner.php:60 #, php-format msgid "Same %s files, 8 MB cap per file, slower." msgstr "" #: admin/partials/scanner.php:65 msgid "Anything with a different extension is not opened by either mode — that is a wider net, not a deeper one, and is not what this button does today." msgstr "" #: admin/partials/scanner.php:66 msgid "Run scan" msgstr "" #: admin/partials/scanner.php:73 msgid "Files checked" msgstr "" #: admin/partials/scanner.php:74 msgid "Files skipped" msgstr "" #: admin/partials/scanner.php:75 msgid "Read errors" msgstr "" #: admin/partials/scanner.php:76 msgid "Last mode" msgstr "" #. translators: 1: extension skips, 2: empty-file skips, 3: oversized-file skips, 4: unreadable errors, 5: read-failure errors. #: admin/partials/scanner.php:82 #, php-format msgid "Skipped: %1$d outside the scanned extensions, %2$d empty, %3$d over the size cap. Errors: %4$d unreadable, %5$d that could not be read." msgstr "" #. translators: %s is the internal id of the last completed scan run. #: admin/partials/scanner.php:93 #, php-format msgid "Run id: %s" msgstr "" #. translators: %d is the number of files with findings. #: admin/partials/scanner.php:101 #, php-format msgid "Findings (%d files)" msgstr "" #: admin/partials/scanner.php:105 msgid "Signatures" msgstr "" #. translators: %d is the number of files actually read and matched against the signatures. #: admin/partials/scanner.php:121 #, php-format msgid "No malware signatures matched in the %d files the last scan checked." msgstr "" #: admin/partials/scanner.php:126 msgid "The last scan checked no files at all — the counts above say why: files outside the scanned extensions, empty or oversized files, or files it could not read. That is not the same as a clean result." msgstr "" #: admin/partials/settings.php:30 msgid "Recommended" msgstr "" #: admin/partials/settings.php:30 msgid "Optional" msgstr "" #: admin/partials/settings.php:46 #: includes/class-core.php:127 msgid "Settings" msgstr "" #: admin/partials/settings.php:46 msgid "Comprehensive WordPress protection" msgstr "" #: admin/partials/settings.php:49 msgid "Settings saved." msgstr "" #: admin/partials/settings.php:55 msgid ".htaccess is not writable — file-protection rules will not be applied." msgstr "" #: admin/partials/settings.php:60 msgid "Staging mode is on." msgstr "" #: admin/partials/settings.php:61 msgid "Lockouts are recorded but not enforced, and no e-mail, alert or firewall rule leaves this site." msgstr "" #. translators: %d is how many e-mails, alerts, firewall rules and lockouts have been held back. #: admin/partials/settings.php:67 #: includes/class-staging.php:556 #, php-format msgid "%d thing has been held back so far." msgid_plural "%d things have been held back so far." msgstr[0] "" msgstr[1] "" #. translators: %d is the number of checklist items that are not yet fully earned. #: admin/partials/settings.php:96 #, php-format msgid "%d item still needs attention." msgid_plural "%d items still need attention." msgstr[0] "" msgstr[1] "" #: admin/partials/settings.php:100 msgid "Every check on the list is earned in full." msgstr "" #. translators: %d is how many checklist items are switched on but not enforced on this copy. #: admin/partials/settings.php:113 #, php-format msgid "Staging mode holds %d of them soft on this copy — it keeps its points, and it is not protecting anybody here." msgid_plural "Staging mode holds %d of them soft on this copy — they keep their points, and they are not protecting anybody here." msgstr[0] "" msgstr[1] "" #: admin/partials/settings.php:128 msgid "Open the hardening score →" msgstr "" #: admin/partials/settings.php:149 msgid "At a glance" msgstr "" #: admin/partials/settings.php:154 #: admin/partials/settings.php:384 msgid "Not working" msgstr "" #: admin/partials/settings.php:158 #: admin/partials/settings.php:221 msgid "Needs a decision" msgstr "" #: admin/partials/settings.php:165 msgid "From the same checklist as the hardening score above — open it for what each row means and how to fix it." msgstr "" #: admin/partials/settings.php:187 msgid "Vulnerability feed" msgstr "" #: admin/partials/settings.php:188 msgid "File integrity scan" msgstr "" #: admin/partials/settings.php:189 msgid "Alerts" msgstr "" #: admin/partials/settings.php:190 #: includes/class-core.php:132 msgid "Cloudflare" msgstr "" #: admin/partials/settings.php:217 msgid "Cases and protection checks" msgstr "" #: admin/partials/settings.php:218 msgid "Open investigations from integrity, vulnerability and login-log observations, and whether the checks behind them actually ran — not a second opinion on the checklist above." msgstr "" #. translators: %s is the date and time the case list was last brought up to date. #: admin/partials/settings.php:238 #, php-format msgid "No open case was waiting on a decision as of the last check, %s." msgstr "" #: admin/partials/settings.php:242 msgid "Case data has not been checked yet." msgstr "" #. translators: 1: confidence level (high/medium/low), 2: case status. #: admin/partials/settings.php:266 #, php-format msgid "(%1$s confidence, %2$s)" msgstr "" #. translators: %d is how many more open cases are not shown in this short list. #: admin/partials/settings.php:280 #, php-format msgid "%d more case is not shown here." msgid_plural "%d more cases are not shown here." msgstr[0] "" msgstr[1] "" #: admin/partials/settings.php:287 msgid "Open Cases →" msgstr "" #. translators: 1: how many cases closed as fixed or explained, 2: the window in days. #: admin/partials/settings.php:297 #, php-format msgid "%1$d case was closed as fixed or explained in the last %2$d days." msgid_plural "%1$d cases were closed as fixed or explained in the last %2$d days." msgstr[0] "" msgstr[1] "" #: admin/partials/settings.php:333 msgid "Not run yet" msgstr "" #: admin/partials/settings.php:344 msgid "Run first scan" msgstr "" #: admin/partials/settings.php:347 #: admin/partials/settings.php:349 #: admin/partials/settings.php:444 msgid "Open →" msgstr "" #: admin/partials/settings.php:371 msgid "Not checked on this site" msgstr "" #: admin/partials/settings.php:387 msgid "Every check above ran and succeeded recently." msgstr "" #. translators: %d is how many of the checks above are part of Pro or not configured on this site — not a failure, just not run here. #: admin/partials/settings.php:404 #, php-format msgid "Nothing that ran failed — %d check above did not run on this site." msgid_plural "Nothing that ran failed — %d checks above did not run on this site." msgstr[0] "" msgstr[1] "" #: admin/partials/settings.php:441 #: admin/partials/vuln-db.php:173 msgid "Fetch now" msgstr "" #: admin/partials/settings.php:450 msgid "Scheduled tasks run through WP-Cron. If DISABLE_WP_CRON is set in wp-config.php and no system cron calls wp-cron.php, or if the server cannot make a loopback request to this site, they never start. The button runs the check once now; the schedule itself still has to be fixed." msgstr "" #: admin/partials/settings.php:472 msgid "API & Protocols" msgstr "" #: admin/partials/settings.php:475 msgid "Disable XML-RPC" msgstr "" #: admin/partials/settings.php:475 msgid "Blocks xmlrpc.php — a primary DDoS / brute-force vector." msgstr "" #: admin/partials/settings.php:476 msgid "Restrict REST API to logged-in users" msgstr "" #: admin/partials/settings.php:476 msgid "Anonymous REST access is limited to the namespaces in the allowlist below." msgstr "" #: admin/partials/settings.php:477 msgid "Forbid comments via REST" msgstr "" #: admin/partials/settings.php:477 msgid "Blocks POST /wp/v2/comments." msgstr "" #: admin/partials/settings.php:478 msgid "Disable oEmbed discovery" msgstr "" #: admin/partials/settings.php:478 msgid "Removes /oembed information leaks." msgstr "" #: admin/partials/settings.php:479 msgid "Disable self-pingbacks" msgstr "" #: admin/partials/settings.php:479 msgid "Blocks pingbacks pointing at your own URLs." msgstr "" #: admin/partials/settings.php:485 msgid "Hardening" msgstr "" #: admin/partials/settings.php:488 msgid "Hide WordPress version" msgstr "" #: admin/partials/settings.php:488 msgid "Removes the generator meta and ver=… query strings." msgstr "" #: admin/partials/settings.php:489 msgid "Disable theme/plugin file editor" msgstr "" #: admin/partials/settings.php:489 msgid "Defines DISALLOW_FILE_EDIT so PHP can't be edited from the admin." msgstr "" #: admin/partials/settings.php:490 msgid "Block user enumeration" msgstr "" #: admin/partials/settings.php:490 msgid "Redirects ?author=N and hides anonymous /wp/v2/users." msgstr "" #: admin/partials/settings.php:491 msgid "Send security HTTP headers" msgstr "" #: admin/partials/settings.php:491 msgid "Referrer-Policy, X-Content-Type-Options, X-Frame-Options, Permissions-Policy." msgstr "" #: admin/partials/settings.php:492 msgid "Math captcha on login" msgstr "" #: admin/partials/settings.php:492 msgid "Adds an a + b = ? challenge to the login form." msgstr "" #: admin/partials/settings.php:498 msgid "Files & Directories" msgstr "" #: admin/partials/settings.php:501 msgid "Protect sensitive files" msgstr "" #: admin/partials/settings.php:501 msgid "Denies direct access to wp-config.php, .htaccess, readme.html, license.txt via .htaccess." msgstr "" #: admin/partials/settings.php:502 msgid "Disable directory listing" msgstr "" #: admin/partials/settings.php:502 msgid "Options -Indexes — folders no longer show their contents." msgstr "" #: admin/partials/settings.php:508 msgid "Spam & Bots" msgstr "" #: admin/partials/settings.php:511 msgid "Comment-form honeypot" msgstr "" #: admin/partials/settings.php:511 msgid "Adds a hidden field bots tend to fill — humans don't." msgstr "" #: admin/partials/settings.php:512 msgid "Block malicious bot User-Agents" msgstr "" #: admin/partials/settings.php:512 msgid "Blocks sqlmap, nikto, masscan, wpscan, nessus and similar scanners." msgstr "" #: admin/partials/settings.php:518 msgid "Staging / development mode" msgstr "" #: admin/partials/settings.php:533 msgid "Right now: staging mode is ON." msgstr "" #: admin/partials/settings.php:534 msgid "Right now: staging mode is off and every protection is enforced." msgstr "" #: admin/partials/settings.php:538 msgid "The address matched against your list:" msgstr "" #: admin/partials/settings.php:544 msgid "Staging host names" msgstr "" #: admin/partials/settings.php:546 msgid "One host name per line, matched against the address this site is actually served on. A leading dot matches every subdomain of that name but never the name itself, so \".example.com\" covers dev.example.com and leaves example.com alone. Nothing else is a pattern. Because the match is against the live address, copying this database onto your production site stops it matching the moment the domain changes." msgstr "" #: admin/partials/settings.php:551 msgid "Always treat this site as production" msgstr "" #: admin/partials/settings.php:552 msgid "Overrules everything above and every signal below it. Use this when a real site is being mistaken for a copy — it can only ever make GuardForge more protective, never less, which is why it is safe to keep in the database." msgstr "" #: admin/partials/settings.php:557 msgid "While staging mode is on, GuardForge holds back:" msgstr "" #: admin/partials/settings.php:559 msgid "Brute-force lockouts — attempts are still counted and written to the login log as \"soft_locked\", but nobody is shut out." msgstr "" #: admin/partials/settings.php:560 msgid "Every notification e-mail: lockouts, new administrators and file-integrity changes." msgstr "" #: admin/partials/settings.php:569 msgid "Telegram, Slack and webhook alerts." msgstr "" #: admin/partials/settings.php:572 msgid "Cloudflare firewall rules — a copy shares the live zone and token, so a block pushed from here would land in front of your real site." msgstr "" #: admin/partials/settings.php:575 msgid "Auto-lockdown — a spike in lockouts or a malware finding on a copy does not shut the site down." msgstr "" #: admin/partials/settings.php:578 msgid "AI threat analysis, so a forgotten copy cannot spend your credits." msgstr "" #: admin/partials/settings.php:581 msgid "To switch staging mode on by hand, add define( 'GUARDFORGE_STAGING_MODE', true ); to wp-config.php. Setting it to false pins the site to production. It lives in wp-config.php rather than in a setting on purpose: a database copied from staging onto your live site must never be able to carry the switch that turns your security off." msgstr "" #: admin/partials/settings.php:587 msgid "Brute-force protection" msgstr "" #: admin/partials/settings.php:590 msgid "Enable brute-force protection" msgstr "" #: admin/partials/settings.php:590 msgid "Locks IPs that exceed the failed-attempt threshold." msgstr "" #: admin/partials/settings.php:591 msgid "Record login attempts" msgstr "" #: admin/partials/settings.php:591 msgid "Stores every login attempt in the database." msgstr "" #: admin/partials/settings.php:592 msgid "Email on lockout" msgstr "" #: admin/partials/settings.php:592 msgid "Send an email whenever an IP is locked out." msgstr "" #: admin/partials/settings.php:598 msgid "Integrity monitoring" msgstr "" #: admin/partials/settings.php:603 msgid "Monitor core file integrity" msgstr "" #: admin/partials/settings.php:606 msgid "Off by default. When on, this site asks api.wordpress.org once a day for the official checksums of your WordPress version and compares wp-admin and wp-includes against them. The request carries the version and the locale, nothing about your site. \"Run scan now\" on the File integrity screen runs one scan without putting anything on a schedule." msgstr "" #: admin/partials/settings.php:608 msgid "Email on integrity changes" msgstr "" #: admin/partials/settings.php:608 msgid "Alerts you when modified or removed files are detected." msgstr "" #: admin/partials/settings.php:609 msgid "Also monitor plugins & themes" msgstr "" #: admin/partials/settings.php:609 msgid "Extends the scan to wp-content/plugins and wp-content/themes." msgstr "" #: admin/partials/settings.php:613 msgid "Last scan:" msgstr "" #: admin/partials/settings.php:638 msgid "Action audit" msgstr "" #: admin/partials/settings.php:641 msgid "Log admin actions" msgstr "" #: admin/partials/settings.php:641 msgid "Records plugin/theme/post/option/user/role changes." msgstr "" #: admin/partials/settings.php:642 msgid "Email on new administrator" msgstr "" #: admin/partials/settings.php:642 msgid "Sends an alert whenever a user is promoted to administrator." msgstr "" #: admin/partials/settings.php:648 msgid "Content Security Policy" msgstr "" #: admin/partials/settings.php:651 msgid "Send Content-Security-Policy header" msgstr "" #: admin/partials/settings.php:651 msgid "Controls where scripts and styles may load from. Excellent XSS hardening when tuned." msgstr "" #: admin/partials/settings.php:652 msgid "Send as report-only (recommended first)" msgstr "" #: admin/partials/settings.php:652 msgid "Reports violations without blocking — flip off once your policy is tuned." msgstr "" #: admin/partials/settings.php:655 msgid "CSP policy" msgstr "" #: admin/partials/settings.php:657 msgid "Value of the Content-Security-Policy header. Test thoroughly — aggressive policies can break plugins." msgstr "" #: admin/partials/settings.php:663 msgid "Brute-force & notification parameters" msgstr "" #: admin/partials/settings.php:666 msgid "Max attempts" msgstr "" #: admin/partials/settings.php:668 msgid "Failed attempts before the IP is locked." msgstr "" #: admin/partials/settings.php:671 msgid "Lockout duration (minutes)" msgstr "" #: admin/partials/settings.php:673 msgid "How long an IP stays locked." msgstr "" #: admin/partials/settings.php:676 msgid "Login log retention (days)" msgstr "" #: admin/partials/settings.php:678 msgid "Older login-log rows are pruned." msgstr "" #: admin/partials/settings.php:681 msgid "Audit log retention (days)" msgstr "" #: admin/partials/settings.php:683 msgid "Older audit rows are pruned." msgstr "" #: admin/partials/settings.php:686 msgid "Notification email" msgstr "" #: admin/partials/settings.php:688 msgid "Falls back to the site administrator email." msgstr "" #: admin/partials/settings.php:691 msgid "IP whitelist" msgstr "" #: admin/partials/settings.php:693 msgid "One IP or CIDR per line — never blocked." msgstr "" #: admin/partials/settings.php:696 msgid "Trusted proxy CIDRs" msgstr "" #: admin/partials/settings.php:698 msgid "Forwarded-IP headers are only trusted when REMOTE_ADDR matches one of these ranges. Leave empty if you do not run behind a proxy." msgstr "" #: admin/partials/settings.php:701 msgid "REST API allowlist" msgstr "" #: admin/partials/settings.php:703 msgid "One namespace prefix per line. Routes whose namespace starts with one of these remain accessible to anonymous callers (oembed, formforge submissions, etc.)." msgstr "" #: admin/partials/settings.php:706 msgid "Extra User-Agent blocklist" msgstr "" #: admin/partials/settings.php:708 msgid "One substring per line. Case-insensitive contains match." msgstr "" #: admin/partials/settings.php:714 msgid "When GuardForge is deleted" msgstr "" #: admin/partials/settings.php:718 msgid "Delete GuardForge data on uninstall" msgstr "" #: admin/partials/settings.php:719 msgid "Off by default: deleting the plugin leaves your login log, integrity snapshots and audit trail in place, so an accidental removal does not take your history with it. Two-factor enrolments are the exception and are always removed — they are shared secrets, and a database that outlives the plugin should not keep them." msgstr "" #: admin/partials/settings.php:728 msgid "Save settings" msgstr "" #: admin/partials/two-factor.php:56 msgid "Two-factor enrolment QR code" msgstr "" #: admin/partials/two-factor.php:64 msgid "Two-Factor Authentication" msgstr "" #: admin/partials/two-factor.php:65 msgid "Enabled" msgstr "" #: admin/partials/two-factor.php:65 msgid "Not enrolled" msgstr "" #: admin/partials/two-factor.php:69 msgid "Two-factor authentication enabled." msgstr "" #: admin/partials/two-factor.php:72 msgid "Two-factor authentication disabled." msgstr "" #: admin/partials/two-factor.php:75 msgid "Verification failed. Try again." msgstr "" #: admin/partials/two-factor.php:78 msgid "Administrators must enrol in 2FA before accessing other admin pages." msgstr "" #: admin/partials/two-factor.php:83 msgid "Recovery codes — save these now" msgstr "" #: admin/partials/two-factor.php:85 msgid "Each code works once. Store them somewhere safe — they let you log in if you lose your authenticator app." msgstr "" #: admin/partials/two-factor.php:97 msgid "Enable two-factor authentication" msgstr "" #: admin/partials/two-factor.php:103 msgid "Scan this with Google Authenticator, 1Password, Authy or any other TOTP app:" msgstr "" #: admin/partials/two-factor.php:133 msgid "Or type the key in by hand. Account name: your e-mail address." msgstr "" #: admin/partials/two-factor.php:136 msgid "Open in an authenticator app on this device" msgstr "" #: admin/partials/two-factor.php:142 msgid "Enter the 6-digit code from your app" msgstr "" #: admin/partials/two-factor.php:146 msgid "Verify & enable" msgstr "" #: admin/partials/two-factor.php:152 msgid "Two-factor authentication is enabled" msgstr "" #: admin/partials/two-factor.php:154 msgid "Enrolled on:" msgstr "" #: admin/partials/two-factor.php:155 msgid "Last used:" msgstr "" #: admin/partials/two-factor.php:155 #: admin/partials/vuln-db.php:129 #: admin/partials/vuln-db.php:145 msgid "never" msgstr "" #: admin/partials/two-factor.php:156 msgid "Disable two-factor authentication for your account?" msgstr "" #: admin/partials/two-factor.php:159 msgid "Disable 2FA" msgstr "" #: admin/partials/two-factor.php:184 msgid "Site-wide policy" msgstr "" #: admin/partials/two-factor.php:187 msgid "Your own account is fully protected by the settings above. GuardForge Pro adds enforcement for everyone else: require every administrator to be enrolled, and hold anyone who is not on this screen until they finish." msgstr "" #. translators: %s is the IP address that was unblocked. #: admin/partials/unblock.php:15 #, php-format msgid "IP %s unblocked." msgstr "" #: admin/partials/unblock.php:41 #: includes/class-core.php:140 msgid "Unblock IP" msgstr "" #: admin/partials/unblock.php:41 msgid "Lift brute-force lockouts" msgstr "" #: admin/partials/unblock.php:44 msgid "Manual unblock" msgstr "" #: admin/partials/unblock.php:48 msgid "Enter IP address" msgstr "" #: admin/partials/unblock.php:49 #: admin/partials/unblock.php:75 #: admin/partials/unblock.php:100 #: includes/class-core.php:187 msgid "Unblock" msgstr "" #. translators: %d is the number of active IP lockouts. #: admin/partials/unblock.php:57 #, php-format msgid "Active lockouts (%d)" msgstr "" #: admin/partials/unblock.php:60 msgid "No active lockouts." msgstr "" #: admin/partials/unblock.php:63 msgid "Transient key" msgstr "" #: admin/partials/unblock.php:63 msgid "Attempts" msgstr "" #: admin/partials/unblock.php:63 #: admin/partials/unblock.php:89 msgid "Action" msgstr "" #: admin/partials/unblock.php:87 msgid "IPs from lockout log" msgstr "" #: admin/partials/unblock.php:89 msgid "Times locked" msgstr "" #: admin/partials/unblock.php:89 msgid "Last time" msgstr "" #: admin/partials/vuln-db.php:33 msgid "Vulnerability database" msgstr "" #: admin/partials/vuln-db.php:34 msgid "The advisory database is served by GuardForge Pro, a separate add-on. This build carries no advisory source of its own, so there is nothing to list here. File integrity, the audit log and brute-force protection are unaffected." msgstr "" #. translators: %1$d is total advisory records, %2$d is records affecting this site. #: admin/partials/vuln-db.php:102 #, php-format msgid "%1$d records · %2$d affecting this site" msgstr "" #: admin/partials/vuln-db.php:105 #: includes/class-core.php:129 msgid "Vulnerabilities" msgstr "" #. translators: %d is the number of days the free feed lags behind. #: admin/partials/vuln-db.php:114 #, php-format msgid "This feed is delayed %d days. GuardForge Pro reads the same advisories in real time." msgstr "" #: admin/partials/vuln-db.php:118 msgid "Every advisory below is public and matched against what is installed here. The publication date of each one is in the table, so you can see how old the news is." msgstr "" #. translators: 1: error message from the last fetch, 2: date and time of the last successful fetch. #: admin/partials/vuln-db.php:127 #, php-format msgid "The last check did not bring anything back: %1$s The records below are from %2$s." msgstr "" #: admin/partials/vuln-db.php:136 msgid "This feed has never been downloaded, because the download is switched off. Nothing below can be trusted as a clean result until it has run — turn it on under Settings → Vulnerability database." msgstr "" #: admin/partials/vuln-db.php:137 msgid "This feed has not completed a first fetch yet. Nothing below can be trusted as a clean result until it has — use \"Fetch now\" below." msgstr "" #. translators: %s is the date and time of the last successful fetch. #: admin/partials/vuln-db.php:144 #, php-format msgid "The last successful fetch was on %s — longer ago than the daily check is supposed to allow. The records below may not be current." msgstr "" #: admin/partials/vuln-db.php:151 msgid "Open hits" msgstr "" #: admin/partials/vuln-db.php:152 msgid "Advisory records" msgstr "" #: admin/partials/vuln-db.php:153 msgid "Last fetch" msgstr "" #: admin/partials/vuln-db.php:155 msgid "Feed generated" msgstr "" #: admin/partials/vuln-db.php:160 msgid "Refresh feed" msgstr "" #: admin/partials/vuln-db.php:164 msgid "This download is switched off. GuardForge contacts no external server for advisories until you turn it on under Settings → Vulnerability database, where the exact address and what the request carries are spelled out." msgstr "" #: admin/partials/vuln-db.php:167 msgid "Open Settings" msgstr "" #: admin/partials/vuln-db.php:177 msgid "Runs automatically every day. Manual fetch here for immediate update." msgstr "" #: admin/partials/vuln-db.php:179 msgid "Automatic daily updates need a newer GuardForge Pro (update it under Plugins); until then the database changes only when you press Fetch now." msgstr "" #: admin/partials/vuln-db.php:181 msgid "Automatic daily updates are switched off in GuardForge Pro (Daily database update, below); the database changes only when you press Fetch now." msgstr "" #: admin/partials/vuln-db.php:201 msgid "Affecting this site" msgstr "" #: admin/partials/vuln-db.php:204 msgid "No open vulnerabilities for your installed plugins or themes. Nice." msgstr "" #: admin/partials/vuln-db.php:208 msgid "Slug" msgstr "" #: admin/partials/vuln-db.php:210 msgid "Version" msgstr "" #: admin/partials/vuln-db.php:211 msgid "Affected" msgstr "" #: admin/partials/vuln-db.php:212 msgid "Fixed in" msgstr "" #: admin/partials/vuln-db.php:213 msgid "Severity" msgstr "" #: admin/partials/vuln-db.php:214 msgid "CVE" msgstr "" #: admin/partials/vuln-db.php:215 msgid "Published" msgstr "" #: admin/partials/vuln-db.php:216 msgid "Summary" msgstr "" #: includes/class-admin-header.php:120 msgid "Previous page" msgstr "" #: includes/class-admin-header.php:128 msgid "Next page" msgstr "" #: includes/class-admin-header.php:183 msgid "Guard Forge" msgstr "" #: includes/class-admin-header.php:216 msgid "Docs" msgstr "" #: includes/class-audit-log.php:767 msgid "GuardForge — new administrator" msgstr "" #. translators: 1: login, 2: user id, 3: timestamp. #: includes/class-audit-log.php:770 #, php-format msgid "" "User %1$s (ID: %2$d) was granted the administrator role.\n" "Time: %3$s" msgstr "" #. translators: %d is the lockout window in minutes. #: includes/class-bruteforce.php:57 #, php-format msgid "Too many failed attempts. Try again in %d minutes." msgstr "" #: includes/class-bruteforce.php:60 msgid "Access temporarily blocked" msgstr "" #: includes/class-bruteforce.php:250 msgid "GuardForge — IP locked out" msgstr "" #. translators: 1: IP, 2: username, 3: timestamp. #: includes/class-bruteforce.php:254 #, php-format msgid "" "IP %1$s was locked out after exceeding the failed-login threshold.\n" "\n" "Username: %2$s\n" "Time: %3$s\n" "" msgstr "" #. translators: %d is the number of flagged files this run found but did not carry in the summary (capped list). #: includes/class-cases.php:244 #, php-format msgid "%d more flagged file from this scan is not shown here — the stored summary is capped." msgid_plural "%d more flagged files from this scan are not shown here — the stored summary is capped." msgstr[0] "" msgstr[1] "" #. translators: %d is the number of locally changed files this run found but did not carry in the summary (capped list). #: includes/class-cases.php:268 #, php-format msgid "%d more file changed since the previous snapshot is not shown here — the stored summary is capped." msgid_plural "%d more files changed since the previous snapshot are not shown here — the stored summary is capped." msgstr[0] "" msgstr[1] "" #. translators: 1: installed Pro version, 2: required Pro version #: includes/class-core.php:65 #, php-format msgid "GuardForge Pro %1$s is too old for this version of GuardForge, so it is switched off rather than left running. Install GuardForge Pro %2$s or newer." msgstr "" #: includes/class-core.php:71 msgid "Until then alerts to Telegram, Slack or a webhook, the Cloudflare firewall push, automatic lockdown, patch by update, the WAF, malware scanning, AI threat analysis, required 2FA and audit export are unavailable. Your logs, baselines and settings are kept." msgstr "" #: includes/class-core.php:73 msgid "If Dashboard → Updates lists no update for it, download the add-on from your Avakode dashboard and upload it over this copy in Plugins → Add New Plugin → Upload Plugin." msgstr "" #: includes/class-core.php:74 msgid "Open Downloads" msgstr "" #: includes/class-core.php:102 #: includes/class-core.php:103 msgid "GuardForge" msgstr "" #: includes/class-core.php:141 msgid "Lockdown" msgstr "" #: includes/class-core.php:142 msgid "Geo-IP" msgstr "" #: includes/class-core.php:143 msgid "2FA" msgstr "" #: includes/class-core.php:185 msgid "Clear the log? This cannot be undone." msgstr "" #: includes/class-core.php:186 msgid "Scanning…" msgstr "" #: includes/class-first-screen.php:102 msgid "The advisory feed is not part of this version of GuardForge." msgstr "" #. translators: %s: the date and time the advisories were fetched #: includes/class-first-screen.php:118 #, php-format msgid "Advisories fetched on %s." msgstr "" #: includes/class-first-screen.php:119 msgid "Advisories fetched." msgstr "" #. translators: %d: how many days behind the licensed feed this free one is #: includes/class-first-screen.php:124 #, php-format msgid "This free feed is delayed %d day. GuardForge Pro reads the same advisories in real time." msgid_plural "This free feed is delayed %d days. GuardForge Pro reads the same advisories in real time." msgstr[0] "" msgstr[1] "" #. translators: %s: the date the feed download was switched on #: includes/class-first-screen.php:155 #, php-format msgid "The feed download was switched on %s and nothing has been fetched since." msgstr "" #: includes/class-first-screen.php:158 msgid "The advisory feed has not been fetched yet." msgstr "" #: includes/class-first-screen.php:166 msgid "The advisory feed is not up to date." msgstr "" #. translators: %s: the date and time of the last successful fetch #: includes/class-first-screen.php:175 #, php-format msgid "The last successful fetch (%s) is no longer fresh." msgstr "" #: includes/class-first-screen.php:176 msgid "The feed has not been fetched recently." msgstr "" #: includes/class-first-screen.php:188 msgid "core, plugins and themes" msgstr "" #: includes/class-first-screen.php:189 msgid "core files only" msgstr "" #. translators: %s: the date daily monitoring was switched on #: includes/class-first-screen.php:211 #, php-format msgid "Daily monitoring was switched on %s and no scan has completed since." msgstr "" #: includes/class-first-screen.php:218 msgid "Daily monitoring is on, but its first scan has not completed yet." msgstr "" #: includes/class-first-screen.php:219 msgid "No integrity scan has run yet." msgstr "" #. translators: 1: the scan's number, 2: the date and time it ran, 3: what it covered, e.g. "core files only" #: includes/class-first-screen.php:241 #: includes/class-first-screen.php:274 #, php-format msgid "Scan #%1$d on %2$s, scope: %3$s." msgstr "" #: includes/class-first-screen.php:242 msgid "Daily monitoring is switched off, so this was a one-off scan." msgstr "" #. translators: %s: the date and time of the last scan #: includes/class-first-screen.php:249 #, php-format msgid "The last scan was on %s. Daily monitoring is switched off, so it has not been repeated." msgstr "" #. translators: 1: the date and time of the last completed scan, 2: how many days ago is too long #: includes/class-first-screen.php:259 #, php-format msgid "The last completed scan was on %1$s — more than %2$d day ago; the daily check may have failed or been skipped." msgid_plural "The last completed scan was on %1$s — more than %2$d days ago; the daily check may have failed or been skipped." msgstr[0] "" msgstr[1] "" #: includes/class-first-screen.php:307 msgid "Alerts are part of Pro." msgstr "" #: includes/class-first-screen.php:310 msgid "No alert channel is configured yet." msgstr "" #: includes/class-first-screen.php:314 msgid "A channel is configured, but no alert has fired yet." msgstr "" #. translators: 1: the reason the channel gave, as it gave it, 2: the date and time of the attempt #: includes/class-first-screen.php:323 #, php-format msgid "The last alert attempt failed: %1$s (%2$s)" msgstr "" #. translators: %s: the date and time of the attempt #: includes/class-first-screen.php:325 #, php-format msgid "The last alert attempt failed. (%s)" msgstr "" #. translators: %s: the date and time the last alert was sent #: includes/class-first-screen.php:329 #, php-format msgid "Last alert sent successfully on %s." msgstr "" #: includes/class-first-screen.php:335 msgid "Cloudflare sync is part of Pro." msgstr "" #: includes/class-first-screen.php:338 msgid "No zone or API token is saved yet." msgstr "" #: includes/class-first-screen.php:342 msgid "Configured, but the token has never been verified against Cloudflare." msgstr "" #. translators: 1: the reason Cloudflare gave, as it gave it, 2: the date and time of the check #: includes/class-first-screen.php:351 #, php-format msgid "Verification failed: %1$s (%2$s)" msgstr "" #. translators: %s: the date and time of the check #: includes/class-first-screen.php:353 #, php-format msgid "Verification failed. (%s)" msgstr "" #. translators: 1: the date and time of the check, 2: the Cloudflare zone's name #: includes/class-first-screen.php:362 #, php-format msgid "Verified on %1$s (zone \"%2$s\")." msgstr "" #. translators: %s: the date and time of the check #: includes/class-first-screen.php:364 #, php-format msgid "Verified on %s." msgstr "" #: includes/class-forge-docs-link.php:138 msgid "Read the docs" msgstr "" #: includes/class-forge-email.php:113 msgid "Avakode · AI-powered WordPress ecosystem" msgstr "" #: includes/class-forge-net.php:79 msgid "Refused to fetch a non-public URL." msgstr "" #: includes/class-forge-net.php:92 msgid "Refused to POST to a non-public URL." msgstr "" #: includes/class-forge-net.php:103 msgid "Refused to HEAD a non-public URL." msgstr "" #: includes/class-forge-support-link.php:53 #: includes/class-forge-support-link.php:54 msgid "Support" msgstr "" #: includes/class-hardening-score-badge.php:355 msgid "No route was found matching the URL and request method." msgstr "" #: includes/class-hardening-score.php:496 msgid "The site is served over HTTPS" msgstr "" #: includes/class-hardening-score.php:498 msgid "Yes." msgstr "" #: includes/class-hardening-score.php:498 msgid "No — this site answers on plain HTTP." msgstr "" #: includes/class-hardening-score.php:499 msgid "Without TLS every password and every session cookie crosses the network readable, so anyone on the same path can take the session and replay it." msgstr "" #: includes/class-hardening-score.php:502 msgid "Install a certificate with your host, then set the WordPress and site addresses to https." msgstr "" #: includes/class-hardening-score.php:510 msgid "Administrators using two-factor authentication" msgstr "" #. translators: %1$d is the number of enrolled administrators, %2$d the total. #: includes/class-hardening-score.php:515 #, php-format msgid "%1$d of %2$d administrators are enrolled." msgstr "" #: includes/class-hardening-score.php:519 msgid "This site has no administrator accounts." msgstr "" #: includes/class-hardening-score.php:520 msgid "A reused or phished administrator password is the shortest route to running code on the server; a second factor is what makes the password on its own worthless." msgstr "" #: includes/class-hardening-score.php:523 msgid "Enrol on the 2FA screen, and ask every other administrator to do the same." msgstr "" #: includes/class-hardening-score.php:531 msgid "WordPress has not checked for updates yet on this install." msgstr "" #: includes/class-hardening-score.php:534 msgid "WordPress core is behind." msgstr "" #. translators: %d is the number of plugins and themes with an update waiting. #: includes/class-hardening-score.php:539 #, php-format msgid "Core is current; %d plugin or theme updates are waiting." msgstr "" #: includes/class-hardening-score.php:544 msgid "Nothing is waiting to be updated." msgstr "" #: includes/class-hardening-score.php:549 msgid "Core, plugins and themes are up to date" msgstr "" #: includes/class-hardening-score.php:552 msgid "Almost every mass compromise of a WordPress site starts with a version whose vulnerability was published, and patched, weeks earlier." msgstr "" #: includes/class-hardening-score.php:555 msgid "Apply the waiting updates, then turn on automatic updates for anything you do not review by hand." msgstr "" #: includes/class-hardening-score.php:563 msgid "PHP errors are not printed to visitors" msgstr "" #: includes/class-hardening-score.php:566 msgid "WP_DEBUG and WP_DEBUG_DISPLAY are both on." msgstr "" #: includes/class-hardening-score.php:567 msgid "Errors are not displayed." msgstr "" #: includes/class-hardening-score.php:568 msgid "A displayed PHP error prints absolute paths, database names and fragments of your queries into the page for whoever triggered it." msgstr "" #: includes/class-hardening-score.php:573 msgid "Edit wp-config.php: set WP_DEBUG to false, or leave WP_DEBUG on and set WP_DEBUG_DISPLAY to false with WP_DEBUG_LOG on. No admin screen can change this." msgstr "" #: includes/class-hardening-score.php:579 msgid "XML-RPC is switched off" msgstr "" #: includes/class-hardening-score.php:581 #: includes/class-hardening-score.php:650 #: includes/class-hardening-score.php:859 #: includes/class-hardening-score.php:873 msgid "Off." msgstr "" #: includes/class-hardening-score.php:581 msgid "On — xmlrpc.php answers anonymous callers." msgstr "" #: includes/class-hardening-score.php:582 msgid "One xmlrpc.php request can try hundreds of passwords through system.multicall, and the same endpoint answers pingback.ping for reflection attacks against other people." msgstr "" #: includes/class-hardening-score.php:585 msgid "Turn on \"Disable XML-RPC\" under API & Protocols. Only turn it back on if you still publish from a desktop or mobile client that needs it." msgstr "" #: includes/class-hardening-score.php:591 msgid "Off — failed logins are never counted." msgstr "" #. translators: %d is the configured number of failed attempts before lockout. #: includes/class-hardening-score.php:596 #, php-format msgid "On, locking out after %d failed attempts." msgstr "" #. translators: %d is the configured number of failed attempts before lockout. #: includes/class-hardening-score.php:603 #, php-format msgid "On, but %d attempts is a generous budget for a guessing script." msgstr "" #. translators: %d is the configured number of failed attempts before lockout. #: includes/class-hardening-score.php:610 #, php-format msgid "On, but a threshold of %d will never trip in practice." msgstr "" #: includes/class-hardening-score.php:617 msgid "Brute-force protection locks out guessers" msgstr "" #: includes/class-hardening-score.php:620 msgid "Password spraying only stops when the attempts stop. A threshold set so high that it never trips is a log, not a defence." msgstr "" #: includes/class-hardening-score.php:623 msgid "Turn on brute-force protection and set the maximum attempts to ten or fewer." msgstr "" #: includes/class-hardening-score.php:627 msgid "Staging mode is on, so this copy writes the lockout down and lets the request through. The setting is right; nothing is being blocked here." msgstr "" #: includes/class-hardening-score.php:634 msgid "The built-in theme and plugin editor is off" msgstr "" #: includes/class-hardening-score.php:637 msgid "DISALLOW_FILE_EDIT is in force." msgstr "" #: includes/class-hardening-score.php:638 msgid "The editor is reachable — DISALLOW_FILE_EDIT is not in force on this request." msgstr "" #: includes/class-hardening-score.php:639 msgid "The theme editor turns one hijacked administrator session into arbitrary PHP on your server, with no upload and no file access needed." msgstr "" #: includes/class-hardening-score.php:642 msgid "Turn on \"Disable theme/plugin file editor\". If it is already on, something in wp-config.php defines DISALLOW_FILE_EDIT as false and wins — fix it there." msgstr "" #: includes/class-hardening-score.php:652 msgid "On, but no baseline has ever been taken — there is nothing to compare against." msgstr "" #. translators: %d is the number of files found that wordpress.org does not list. #: includes/class-hardening-score.php:656 #, php-format msgid "The last scan found %d file that is not in the official build." msgid_plural "The last scan found %d files that are not in the official build." msgstr[0] "" msgstr[1] "" #: includes/class-hardening-score.php:665 msgid "A baseline exists, but the last scan is more than a week old." msgstr "" #: includes/class-hardening-score.php:667 msgid "A baseline exists and the last scan is recent." msgstr "" #: includes/class-hardening-score.php:672 msgid "File integrity has a fresh baseline" msgstr "" #: includes/class-hardening-score.php:679 msgid "A backdoor written into a core or plugin file looks like nothing at all from the dashboard; only a hash taken before it arrived can tell you it is there." msgstr "" #: includes/class-hardening-score.php:683 msgid "Open the File integrity screen and look at what was found. A PHP file wordpress.org does not list, sitting in wp-admin or wp-includes, is not something a WordPress update leaves behind." msgstr "" #: includes/class-hardening-score.php:684 msgid "Run a scan on the File integrity screen to create the baseline, and check that the daily cron is firing." msgstr "" #: includes/class-hardening-score.php:696 msgid "No account is called \"admin\"" msgstr "" #: includes/class-hardening-score.php:699 msgid "An account with the login \"admin\" exists." msgstr "" #: includes/class-hardening-score.php:700 msgid "No account uses that login." msgstr "" #: includes/class-hardening-score.php:701 msgid "An account literally named admin hands over half of every credential pair before the guessing starts." msgstr "" #: includes/class-hardening-score.php:704 msgid "Create a new administrator with a different login, move the content to it, and delete the old one." msgstr "" #: includes/class-hardening-score.php:710 msgid "Login names are not published" msgstr "" #: includes/class-hardening-score.php:712 #: includes/class-hardening-score.php:885 msgid "Blocked." msgstr "" #: includes/class-hardening-score.php:712 msgid "Anyone can list your login names." msgstr "" #: includes/class-hardening-score.php:713 msgid "The ?author=1 redirect and the REST users route hand out real login names, which turns password guessing from two unknowns into one." msgstr "" #: includes/class-hardening-score.php:716 msgid "Turn on \"Block user enumeration\" under Hardening." msgstr "" #: includes/class-hardening-score.php:740 msgid "The REST API answers anonymous callers on every namespace." msgstr "" #: includes/class-hardening-score.php:743 msgid "Restricted, but the allowlist lets wp/v2 back in — which is the part that was being restricted." msgstr "" #: includes/class-hardening-score.php:746 msgid "Anonymous REST access is limited to the allowlisted namespaces." msgstr "" #: includes/class-hardening-score.php:751 msgid "The REST API is restricted to signed-in callers" msgstr "" #: includes/class-hardening-score.php:754 msgid "An open REST API publishes users, posts, media and some settings to anonymous callers, and an allowlist entry that re-admits wp/v2 undoes the whole restriction while the checkbox still reads as on." msgstr "" #: includes/class-hardening-score.php:757 msgid "Turn on the REST restriction and remove any allowlist line that matches wp/v2." msgstr "" #: includes/class-hardening-score.php:763 msgid "Security response headers are sent" msgstr "" #: includes/class-hardening-score.php:765 msgid "Sent." msgstr "" #: includes/class-hardening-score.php:765 msgid "Not sent." msgstr "" #: includes/class-hardening-score.php:766 msgid "Without them the browser will sniff content types, render your pages inside somebody else's frame, and leak the full URL of every page as a referrer." msgstr "" #: includes/class-hardening-score.php:769 msgid "Turn on \"Send security HTTP headers\" under Hardening." msgstr "" #: includes/class-hardening-score.php:774 msgid "No Content-Security-Policy header is sent." msgstr "" #: includes/class-hardening-score.php:777 msgid "Sent in report-only mode, which records violations and blocks nothing." msgstr "" #: includes/class-hardening-score.php:780 msgid "Sent and enforcing." msgstr "" #: includes/class-hardening-score.php:785 msgid "A Content-Security-Policy is enforced" msgstr "" #: includes/class-hardening-score.php:788 msgid "A policy is the last line that stops an injected script from running at all. Report-only is the correct place to start and it is worth half — it watches, and it blocks nothing." msgstr "" #: includes/class-hardening-score.php:791 msgid "Run report-only until the reports are quiet, then turn report-only off so the policy actually blocks." msgstr "" #: includes/class-hardening-score.php:799 msgid "Sensitive files are not directly readable" msgstr "" #: includes/class-hardening-score.php:802 #: includes/class-hardening-score.php:844 msgid "This server does not read .htaccess, so GuardForge cannot answer for it here." msgstr "" #: includes/class-hardening-score.php:804 msgid "The deny rules are present in .htaccess." msgstr "" #: includes/class-hardening-score.php:805 msgid "The deny rules are not in .htaccess." msgstr "" #: includes/class-hardening-score.php:806 msgid "A readable wp-config.php or a forgotten debug.log hands over database credentials, salts and query fragments without needing a single exploit." msgstr "" #: includes/class-hardening-score.php:809 msgid "Turn on \"Protect sensitive files\" and make sure .htaccess is writable so the rules can be written." msgstr "" #: includes/class-hardening-score.php:815 msgid "Administrator actions are recorded" msgstr "" #: includes/class-hardening-score.php:817 msgid "Recorded." msgstr "" #: includes/class-hardening-score.php:817 msgid "Not recorded." msgstr "" #: includes/class-hardening-score.php:818 msgid "Without a trail you cannot say which account changed what or when, so an incident ends in guesswork instead of a timeline." msgstr "" #: includes/class-hardening-score.php:821 msgid "Turn on \"Log admin actions\" under Action audit." msgstr "" #: includes/class-hardening-score.php:829 msgid "The WordPress version is not advertised" msgstr "" #: includes/class-hardening-score.php:831 msgid "Hidden." msgstr "" #: includes/class-hardening-score.php:831 msgid "Published in the generator tag and asset URLs." msgstr "" #: includes/class-hardening-score.php:832 msgid "A version in the generator tag turns a scan into a lookup: read it once, and you know which exploits are worth trying." msgstr "" #: includes/class-hardening-score.php:835 msgid "Turn on \"Hide WordPress version\" under Hardening." msgstr "" #: includes/class-hardening-score.php:841 msgid "Directories do not list their contents" msgstr "" #: includes/class-hardening-score.php:846 msgid "Options -Indexes is in place." msgstr "" #: includes/class-hardening-score.php:847 msgid "Options -Indexes is not in place." msgstr "" #: includes/class-hardening-score.php:848 msgid "An open directory index lists the backups, exports and stray archives that nobody ever linked to and everybody forgets about." msgstr "" #: includes/class-hardening-score.php:851 msgid "Turn on \"Disable directory listing\" under Files & Directories." msgstr "" #: includes/class-hardening-score.php:857 msgid "The login form asks a question a script cannot answer" msgstr "" #: includes/class-hardening-score.php:859 #: includes/class-hardening-score.php:873 msgid "On." msgstr "" #: includes/class-hardening-score.php:860 msgid "A trivial arithmetic challenge costs a person two seconds and stops the cheapest credential-stuffing bots outright." msgstr "" #: includes/class-hardening-score.php:863 msgid "Turn on \"Math captcha on login\" under Hardening." msgstr "" #: includes/class-hardening-score.php:871 msgid "Pingbacks are switched off" msgstr "" #: includes/class-hardening-score.php:874 msgid "Pingbacks let your site be pointed at somebody else's as a reflector in a denial-of-service, and they advertise that with an X-Pingback header." msgstr "" #: includes/class-hardening-score.php:877 msgid "Turn on \"Disable self-pingbacks\" under API & Protocols." msgstr "" #: includes/class-hardening-score.php:883 msgid "Known scanner User-Agents are blocked" msgstr "" #: includes/class-hardening-score.php:885 msgid "Not blocked." msgstr "" #: includes/class-hardening-score.php:886 msgid "Blocking the default signatures of sqlmap, nikto and wpscan removes the noisy, automated half of hostile traffic before it reaches PHP at all." msgstr "" #: includes/class-hardening-score.php:889 msgid "Turn on \"Block malicious bot User-Agents\" under Spam & Bots." msgstr "" #: includes/class-hardening-score.php:893 msgid "Nothing is set to send an alert, so nothing will be sent." msgstr "" #: includes/class-hardening-score.php:895 msgid "Alerts are switched on, but there is no address for them to reach." msgstr "" #: includes/class-hardening-score.php:897 msgid "Alerts are switched on and an address resolves." msgstr "" #: includes/class-hardening-score.php:902 msgid "Someone is told when something happens" msgstr "" #: includes/class-hardening-score.php:905 msgid "A lockout or an integrity change that nobody is told about is a detection that arrives whenever somebody next happens to open the dashboard." msgstr "" #: includes/class-hardening-score.php:908 msgid "Switch on the lockout, integrity and new-administrator alerts, and set the address they should reach." msgstr "" #: includes/class-hardening-score.php:912 msgid "Staging mode is on, so this copy holds every one of these e-mails back. The setting is right; nothing is being sent from here." msgstr "" #: includes/class-hardening.php:88 msgid "XML-RPC is disabled on this site." msgstr "" #: includes/class-hardening.php:114 msgid "REST API is restricted to authenticated users." msgstr "" #: includes/class-hardening.php:163 msgid "Comments via REST are disabled." msgstr "" #. translators: %1$d and %2$d are random single-digit operands. #: includes/class-hardening.php:293 #, php-format msgid "Verification: %1$d + %2$d = ?" msgstr "" #: includes/class-hardening.php:317 msgid "Error: please answer the verification question." msgstr "" #: includes/class-hardening.php:328 msgid "Error: verification expired, please try again." msgstr "" #: includes/class-hardening.php:331 msgid "Error: the verification answer was wrong." msgstr "" #: includes/class-integrity.php:913 msgid "GuardForge — file integrity alert" msgstr "" #: includes/class-integrity.php:917 msgid "" "Modified files:\n" "" msgstr "" #: includes/class-integrity.php:920 msgid "" "Removed files:\n" "" msgstr "" #. translators: %s is the date/time of the scan. #: includes/class-integrity.php:923 #, php-format msgid "Time: %s" msgstr "" #: includes/class-results-provider.php:116 msgid "the case model is not available on this site" msgstr "" #: includes/class-results-provider.php:167 msgid "GuardForge has not built its cases yet — the daily check has not run on this site." msgstr "" #. translators: 1: how many of the checks reported, 2: how many checks there are. #: includes/class-results-provider.php:178 #, php-format msgid "No case is open, and none was closed in the last 30 days (%1$d of %2$d checks reported in that time)." msgstr "" #. translators: %s: file path that changed. #: includes/class-results-provider.php:274 #, php-format msgid "File changed: %s" msgstr "" #: includes/class-results-provider.php:275 msgid "A file changed" msgstr "" #. translators: %s: the plugin or theme a published advisory matches. #: includes/class-results-provider.php:279 #, php-format msgid "Known vulnerability: %s" msgstr "" #: includes/class-results-provider.php:280 msgid "A known vulnerability matches this site" msgstr "" #. translators: %s: the source of the login attempts (an address or a user name). #: includes/class-results-provider.php:284 #, php-format msgid "Login attempts: %s" msgstr "" #: includes/class-results-provider.php:285 msgid "A series of login attempts" msgstr "" #: includes/class-results-provider.php:287 msgid "Case" msgstr "" #: includes/class-results-provider.php:293 msgid "A recheck could not confirm this either way — decide on the evidence." msgstr "" #: includes/class-results-provider.php:297 msgid "Compare the file with the published package, then record the change as expected or restore it." msgstr "" #: includes/class-results-provider.php:299 msgid "Update the affected plugin or theme, or record why this site is not exposed." msgstr "" #: includes/class-results-provider.php:301 msgid "Review the attempts and block the address, or record why this traffic is expected." msgstr "" #: includes/class-results-provider.php:303 msgid "Open the case and decide what to do with it." msgstr "" #: includes/class-spam-bots.php:66 msgid "Leave this field empty" msgstr "" #: includes/class-spam-bots.php:80 msgid "Comment rejected by spam protection." msgstr "" #: includes/class-spam-bots.php:81 msgid "Spam protection" msgstr "" #: includes/class-staging.php:489 msgid "GUARDFORGE_STAGING_MODE is set to true in wp-config.php." msgstr "" #: includes/class-staging.php:491 msgid "GUARDFORGE_STAGING_MODE is set to false in wp-config.php, which pins this site to production." msgstr "" #. translators: %s is the WordPress environment type, e.g. "staging" or "local". #: includes/class-staging.php:494 #, php-format msgid "WordPress reports this environment as \"%s\"." msgstr "" #. translators: %s is the host-name entry that matched, e.g. "staging.example.com". #: includes/class-staging.php:497 #, php-format msgid "This site answers to %s, which is on your list of staging host names." msgstr "" #: includes/class-staging.php:499 msgid "Something here looks like a copy, but \"Always treat this site as production\" is switched on." msgstr "" #: includes/class-staging.php:501 msgid "Something here looks like a copy, but code on this site cancelled staging mode." msgstr "" #: includes/class-staging.php:503 msgid "Nothing about this site suggests it is a copy, so every protection is enforced normally." msgstr "" #: includes/class-staging.php:534 msgid "GuardForge is in staging mode." msgstr "" #: includes/class-staging.php:539 msgid "Lockouts are recorded but not enforced, and no e-mail leaves this site." msgstr "" #: includes/class-staging.php:542 msgid "No alert leaves it either." msgstr "" #: includes/class-staging.php:546 msgid "No firewall rule is written to your zone." msgstr "" #: includes/class-staging.php:564 msgid "Review staging mode" msgstr "" #: includes/class-staging.php:589 msgid "GuardForge: staging mode" msgstr "" #: includes/class-staging.php:624 msgid "GuardForge staging mode: this address is over the failed-login threshold and would have been locked out on production." msgstr "" #: includes/class-two-factor.php:223 msgid "Error: two-factor code is invalid." msgstr "" #: includes/class-two-factor.php:253 msgid "Two-factor verification" msgstr "" #: includes/class-two-factor.php:259 msgid "Authentication code" msgstr "" #: includes/class-two-factor.php:265 msgid "Verify" msgstr "" #: includes/class-two-factor.php:267 msgid "Open your authenticator app or use a recovery code." msgstr ""