mediawiki-extensions-AbuseF.../i18n/en.json

617 lines
48 KiB
JSON
Raw Normal View History

{
"@metadata": {
"authors": [
"Andrew Garrett",
"Kunal Mehta"
]
},
"abusefilter-desc": "Applies automatic heuristics to edits",
"abusefilter": "Abuse filter management",
"abuselog": "Abuse filter log",
"abusefilter-intro": "Welcome to the Abuse Filter management interface.\nThe Abuse Filter is an automated software mechanism of applying automatic heuristics to all actions.\nThis interface shows a list of defined filters, and allows them to be modified.",
"abusefilter-mustviewprivateoredit": "For security reasons, only users with the right to view private abuse filters or modify filters may use this interface.",
"abusefilter-warning": "'''Warning:''' This action has been automatically identified as harmful.\nUnconstructive actions will be quickly reverted,\nand egregious or repeated unconstructive editing will result in your account or IP address being blocked.\nIf you believe this action to be constructive, you may submit it again to confirm it.\nA brief description of the abuse rule which your action matched is: $1",
"abusefilter-disallowed": "This action has been automatically identified as harmful, and therefore disallowed.\nIf you believe your action was constructive, please inform an administrator of what you were trying to do.\nA brief description of the abuse rule which your action matched is: $1",
"abusefilter-blocked-display": "This action has been automatically identified as harmful,\nand you have been prevented from executing it.\nIn addition, to protect {{SITENAME}}, your user account and all associated IP addresses have been blocked from editing.\nIf this has occurred in error, please contact an administrator.\nA brief description of the abuse rule which your action matched is: $1",
"abusefilter-degrouped": "This action has been automatically identified as harmful.\nConsequently, it has been disallowed, and, since your account is suspected of being compromised, all rights have been revoked.\nIf you believe this to have been in error, please contact a bureaucrat with an explanation of this action, and your rights may be restored.\nA brief description of the abuse rule which your action matched is: $1",
"abusefilter-autopromote-blocked": "This action has been automatically identified as harmful, and it has been disallowed.\nIn addition, as a security measure, some privileges routinely granted to established accounts have been temporarily revoked from your account.\nA brief description of the abuse rule which your action matched is: $1",
"abusefilter-blocker": "Abuse filter",
"abusefilter-blockreason": "Automatically blocked by abuse filter.\nDescription of matched rule: $1",
"abusefilter-degroupreason": "Rights automatically stripped by abuse filter.\nRule description: $1",
"abusefilter-blockautopromotereason": "Autopromotion automatically delayed by abuse filter.\nRule description: $1",
"abusefilter-accountreserved": "This account name is reserved for use by the abuse filter.",
"right-abusefilter-modify": "Create or modify abuse filters",
"right-abusefilter-view": "View abuse filters",
"right-abusefilter-log": "View the abuse log",
"right-abusefilter-log-detail": "View detailed abuse log entries",
"right-abusefilter-privatedetails": "View private data in the abuse log",
"right-abusefilter-privatedetails-log": "View the AbuseFilter private details access log",
"right-abusefilter-modify-restricted": "Modify abuse filters with restricted actions",
"right-abusefilter-revert": "Revert all changes by a given abuse filter",
"right-abusefilter-view-private": "View abuse filters marked as private",
"right-abusefilter-log-private": "View log entries of abuse filters marked as private",
"right-abusefilter-hide-log": "Hide entries in the abuse log",
"right-abusefilter-hidden-log": "View hidden abuse log entries",
"right-abusefilter-modify-global": "Create or modify global abuse filters",
"action-abusefilter-modify": "modify abuse filters",
"action-abusefilter-view": "view abuse filters",
"action-abusefilter-log": "view the abuse log",
"action-abusefilter-log-detail": "view detailed abuse log entries",
"action-abusefilter-privatedetails": "view private data in the abuse log",
"action-abusefilter-privatedetails-log": "view the AbuseFilter private details access log",
"action-abusefilter-modify-restricted": "modify abuse filters with restricted actions",
"action-abusefilter-revert": "revert all changes by a given abuse filter",
"action-abusefilter-view-private": "view abuse filters marked as private",
"action-abusefilter-log-private": "view logs of abuse filters marked as private",
"action-abusefilter-hide-log": "hide entries in the abuse log",
"action-abusefilter-hidden-log": "view hidden abuse log entries",
"action-abusefilter-modify-global": "create or modify global abuse filters",
"abusefilter-log-summary": "This log shows a list of all actions caught by the filters.",
"abusefilter-log-search": "Search the abuse log",
"abusefilter-log-search-user": "User:",
"abusefilter-log-search-group": "Filter group:",
"abusefilter-log-search-group-any": "Any",
"abusefilter-log-search-filter": "Filter IDs:",
"abusefilter-log-search-filter-help": "Separate with pipes, prefix with \"$1\" for global filters",
"abusefilter-log-search-filter-help-central": "Separate with pipes",
"abusefilter-log-search-title": "Title:",
"abusefilter-log-search-wiki": "Wiki:",
"abusefilter-log-search-impact": "Impact:",
"abusefilter-log-search-impact-all": "All actions",
"abusefilter-log-search-impact-saved": "Saved changes only",
"abusefilter-log-search-impact-not-saved": "Without saved changes",
"abusefilter-log-search-entries-label": "Visibility:",
"abusefilter-log-search-entries-all": "All entries",
"abusefilter-log-search-entries-hidden": "Hidden entries only",
"abusefilter-log-search-entries-visible": "Visible entries only",
"abusefilter-log-search-action-label": "Triggering action:",
"abusefilter-log-search-action-other": "Other",
"abusefilter-log-search-action-any": "Any",
"abusefilter-log-search-action-taken-label": "Action taken:",
"abusefilter-log-search-action-taken-any": "Any",
"abusefilter-log-search-submit": "Search",
"abusefilter-log-entry": "$1: $2 {{GENDER:$8|triggered}} an abuse filter, {{GENDER:$8|performing}} the action \"$3\" on $4.\nActions taken: $5;\nFilter description: $6",
"abusefilter-log-entry-withdiff": "$1: $2 {{GENDER:$8|triggered}} an abuse filter, {{GENDER:$8|performing}} the action \"$3\" on $4.\nActions taken: $5;\nFilter description: $6 ($7)",
"abusefilter-log-detailedentry-meta": "$1: $2 {{GENDER:$9|triggered}} $3, {{GENDER:$9|performing}} the action \"$4\" on $5.\nActions taken: $6;\nFilter description: $7 ($8)",
"abusefilter-log-detailedentry-global": "global filter $1",
"abusefilter-log-detailedentry-local": "filter $1",
"abusefilter-log-detailslink": "details",
"abusefilter-log-diff": "diff",
"abusefilter-log-hidelink": "adjust visibility",
"abusefilter-log-hide-entries": "Change visibility of selected entries",
"abusefilter-log-description-not-available": "not available",
"abusefilter-log-details-legend": "Details for log entry $1",
"abusefilter-log-details-var": "Variable",
"abusefilter-log-details-val": "Value",
"abusefilter-log-details-vars": "Action parameters",
"abusefilter-log-details-privatedetails": "Private log details",
"abusefilter-log-details-ip": "Originating IP address",
"abusefilter-log-details-checkuser": "Check user",
"abusefilter-log-noactions": "none",
"abusefilter-log-noactions-filter": "None",
"abusefilter-log-details-diff": "Changes made in edit",
"abusefilter-log-linkoncontribs": "abuse log",
"abusefilter-log-linkoncontribs-text": "Abuse log for {{GENDER:$1|this user}}",
"abusefilter-log-linkonhistory": "view abuse log",
"abusefilter-log-linkonhistory-text": "View abuse log for this page",
"abusefilter-log-linkonundelete": "view abuse log",
"abusefilter-log-linkonundelete-text": "View abuse log for this page",
"abusefilter-log-hidden-implicit": "(hidden because revision has been deleted)",
"abusefilter-log-cannot-see-details": "You do not have permission to see details of this entry.",
"abusefilter-log-cannot-see-privatedetails": "You do not have permission to see private details of this entry.",
"abusefilter-log-nonexistent": "An entry with the provided ID does not exist.",
"abusefilter-log-details-hidden": "You cannot view the details for this entry because it is hidden from public view.",
"abusefilter-log-details-hidden-implicit": "You cannot view the details for this entry because its associated revision is hidden from public view.",
"abusefilter-log-private-not-included": "One or more of the filter IDs you specified are private. Because you are not allowed to view details of private filters, these filters have not been searched for.",
"abusefilter-log-hide-no-selected": "No entries selected",
"abusefilter-log-hide-selected": "{{PLURAL:$1|Selected AbuseLog entry|Selected AbuseLog entries}}:",
"abusefilter-log-hide-legend": "Change visibility",
"abusefilter-log-hide-set-visibility": "Set visibility for the selected entries:",
"abusefilter-log-hide-reason": "Reason:",
"abusefilter-log-hide-reason-other": "Other/additional reason:",
"abusefilter-log-hide-forbidden": "You do not have permission to hide abuse log entries.",
"abusefilter-log-hide-show": "Show",
"abusefilter-log-hide-hide": "Hide",
"abusefilter-log-hide-no-change": "All of the selected IDs already have the desired visibility.",
"abusefilter-log-hide-done": "Visibility updated: $1 {{PLURAL:$1|entry|entries}} $2.",
"abusefilter-log-hide-done-hide": "{{PLURAL:$1|hidden}}",
"abusefilter-log-hide-done-show": "{{PLURAL:$1|unhidden}}",
"abusefilter-log-entry-suppress": "$1 {{GENDER:$2|hid}} $3",
"abusefilter-log-entry-unsuppress": "$1 {{GENDER:$2|unhid}} $3",
"logentry-abusefilter-hit": "$1 {{GENDER:$2|triggered}} $4, {{GENDER:$2|performing}} the action \"$5\" on $3. Actions taken: $6 ($7)",
"log-action-filter-abusefilter": "Type of filter change:",
"log-action-filter-abusefilter-create": "New filter creation",
"log-action-filter-abusefilter-modify": "Filter modification",
"log-action-filter-suppress-abuselog": "Abuse log suppression",
"log-action-filter-rights-blockautopromote": "Autopromote block",
"log-action-filter-rights-restoreautopromote": "Autopromote restore",
"logentry-abusefilterprivatedetails-access": "$1 {{GENDER:$2|accessed}} private details for $3",
"logentry-rights-blockautopromote": "$1 {{GENDER:$2|blocked}} the autopromotion of {{GENDER:$4|$3}} for a period of $5",
"logentry-rights-restoreautopromote": "$1 {{GENDER:$2|restored}} the autopromotion capability of {{GENDER:$4|$3}}",
"logentry-abusefilterblockeddomainhit-hit": "{{GENDER:$2|$1}} caused a blocked domain hit on $3 by attempting to add $4",
"abusefilterprivatedetails-log-name": "AbuseFilter private details access log",
"log-name-abusefilterblockeddomainhit": "Blocked domains hit log",
"abusefilter-list": "All filters",
"abusefilter-list-id": "Filter ID",
"abusefilter-list-pattern": "Pattern",
"abusefilter-list-status": "Status",
"abusefilter-list-public": "Public description",
"abusefilter-list-consequences": "Consequences",
"abusefilter-list-visibility": "Visibility",
"abusefilter-list-hitcount": "Hit count",
"abusefilter-list-limit": "Number per page:",
"abusefilter-list-lastmodified": "Last modified",
"abusefilter-list-group": "Filter group",
"abusefilter-hidden": "Private",
"abusefilter-unhidden": "Public",
"abusefilter-enabled": "Enabled",
"abusefilter-deleted": "Deleted",
"abusefilter-disabled": "Disabled",
"abusefilter-throttled": "High rate of matches",
"abusefilter-hitcount": "$1 {{PLURAL:$1|hit|hits}}",
"abusefilter-new": "Create a new filter",
"abusefilter-import-button": "Import filter",
"abusefilter-return": "Return to filter management",
"abusefilter-status-global": "Global",
"abusefilter-list-options": "Search options",
"abusefilter-list-options-deleted": "Deleted filters:",
"abusefilter-list-options-deleted-only": "Show only deleted filters",
"abusefilter-list-options-deleted-hide": "Hide deleted filters",
"abusefilter-list-options-deleted-show": "Include deleted filters",
"abusefilter-list-options-scope": "Show filters:",
"abusefilter-list-options-scope-local": "Local rules only",
"abusefilter-list-options-scope-global": "Global rules only",
"abusefilter-list-options-scope-all": "Local and global rules",
"abusefilter-list-options-further-options": "Further options:",
"abusefilter-list-options-hidedisabled": "Hide disabled filters",
"abusefilter-list-options-hideprivate": "Hide private filters",
"abusefilter-list-options-searchfield": "Search within rules:",
"abusefilter-list-options-searchpattern": "Insert a pattern",
"abusefilter-list-options-searchoptions": "Search mode:",
"abusefilter-list-options-search-like": "Plain query",
"abusefilter-list-options-search-rlike": "Regular expression",
"abusefilter-list-options-search-irlike": "Case-insensitive regular expression",
"abusefilter-list-invalid-searchmode": "The specified search mode is not valid.",
"abusefilter-list-regexerror": "An error has occurred while searching: Regular expression syntax error.",
"abusefilter-list-options-submit": "Update",
"abusefilter-tools-text": "Here are some tools which may be useful in formulating and debugging abuse filters.",
"abusefilter-tools-expr": "Expression tester",
"abusefilter-tools-submitexpr": "Evaluate",
"abusefilter-tools-syntax-error": "The filter has invalid syntax.",
"abusefilter-tools-reautoconfirm": "Restore autoconfirmed status",
"abusefilter-tools-reautoconfirm-user": "User:",
"abusefilter-tools-reautoconfirm-submit": "Re-autoconfirm",
"abusefilter-tools-restoreautopromote": "Autopromotion restored via AbuseFilter tools.",
"abusefilter-reautoconfirm-none": "That user has not had {{GENDER:$1|his|her|their}} autoconfirmed status suspended.",
"abusefilter-reautoconfirm-notallowed": "You are not allowed to restore autoconfirmed status.",
"abusefilter-reautoconfirm-done": "Account's autoconfirmed status has been restored",
"abusefilter-status": "Of the last $1 {{PLURAL:$1|action|actions}}, $2 ($3%) {{PLURAL:$2|has|have}} reached the condition limit of $4, and $5 ($6%) {{PLURAL:$5|has|have}} matched at least one of the filters currently enabled.",
"abusefilter-add": "Adding abuse filter",
"abusefilter-edit": "Editing abuse filter",
"abusefilter-edit-specific": "Editing abuse filter $1: $2",
"abusefilter-view-specific": "Viewing abuse filter $1: $2",
"abusefilter-edit-subtitle": "Editing filter $1",
"abusefilter-edit-subtitle-new": "Creating filter",
"abusefilter-edit-token-not-match": "The edit wasn't saved! Please save again.",
"abusefilter-edit-oldwarning": "<strong>You are editing an old version of this filter.\nThe statistics quoted are for the most recent version of the filter.\nIf you save your changes, you will overwrite all changes since the revision you are editing.</strong> &bull;\n[[Special:AbuseFilter/history/$2|Return to this filter's history]].",
"abusefilter-edit-oldwarning-view": "<strong>You are viewing an old version of this filter.\nThe statistics quoted are for the most recent version of the filter.</strong> &bull;\n[[Special:AbuseFilter/history/$2|Return to this filter's history]].",
"abusefilter-edit-status-label": "Statistics:",
"abusefilter-edit-status": "Of the last $1 {{PLURAL:$1|action|actions}}, this filter has matched $2 ($3%).\nOn average, its run time is $4 ms, and it consumes $5 {{PLURAL:$5|condition|conditions}} of the condition limit.",
"abusefilter-edit-throttled-warning": "'''Warning:''' This filter was automatically flagged as harmful. As a safety measure, the following {{PLURAL:$2|action|actions}} will not execute: $1. Please check whether the high rate of matches is expected. If so, you can save the filter again to remove this restriction.",
"abusefilter-edit-throttled-warning-no-actions": "'''Warning:''' This filter was automatically flagged as harmful. No actions were automatically disabled, but please check whether the high rate of matches is expected. If so, you can ignore this warning.",
"abusefilter-edit-new": "New filter",
"abusefilter-edit-save": "Save filter",
"abusefilter-edit-id": "Filter ID:",
"abusefilter-edit-switch-editor": "Switch editor",
"abusefilter-edit-description": "Description:\n:''(publicly viewable)''",
"abusefilter-edit-field-description": "description",
"abusefilter-edit-group": "Filter group:",
"abusefilter-edit-flags": "Flags:",
"abusefilter-edit-enabled": "Enable this filter",
"abusefilter-edit-deleted": "Mark as deleted",
"abusefilter-edit-hidden": "Hide details of this filter from public view",
"abusefilter-edit-global": "Global filter",
"abusefilter-edit-rules": "Conditions:",
"abusefilter-edit-field-conditions": "conditions",
"abusefilter-edit-notes": "Notes:",
"abusefilter-edit-lastmod": "Filter last modified:",
"abusefilter-edit-lastmod-text": "$1 by $2",
"abusefilter-edit-hitcount": "Filter hits:",
"abusefilter-edit-consequences": "Actions to take when matched",
"abusefilter-edit-action-warn": "Trigger these actions after giving the user a warning",
"abusefilter-edit-action-disallow": "Prevent the user from performing the action in question",
"abusefilter-edit-action-blockautopromote": "Revoke the user's autoconfirmed status",
"abusefilter-edit-action-degroup": "Remove the user from all privileged groups",
"abusefilter-edit-action-block": "Block the user and/or IP address from editing",
"abusefilter-edit-action-blocktalk": "Block the user and/or IP address from editing their own talk page",
"abusefilter-edit-action-throttle": "Trigger actions only if the user trips a rate limit",
"abusefilter-edit-action-rangeblock": "Block the respective IP range from which the user originates",
"abusefilter-edit-action-tag": "Tag the edit for further review",
"abusefilter-edit-throttle-count": "Number of actions to allow:",
"abusefilter-edit-throttle-period": "Period of time (in seconds):",
"abusefilter-edit-throttle-groups": "Group throttle by:",
"abusefilter-edit-throttle-groups-help": "See $1.",
"abusefilter-edit-throttle-groups-help-text": "the documentation on mediawiki.org",
"abusefilter-edit-throttle-hidden-placeholder": "Split with commas to join with AND, and with linebreaks to join with OR",
"abusefilter-edit-throttle-placeholder": "Split with commas to join with AND, and insert one by one to join with OR",
"abusefilter-throttle-ip": "IP address",
"abusefilter-throttle-user": "user account",
"abusefilter-throttle-range": "IP range",
"abusefilter-throttle-creationdate": "account creation date",
"abusefilter-throttle-editcount": "edit count",
"abusefilter-throttle-site": "whole site",
"abusefilter-throttle-page": "page",
"abusefilter-throttle-none": "(none)",
"abusefilter-throttle-details": "Allow $1 {{PLURAL:$1|action|actions}} every $2 {{PLURAL:$2|second|seconds}}, group throttle by: $3",
"abusefilter-edit-warn-message": "System message to use for warning:",
"abusefilter-edit-warn-other": "Other message",
"abusefilter-edit-warn-other-label": "Page name of other message:\n:''(without \"MediaWiki:\" prefix)''",
"abusefilter-edit-warn-actions": "Actions:",
"abusefilter-edit-warn-preview": "Show/Hide preview of selected message",
"abusefilter-edit-warn-edit": "Create/Edit selected message",
"abusefilter-edit-disallow-message": "System message to use for disallowing:",
"abusefilter-edit-disallow-other": "Other message",
"abusefilter-edit-disallow-other-label": "Page name of other message:\n:''(without \"MediaWiki:\" prefix)''",
"abusefilter-edit-disallow-actions": "Actions:",
"abusefilter-edit-disallow-preview": "Show/Hide preview of selected message",
"abusefilter-edit-disallow-edit": "Create/Edit selected message",
"abusefilter-edit-tag-tag": "[[Special:Tags|Tags]] to apply:",
"abusefilter-edit-tag-placeholder": "Add tags (one by one or comma-separated)",
"abusefilter-edit-tag-hidden-placeholder": "Add tags (comma-separated)",
"abusefilter-edit-block-anon-durations": "Block duration for non-registered users:",
"abusefilter-edit-block-user-durations": "Block duration for registered users:",
"abusefilter-block-anon": "Block anonymous users",
"abusefilter-block-user": "block registered users",
"abusefilter-block-talk": "talk page blocked",
"abusefilter-edit-denied": "You may not view details of this filter, because it is hidden from public view.",
"abusefilter-edit-main": "Filter parameters",
"abusefilter-edit-done-subtitle": "Filter edited",
"abusefilter-edit-done": "[[Special:AbuseFilter/history/$1/diff/prev/$2|Your changes]] to [[Special:AbuseFilter/$1|filter $3]] have been saved.",
"abusefilter-edit-badsyntax": "There is a syntax error in the filter you specified.\nThe output from the parser was: <pre>$1</pre>",
"abusefilter-edit-missingfields": "The following fields are required and must be filled: $1",
"abusefilter-edit-deleting-enabled": "You cannot mark an active filter as deleted.",
"abusefilter-edit-restricted": "You cannot edit this filter, because it contains one or more restricted actions.\nPlease ask a user with permission to add restricted actions to make the change for you.",
"abusefilter-edit-viewhistory": "View this filter's history",
"abusefilter-edit-history": "History:",
"abusefilter-edit-check": "Check syntax",
"abusefilter-edit-badfilter": "The filter you specified does not exist",
"abusefilter-edit-revert": "Revert actions taken by this filter",
"abusefilter-edit-tools": "Tools:",
"abusefilter-edit-test-link": "Test this filter against recent edits",
"abusefilter-edit-export": "Export this filter to another wiki",
"abusefilter-edit-syntaxok": "No syntax errors detected.",
"abusefilter-edit-syntaxerr": "Syntax error detected: $1",
"abusefilter-edit-warn-leave": "Leaving the page will cause you to lose any change made to this filter.",
"abusefilter-edit-bad-tags": "One or more of the tags you specified is not valid.\nTags should be short, they must not contain special characters, and they must not be reserved by other software. Try choosing a new tag name.",
"abusefilter-edit-notallowed": "You are not permitted to create or edit abuse filters",
"abusefilter-edit-notallowed-global": "You are not permitted to create or edit global abuse filters",
"abusefilter-edit-notallowed-global-custom-msg": "Custom warning or disallow messages are not supported for global filters",
"abusefilter-edit-invalid-warn-message": "The warning message cannot be left empty.",
"abusefilter-edit-invalid-disallow-message": "The disallow message cannot be left empty.",
"abusefilter-edit-invalid-throttlecount": "The throttle action count must be a positive integer.",
"abusefilter-edit-invalid-throttleperiod": "The throttle period must be a positive integer.",
"abusefilter-edit-empty-throttlegroups": "At least one throttle group must be selected.",
"abusefilter-edit-duplicated-throttlegroups": "Throttle groups cannot have duplicates.",
"abusefilter-edit-invalid-throttlegroups": "The specified throttle groups are not valid.",
"abusefilter-edit-invalid-group": "The specified filter group ('$1') is not valid.",
"abusefilter-edit-builder-select": "Select an option to add it at the cursor",
"abusefilter-edit-builder-group-op-arithmetic": "Arithmetic operators",
"abusefilter-edit-builder-op-arithmetic-addition": "Addition ($1)",
"abusefilter-edit-builder-op-arithmetic-subtraction": "Subtraction ($1)",
"abusefilter-edit-builder-op-arithmetic-multiplication": "Multiplication ($1)",
"abusefilter-edit-builder-op-arithmetic-divide": "Division ($1)",
"abusefilter-edit-builder-op-arithmetic-modulo": "Modulo ($1)",
"abusefilter-edit-builder-op-arithmetic-pow": "Power ($1)",
"abusefilter-edit-builder-group-op-comparison": "Comparison operators",
"abusefilter-edit-builder-op-comparison-equal": "Value equal to ($1)",
"abusefilter-edit-builder-op-comparison-equal-strict": "Value and type equal to ($1)",
"abusefilter-edit-builder-op-comparison-notequal": "Value not equal to ($1)",
"abusefilter-edit-builder-op-comparison-notequal-strict": "Value and type not equal to ($1)",
"abusefilter-edit-builder-op-comparison-lt": "Less than ($1)",
"abusefilter-edit-builder-op-comparison-gt": "Greater than ($1)",
"abusefilter-edit-builder-op-comparison-lte": "Less than or equal to ($1)",
"abusefilter-edit-builder-op-comparison-gte": "Greater than or equal to ($1)",
"abusefilter-edit-builder-group-op-bool": "Boolean operators",
"abusefilter-edit-builder-op-bool-not": "Not ($1)",
"abusefilter-edit-builder-op-bool-and": "And ($1)",
"abusefilter-edit-builder-op-bool-or": "Or ($1)",
"abusefilter-edit-builder-op-bool-xor": "XOR ($1)",
"abusefilter-edit-builder-group-misc": "Miscellaneous",
"abusefilter-edit-builder-misc-in": "contained in string ($1)",
"abusefilter-edit-builder-misc-contains": "Left string contains right string ($1)",
"abusefilter-edit-builder-misc-like": "Matches pattern ($1)",
"abusefilter-edit-builder-misc-stringlit": "String literal ($1)",
"abusefilter-edit-builder-misc-rlike": "Matches regex ($1)",
"abusefilter-edit-builder-misc-irlike": "Matches regex, case-insensitive ($1)",
"abusefilter-edit-builder-misc-tern": "Ternary operator ($1)",
"abusefilter-edit-builder-misc-cond": "Conditional ($1)",
"abusefilter-edit-builder-misc-cond-short": "Short conditional ($1)",
"abusefilter-edit-builder-group-funcs": "Functions",
"abusefilter-edit-builder-funcs-length": "String length ($1)",
"abusefilter-edit-builder-funcs-lcase": "To lower case ($1)",
"abusefilter-edit-builder-funcs-ucase": "To upper case ($1)",
"abusefilter-edit-builder-funcs-ccnorm": "Normalize confusable characters ($1)",
"abusefilter-edit-builder-funcs-ccnorm-contains-any": "Normalize and search a string for multiple substrings in OR mode ($1)",
"abusefilter-edit-builder-funcs-ccnorm-contains-all": "Normalize and search a string for multiple substrings in AND mode ($1)",
"abusefilter-edit-builder-funcs-rmdoubles": "Remove double-characters ($1)",
"abusefilter-edit-builder-funcs-specialratio": "Special characters / total characters ($1)",
"abusefilter-edit-builder-funcs-norm": "Normalize ($1)",
"abusefilter-edit-builder-funcs-count": "Number of times string X appears in string Y ($1)",
"abusefilter-edit-builder-funcs-rcount": "Number of times regex X appears in string Y ($1)",
"abusefilter-edit-builder-funcs-get_matches": "Array of regex matches within a text for each capturing group ($1)",
"abusefilter-edit-builder-funcs-rmwhitespace": "Remove whitespace ($1)",
"abusefilter-edit-builder-funcs-rmspecials": "Remove special characters ($1)",
"abusefilter-edit-builder-funcs-ip_in_range": "Is IP in range? ($1)",
"abusefilter-edit-builder-funcs-ip_in_ranges": "Is IP in any of the ranges? ($1)",
"abusefilter-edit-builder-funcs-contains-any": "Search string for multiple substrings in OR mode ($1)",
"abusefilter-edit-builder-funcs-contains-all": "Search string for multiple substrings in AND mode ($1)",
"abusefilter-edit-builder-funcs-equals-to-any": "Check if a given argument is equal (===) to any of the following arguments ($1)",
"abusefilter-edit-builder-funcs-substr": "Substring ($1)",
"abusefilter-edit-builder-funcs-strpos": "Position of substring in string ($1)",
"abusefilter-edit-builder-funcs-str_replace": "Replace substring with string ($1)",
"abusefilter-edit-builder-funcs-str_replace_regexp": "Regular expression search and replace ($1)",
"abusefilter-edit-builder-funcs-rescape": "Escape string as literal in regex ($1)",
"abusefilter-edit-builder-funcs-set_var": "Set variable ($1)",
"abusefilter-edit-builder-funcs-sanitize": "Normalize HTML entities into unicode characters ($1)",
"abusefilter-edit-builder-group-vars": "Variables",
"abusefilter-edit-builder-vars-timestamp": "Unix timestamp of change ($1)",
"abusefilter-edit-builder-vars-accountname": "Account name on account creation ($1)",
"abusefilter-edit-builder-vars-action": "Action ($1)",
"abusefilter-edit-builder-vars-addedlines": "Lines added in edit ($1)",
"abusefilter-edit-builder-vars-delta": "Size change in edit ($1)",
"abusefilter-edit-builder-vars-diff": "Unified diff of changes made by edit ($1)",
"abusefilter-edit-builder-vars-newsize": "New page size ($1)",
"abusefilter-edit-builder-vars-oldsize": "Old page size ($1)",
"abusefilter-edit-builder-vars-new-content-model": "New content model ($1)",
"abusefilter-edit-builder-vars-old-content-model": "Old content model ($1)",
"abusefilter-edit-builder-vars-removedlines": "Lines removed in edit ($1)",
"abusefilter-edit-builder-vars-summary": "Edit summary/reason ($1)",
"abusefilter-edit-builder-vars-page-id": "Page ID ($1)",
"abusefilter-edit-builder-vars-page-ns": "Page namespace ($1)",
"abusefilter-edit-builder-vars-page-title": "Page title without namespace ($1)",
"abusefilter-edit-builder-vars-page-prefixedtitle": "Full page title ($1)",
"abusefilter-edit-builder-vars-page-age": "Page age in seconds ($1)",
"abusefilter-edit-builder-vars-page-last-edit-age": "Time since last page edit in seconds ($1)",
"abusefilter-edit-builder-vars-movedfrom-id": "Page ID of move source page ($1)",
"abusefilter-edit-builder-vars-movedfrom-ns": "Namespace of move source page ($1)",
"abusefilter-edit-builder-vars-movedfrom-title": "Title of move source page ($1)",
"abusefilter-edit-builder-vars-movedfrom-prefixedtitle": "Full title of move source page ($1)",
"abusefilter-edit-builder-vars-movedfrom-age": "Move source page age in seconds ($1)",
"abusefilter-edit-builder-vars-movedfrom-last-edit-age": "Time since last move source page edit in seconds ($1)",
"abusefilter-edit-builder-vars-movedto-id": "Page ID of move destination page ($1)",
"abusefilter-edit-builder-vars-movedto-ns": "Namespace of move destination page ($1)",
"abusefilter-edit-builder-vars-movedto-title": "Title of move destination page ($1)",
"abusefilter-edit-builder-vars-movedto-prefixedtitle": "Full title of move destination page ($1)",
"abusefilter-edit-builder-vars-movedto-age": "Move destination page age in seconds ($1)",
"abusefilter-edit-builder-vars-movedto-last-edit-age": "Time since last move destination page edit in seconds ($1)",
"abusefilter-edit-builder-vars-user-editcount": "Edit count of the user ($1)",
"abusefilter-edit-builder-vars-user-age": "Age of the user account ($1)",
"abusefilter-edit-builder-vars-user-name": "Name of the user account ($1)",
"abusefilter-edit-builder-vars-user-type": "Type of the user account ($1)",
"abusefilter-edit-builder-vars-user-groups": "Groups (including implicit) the user is in ($1)",
"abusefilter-edit-builder-vars-user-rights": "Rights that the user has ($1)",
"abusefilter-edit-builder-vars-user-blocked": "Whether the user is blocked ($1)",
"abusefilter-edit-builder-vars-user-emailconfirm": "Time email address was confirmed ($1)",
"abusefilter-edit-builder-vars-old-wikitext": "Old page wikitext, before the edit ($1)",
"abusefilter-edit-builder-vars-new-wikitext": "New page wikitext, after the edit ($1)",
"abusefilter-edit-builder-vars-added-links": "All external links added in the edit ($1)",
"abusefilter-edit-builder-vars-removed-links": "All external links removed in the edit ($1)",
"abusefilter-edit-builder-vars-all-links": "All external links in the new text ($1)",
"abusefilter-edit-builder-vars-new-pst": "New page wikitext, pre-save transformed ($1)",
"abusefilter-edit-builder-vars-diff-pst": "Unified diff of changes made by edit, pre-save transformed ($1)",
"abusefilter-edit-builder-vars-addedlines-pst": "Lines added in edit, pre-save transformed ($1)",
"abusefilter-edit-builder-vars-new-text": "New page text, stripped of any markup ($1)",
"abusefilter-edit-builder-vars-new-html": "Parsed HTML source of the new revision ($1)",
"abusefilter-edit-builder-vars-restrictions-edit": "Edit protection level of the page ($1)",
"abusefilter-edit-builder-vars-restrictions-move": "Move protection level of the page ($1)",
"abusefilter-edit-builder-vars-restrictions-create": "Create protection of the page ($1)",
"abusefilter-edit-builder-vars-restrictions-upload": "Upload protection of the file ($1)",
"abusefilter-edit-builder-vars-recent-contributors": "Last ten users to contribute to the page ($1)",
"abusefilter-edit-builder-vars-first-contributor": "First user to contribute to the page ($1)",
"abusefilter-edit-builder-vars-movedfrom-restrictions-edit": "Edit protection level of move source page ($1)",
"abusefilter-edit-builder-vars-movedfrom-restrictions-move": "Move protection level of move source page ($1)",
"abusefilter-edit-builder-vars-movedfrom-restrictions-create": "Create protection of move source page ($1)",
"abusefilter-edit-builder-vars-movedfrom-restrictions-upload": "Upload protection of move source file ($1)",
"abusefilter-edit-builder-vars-movedfrom-recent-contributors": "Last ten users to contribute to move source page ($1)",
"abusefilter-edit-builder-vars-movedfrom-first-contributor": "First user to contribute to move source page ($1)",
"abusefilter-edit-builder-vars-movedto-restrictions-edit": "Edit protection level of move destination page ($1)",
"abusefilter-edit-builder-vars-movedto-restrictions-move": "Move protection level of move destination page ($1)",
"abusefilter-edit-builder-vars-movedto-restrictions-create": "Create protection of move destination page ($1)",
"abusefilter-edit-builder-vars-movedto-restrictions-upload": "Upload protection of move destination file ($1)",
"abusefilter-edit-builder-vars-movedto-recent-contributors": "Last ten users to contribute to move destination page ($1)",
"abusefilter-edit-builder-vars-movedto-first-contributor": "First user to contribute to move destination page ($1)",
"abusefilter-edit-builder-vars-old-links": "Links in the page, before the edit ($1)",
"abusefilter-edit-builder-vars-file-sha1": "SHA1 hash of file contents ($1)",
"abusefilter-edit-builder-vars-file-size": "Size of the file in bytes ($1)",
"abusefilter-edit-builder-vars-file-mime": "MIME type of the file ($1)",
"abusefilter-edit-builder-vars-file-mediatype": "Media type of the file ($1)",
"abusefilter-edit-builder-vars-file-width": "Width of the file in pixels ($1)",
"abusefilter-edit-builder-vars-file-height": "Height of the file in pixels ($1)",
"abusefilter-edit-builder-vars-file-bits-per-channel": "Bits per color channel of the file ($1)",
"abusefilter-edit-builder-vars-wiki-name": "Database name of the wiki ($1)",
"abusefilter-edit-builder-vars-wiki-language": "Language code of the wiki ($1)",
"abusefilter-edit-builder-vars-old-text": "Old page text, stripped of any markup (no longer in use)",
"abusefilter-edit-builder-vars-old-html": "Old page wikitext, parsed into HTML (no longer in use)",
"abusefilter-edit-builder-vars-minor-edit": "Whether or not the edit is marked as minor (no longer in use)",
"abusefilter-edit-builder-vars-timestamp-expanded": "Timestamp of the log",
"abusefilter-filter-log": "Recent filter changes",
"abusefilter-history": "Change history for Abuse Filter #$1",
"abusefilter-history-foruser": "Changes by $1",
"abusefilter-history-hidden": "Hidden",
"abusefilter-history-enabled": "Enabled",
"abusefilter-history-global": "Global",
"abusefilter-history-timestamp": "Time",
"abusefilter-history-user": "User",
"abusefilter-history-public": "Public filter description",
"abusefilter-history-flags": "Flags",
"abusefilter-history-filter": "Filter rule",
"abusefilter-history-comments": "Comments",
"abusefilter-history-actions": "Actions",
"abusefilter-history-backedit": "Filter editor",
"abusefilter-history-deleted": "Deleted",
"abusefilter-history-filterid": "Filter",
"abusefilter-history-select-legend": "Refine search",
"abusefilter-history-select-user": "User:",
"abusefilter-history-select-filter": "Filter ID:",
"abusefilter-history-select-submit": "Refine",
"abusefilter-history-diff": "Changes",
"abusefilter-history-error-hidden": "The filter you requested is hidden, and you cannot view its history.",
"abusefilter-exception-unexpectedatend": "Unexpected \"$2\" at character $1.",
"abusefilter-exception-expectednotfound": "Expected a $2 at character $1, not found (found $3 $4 instead).",
"abusefilter-exception-unrecognisedkeyword": "Unrecognized keyword $2 at character $1.",
"abusefilter-exception-unexpectedtoken": "Unexpected token \"$3\" (of type $2) at character $1.",
"abusefilter-exception-unclosedstring": "Unclosed string starting at character $1.",
"abusefilter-exception-invalidoperator": "Invalid operator \"$2\" at character $1.",
"abusefilter-exception-unrecognisedtoken": "Unrecognized token \"$2\" at character $1.",
"abusefilter-exception-noparams": "No parameters given to function \"$2\" at character $1.\nExpected $3 {{PLURAL:$3|argument|arguments}}.",
"abusefilter-exception-dividebyzero": "Illegal attempt to divide $2 by zero at character $1.",
"abusefilter-exception-unrecognisedvar": "Unrecognized variable $2 at character $1.",
"abusefilter-exception-notenoughargs": "Not enough arguments to function $2 called at character $1.\nExpected $3 {{PLURAL:$3|argument|arguments}}, got $4",
"abusefilter-exception-toomanyargs": "Too many arguments to function $2 called at character $1.\nExpected at most $3 {{PLURAL:$3|argument|arguments}}, got $4",
"abusefilter-exception-regexfailure": "Error in regular expression \"$2\" at character $1.",
"abusefilter-exception-overridebuiltin": "Illegal overriding of built-in identifier \"$2\" at character $1.",
Add a static analyzer for the filter language This commit adds a class AFPSyntaxChecker which can statically analyze a filter code to detect the following errors: - unbound variables (which comes in two modes: conservative and liberal, default to conservative) - unused variables (disabled by default for compatibilty) - assignment on built-in identifiers - function application's arity mismatch - function application's invalid function name - non-string literal in the first argument of set / set_var The existing parser and evaluator are modified as follows: - The new (caching) evaluator no longer needs to perform variable hoisting at runtime. - Note that for array assignment, this changes the semantics. - The new parser is more lenient, reducing parsing errors. The static analyzer will catch these errors instead, allowing us to give a much better error message and reduces the complexity of the parser. * The parser now allows function name to be any identifier. * The parser now allows arity mismatch to occur. * The parser now allows the first argument of set to be any expression. Concretely, obvious changes that users will see are: 1. a := [1]; false & (a[] := 2); a[0] === 1 would evaluate to true, while it used to evaluate to the undefined value due to hoisting 2. f(1) will now error with 'f is not a valid function' as opposed to 'Unexpected "T_BRACE"' 3. length will now error with 'Illegal use of built-in identifier "length"' as opposed to 'Expected a (' Appendix: conservative and liberal mode The conservative mode is completely compatible with the current evaluator. That is, false & (a := 1); a will not deem `a` as unbound, though this is actually undesirable because `a` would then be bound to the troublesome undefined value. The liberal mode rejects the above pattern by deeming `a` as unbound. However, it also rejects true & (a := 1); a even though (a := 1) is always executed. Since there are several filters in Wikimedia projects that rely on this behavior, we default the mode to conservative for now. Note that even the liberal mode doesn't really respect lexical scope appeared in some other programming languages (see also T234690). For instance: (if true then (a := 1) else (a := 2) end); a would be accepted by the liberal checker, even though under lexical scope, `a` would be unbound. However, it is unlikely that lexical scope will be suitable for the filter language, as most filters in Wikimedia projects that have user-defined variable do violate lexical scope. Bug: T260903 Bug: T238709 Bug: T237610 Bug: T234690 Bug: T231536 Change-Id: Ic6d030503e554933f8d220c6f87b680505918ae2
2019-11-20 07:09:41 +00:00
"abusefilter-exception-usebuiltin": "Illegal use of built-in identifier \"$2\" at character $1.",
"abusefilter-exception-outofbounds": "Requesting non-existent array item $2 (array size = $3) at character $1.",
"abusefilter-exception-negativeindex": "Negative indexes are not allowed in arrays. Got index \"$2\" at character $1.",
"abusefilter-exception-notarray": "Requesting array item of non-array at character $1.",
"abusefilter-exception-unclosedcomment": "Unclosed comment at character $1.",
"abusefilter-exception-invalidiprange": "Invalid IP range \"$2\" provided at character $1.",
"abusefilter-exception-disabledvar": "Variable $2 at character $1 is no longer in use.",
"abusefilter-exception-variablevariable": "set and set_var expect the first argument to be a string literal, found at character $1.",
Add a static analyzer for the filter language This commit adds a class AFPSyntaxChecker which can statically analyze a filter code to detect the following errors: - unbound variables (which comes in two modes: conservative and liberal, default to conservative) - unused variables (disabled by default for compatibilty) - assignment on built-in identifiers - function application's arity mismatch - function application's invalid function name - non-string literal in the first argument of set / set_var The existing parser and evaluator are modified as follows: - The new (caching) evaluator no longer needs to perform variable hoisting at runtime. - Note that for array assignment, this changes the semantics. - The new parser is more lenient, reducing parsing errors. The static analyzer will catch these errors instead, allowing us to give a much better error message and reduces the complexity of the parser. * The parser now allows function name to be any identifier. * The parser now allows arity mismatch to occur. * The parser now allows the first argument of set to be any expression. Concretely, obvious changes that users will see are: 1. a := [1]; false & (a[] := 2); a[0] === 1 would evaluate to true, while it used to evaluate to the undefined value due to hoisting 2. f(1) will now error with 'f is not a valid function' as opposed to 'Unexpected "T_BRACE"' 3. length will now error with 'Illegal use of built-in identifier "length"' as opposed to 'Expected a (' Appendix: conservative and liberal mode The conservative mode is completely compatible with the current evaluator. That is, false & (a := 1); a will not deem `a` as unbound, though this is actually undesirable because `a` would then be bound to the troublesome undefined value. The liberal mode rejects the above pattern by deeming `a` as unbound. However, it also rejects true & (a := 1); a even though (a := 1) is always executed. Since there are several filters in Wikimedia projects that rely on this behavior, we default the mode to conservative for now. Note that even the liberal mode doesn't really respect lexical scope appeared in some other programming languages (see also T234690). For instance: (if true then (a := 1) else (a := 2) end); a would be accepted by the liberal checker, even though under lexical scope, `a` would be unbound. However, it is unlikely that lexical scope will be suitable for the filter language, as most filters in Wikimedia projects that have user-defined variable do violate lexical scope. Bug: T260903 Bug: T238709 Bug: T237610 Bug: T234690 Bug: T231536 Change-Id: Ic6d030503e554933f8d220c6f87b680505918ae2
2019-11-20 07:09:41 +00:00
"abusefilter-exception-unknownfunction": "$2 is not a valid function at character $1.",
"abusefilter-exception-unusedvars": "The following variables are unused: $2.",
"abusefilter-parser-warning-match-empty-regex": "This regular expression matches the empty string, at character $1",
"abusefilter-action-tag": "Tag",
"abusefilter-action-throttle": "Throttle",
"abusefilter-action-warn": "Warn",
"abusefilter-action-blockautopromote": "Block autopromote",
"abusefilter-action-block": "Block",
"abusefilter-action-degroup": "Remove from groups",
"abusefilter-action-rangeblock": "Range-block",
"abusefilter-action-disallow": "Disallow",
"abusefilter-revert-title": "Revert all changes by filter $1",
"abusefilter-revert-intro": "This form allows you to revert all changes made by the abuse filter due to filter $1.\nPlease exercise care in using this tool.",
"abusefilter-revert-preview-item": "$1: $2 {{GENDER:$7|made}} a $3 on $4.\nActions to be reverted: $5 ($6)",
"abusefilter-revert-search-legend": "Select abuse filter actions to be reverted",
"abusefilter-revert-periodstart": "Period start:",
"abusefilter-revert-periodend": "Period end:",
"abusefilter-revert-search": "Select actions",
"abusefilter-revert-filter": "Filter ID:",
"abusefilter-revert-preview-no-results": "The query did not find any actions that could be reverted.",
"abusefilter-revert-preview-intro": "Below are the actions taken by the abuse filter that will be reverted by this action.\nPlease check them carefully, and click \"{{int:abusefilter-revert-confirm}}\" to confirm your selection.",
"abusefilter-revert-confirm-legend": "Confirm the revert",
"abusefilter-revert-confirm": "Confirm",
"abusefilter-revert-success": "You have reverted all actions taken by the abuse filter due to [[Special:AbuseFilter/$1|filter $2]].",
"abusefilter-revert-reason": "Automatic revert of all actions taken by the abuse filter due to filter $1.\nReason given: $2",
"abusefilter-revert-reasonfield": "Reason:",
"abusefilter-test": "Test a filter against previous edits",
"abusefilter-test-intro": "This page allows you to check a filter entered in the box below against the last $1 {{PLURAL:$1|change|changes}}.\nTo load an existing filter, type its filter ID into the box below the edit textbox, and click the \"{{int:abusefilter-test-load}}\" button.",
"abusefilter-test-rules-section": "Rules to test",
"abusefilter-test-options-section": "Search options",
"abusefilter-test-legend": "Filter testing",
"abusefilter-test-load-filter": "Load filter ID:",
"abusefilter-test-submit": "Test",
"abusefilter-test-load": "Load",
"abusefilter-test-user": "Changes by user:",
"abusefilter-test-nobots": "Hide bot edits",
"abusefilter-test-period-start": "Changes made after:",
"abusefilter-test-period-end": "Changes made before:",
"abusefilter-test-page": "Changes made to page:",
"abusefilter-test-shownegative": "Show changes that do not match the filter",
"abusefilter-test-syntaxerr": "The filter you entered contained a syntax error.\nYou can receive a full explanation by clicking the \"{{int:abusefilter-edit-check}}\" button.",
"abusefilter-test-action": "Action type:",
"abusefilter-test-search-type-all": "All actions",
"abusefilter-test-search-type-edit": "Edits",
"abusefilter-test-search-type-move": "Moves",
"abusefilter-test-search-type-delete": "Deletions",
"abusefilter-test-search-type-upload": "Uploads",
"abusefilter-test-search-type-createaccount": "Account creations",
"abusefilter-changeslist-examine": "examine",
"abusefilter-examine": "Examine individual changes",
"abusefilter-examine-intro": "This page allows you to examine the variables generated by the Abuse Filter for an individual change, and test it against filters.",
"abusefilter-examine-intro-examine-only": "This page allows you to examine the variables generated by the Abuse Filter for an individual change.",
"abusefilter-examine-legend": "Select changes",
"abusefilter-examine-submit": "Search",
"abusefilter-examine-vars": "Variables generated for this change",
"abusefilter-examine-test": "Test this change against a filter",
"abusefilter-examine-test-button": "Test filter",
"abusefilter-examine-match": "The filter matched this change.",
"abusefilter-examine-nomatch": "The filter did not match this change.",
"abusefilter-examine-syntaxerror": "The filter has invalid syntax",
"abusefilter-examine-notfound": "The change you requested could not be found.",
"abusefilter-examine-incompatible": "The change you requested is not supported by the Abuse Filter",
"abusefilter-examine-noresults": "No results were found for the search parameters you provided.",
"abusefilter-topnav": "'''Abuse Filter navigation'''",
"abusefilter-topnav-home": "Home",
"abusefilter-topnav-recentchanges": "Recent filter changes",
"abusefilter-topnav-test": "Batch testing",
"abusefilter-topnav-examine": "Examine past edits",
"abusefilter-topnav-log": "Abuse log",
"abusefilter-topnav-tools": "Debugging tools",
"abusefilter-log-name": "Abuse filter log",
"abusefilter-log-header": "This log shows a summary of changes made to filters.\nFor full details, see [[Special:AbuseFilter/history|the list]] of recent filter changes.",
"abusefilter-logentry-create": "$1 {{GENDER:$2|created}} $4 ($5)",
"abusefilter-logentry-modify": "$1 {{GENDER:$2|modified}} $4 ($5)",
"abusefilter-log-invalid-filter": "Some of the specified filter IDs are invalid.",
"abusefilter-log-noresults": "No results",
"abusefilter-diff-title": "Differences between versions",
"abusefilter-diff-item": "Item",
"abusefilter-diff-version": "Version from $1 {{GENDER:$3|by}} $2",
"abusefilter-diff-info": "Basic information",
"abusefilter-diff-pattern": "Filter conditions",
"abusefilter-diff-invalid": "Unable to fetch the requested versions",
"abusefilter-diff-backhistory": "Filter history",
"abusefilter-diff-prev": "Older change",
"abusefilter-diff-next": "Newer change",
"abusefilter-import-intro": "You can use this interface to import filters from other wikis.\nOn the source wiki, click \"{{int:abusefilter-edit-export}}\" under \"{{int:abusefilter-edit-tools}}\" on the editing interface.\nCopy from the textbox that appears, and paste it into this textbox, then click \"{{int:abusefilter-import-submit}}\".",
"abusefilter-import-submit": "Import data",
"abusefilter-import-invalid-data": "The data you tried to import is not valid",
"abusefilter-group-default": "Default",
"abusefilter-http-error": "An HTTP error occurred: $1.",
"abusefilter-view-privatedetails-submit": "View private details",
"abusefilter-view-privatedetails-legend": "View private details",
"abusefilter-view-privatedetails-reason": "Reason for accessing private details:",
"abusefilter-log-details-id": "Log ID",
"abusefilter-invalid-request": "Invalid request! You must access private log details through the form on [[Special:AbuseLog/$1]] and provide a reason.",
"abusefilter-invalid-request-noid": "Invalid request! You must access private log details through the form on the abuse log details page and provide a reason.",
"blockedexternaldomains": "Blocked External Domains",
"abusefilter-blocked-domains-title": "Blocked External Domains",
"abusefilter-blocked-domains-intro": "External links matching this list will be blocked when added to a page. These domains are stored in [[MediaWiki:BlockedExternalDomains.json]].",
"abusefilter-blocked-domains-add-heading": "Add a new blocked domain",
"abusefilter-blocked-domains-add-explanation": "Here you can add a domain to the list of blocked domains.",
"abusefilter-blocked-domains-domain": "Domain to block, such as wikipedia.org",
"abusefilter-blocked-domains-notes": "Notes",
"abusefilter-blocked-domains-add-submit": "Submit",
"abusefilter-blocked-domains-domain-header": "Domain",
"abusefilter-blocked-domains-notes-header": "Notes",
"abusefilter-blocked-domains-actions-header": "Actions",
"abusefilter-blocked-domains-addedby-header": "Added by",
"abusefilter-blocked-domains-remove": "remove",
"abusefilter-blocked-domains-remove-title": "Remove a blocked domain",
"abusefilter-blocked-domains-remove-explanation-initial": "On this page you can remove a blocked domain",
"abusefilter-blocked-domains-remove-reason": "Reason",
"abusefilter-blocked-domains-remove-submit": "Remove",
"abusefilter-blocked-domains-attempted": "The text you wanted to publish was blocked by our filter. The following domain is blocked from being added: $1",
"abusefilter-blocked-domains-json-error": "JSON should be an array",
"abusefilter-blocked-domains-invalid-entry": "Entry $1 in JSON is invalid - it should be an object with 'domain' and 'notes' fields only, both being strings",
"abusefilter-blocked-domains-domain-added-comment": "Add blocked external domain $1 with notes: $2",
"abusefilter-blocked-domains-domain-removed-comment": "Remove blocked external domain $1 with notes: $2",
"log-description-abusefilterprivatedetails": "This log shows a list of times when a user accessed the private details of an abuse log.",
"log-description-abusefilterblockeddomainhit": "These events track hits to blocked domains.",
"abusefilter-noreason": "Warning: To see the private details of this log, you must provide a reason.",
"abusefilter-log-ip-not-available": "Not Available",
"abusefilter-tag-reserved": "The <code>abusefilter-condition-limit</code> tag is reserved for internal use by AbuseFilter.",
"tag-abusefilter-condition-limit": "condition limit reached",
"tag-abusefilter-condition-limit-description": "Edits or other events that couldn't be checked by all active [[Special:AbuseFilter|abuse filters]] ([[mw:Extension:AbuseFilter/Conditions|help]]).",
"notification-header-throttle-filter": "Abuse filter $2 {{GENDER:$1|you}} recently edited was throttled.",
"notification-header-throttle-filter-actions": "The abuse filter $2 {{GENDER:$1|you}} recently edited had a high rate of matches and the following {{PLURAL:$4|action was|actions were}} automatically disabled: $3.",
"notification-header-throttle-filter-no-actions": "The abuse filter $2 {{GENDER:$1|you}} recently edited had a high rate of matches but no actions were automatically disabled.",
"notification-subject-throttle-filter": "An abuse filter {{GENDER:$1|you}} edited was throttled on {{SITENAME}}",
"notification-link-text-show-filter": "Show filter",
"right-abusefilter-modify-blocked-external-domains": "Create or modify what external domains are blocked from being linked",
"action-abusefilter-modify-blocked-external-domains": "create or modify what external domains are blocked from being linked",
"right-abusefilter-bypass-blocked-external-domains": "Bypass blocked external domains",
"action-abusefilter-bypass-blocked-external-domains": "bypass blocked external domain",
"abusefilter-blocked-domains-cannot-edit-directly": "Create or modify what external domains are blocked from being linked must be done through [[Special:BlockedExternalDomains|the special page]]."
}